|
使用爬山算法优化简单的数学函数 假设我们需要找到函数 𝑓(𝑥)=−𝑥^2+4𝑥的最大值。这是一个具有单个局部最大值的简单抛物线函数。 0 C! B/ k: }, ?$ Q) m+ Y5 D
步骤 1: 定义目标函数 首先,定义我们需要优化的函数。在MATLAB中,我们可以创建一个函数来计算给定x值的 𝑓(𝑥)。  - function y = myFunction(x)
- / X; A& C H8 m# u% M
- y = -x^2 + 4*x;$ D$ {5 k$ V! i* ^4 \
- end
步骤 2: 实现爬山算法 接着,实现爬山算法。我们从一个随机点开始,然后在每一步尝试移动到一个“邻居”点,如果那里的值更高,就移动到那里。  - function [bestX, bestY] = hillClimbing(func, initialX, stepSize, numIterations)
- . P5 U# H4 l: J0 V) ]+ @
- currentX = initialX;
- 6 F: W% ~5 V8 D& s$ U, m
- currentY = func(currentX);
- 6 t% ]% C3 B5 v9 p
- for i = 1:numIterations* P\\" s p+ _+ E3 T Z7 A
- % 尝试在两个方向上移动
- b, [4 t- \' [/ Y- r& O
- newX = [currentX + stepSize, currentX - stepSize]; ?1 u! E, W* A' h7 `/ ?# s
- newY = [func(newX(1)), func(newX(2))];# D' i7 K# @' y5 ]- I\\" D2 m
- 7 }8 o/ f r. T1 C# @$ B2 \
- % 找出最好的移动方向
- : u! A8 o9 R- B6 p% W
- [maxY, idx] = max(newY);
- / S4 d2 i6 D6 p2 N\\" t# v7 |' R) o+ J
- ! J+ I0 r9 m y# n- Q K9 j
- % 如果找到了更好的解,则更新当前解6 u$ g! |3 a* g% I
- if maxY > currentY
- ; H9 Y$ k X5 a M% n$ |\\" ^ Y
- currentX = newX(idx);; V2 F6 T1 c1 O$ L2 J
- currentY = maxY;' h\\" i4 [0 s\\" M; t/ ~# k. @- \: W
- else, R- i9 d6 z8 S8 W& C
- % 如果没有更好的解,结束搜索. x% A8 R3 l2 U1 v; z, V9 M4 w+ @
- break;
- 2 j( e* ]8 E% V\\" E: p
- end
- ' k4 K7 N, b y3 O
- end* P- C2 d: z\\" T. O2 _) h/ {& O, Y3 }+ \
- bestX = currentX;! k6 L( w* o: S3 \
- bestY = currentY;, p4 { t; g3 U, I
- end
- , g5 j2 |: |% a8 `0 _3 C
- # ^\\" _% H& j% t- ^
- % 运行爬山算法0 f$ T# b* z6 U
- initialX = 0; % 初始点
- 5 [7 g8 a5 ]2 Z, l0 r& a
- stepSize = 0.1; % 步长9 e4 Q/ m+ `* W2 p$ i
- numIterations = 100; % 迭代次数( f; m3 _* g6 \: R. v' E% \5 l$ V
- [bestX, bestY] = hillClimbing(@myFunction, initialX, stepSize, numIterations);
步骤 3: 输出结果 展示算法找到的最优解。 - disp(['The maximum value of f(x) is found at x = ', num2str(bestX)]);
\" {% G( l' F9 j* z9 N a! V - disp(['The maximum value of f(x) is ', num2str(bestY)]);
复制代码 步骤 4: 可视化 可视化函数和算法找到的最大值点,以更好地理解算法的行为。  - x = 0:0.01:5;
- # t+ A8 P) X# u# G
- y = myFunction(x);: q6 ?) O/ ]7 ]6 W
- figure;! a9 I$ T( j* P
- plot(x, y, 'b-', bestX, bestY, 'ro');$ a8 v- R9 t2 @: M
- title('Function Optimization using Hill Climbing');5 Z. d5 X- R6 i8 l
- xlabel('x');
- % k/ Y l) p. `' Y9 [+ L
- ylabel('f(x)');. s6 g, ^! d0 p/ } ~
- legend('Function', 'Maximum Point');
$ ^3 a' x8 C2 w# w8 R6 Q& d
|