|
使用爬山算法优化简单的数学函数 假设我们需要找到函数 𝑓(𝑥)=−𝑥^2+4𝑥的最大值。这是一个具有单个局部最大值的简单抛物线函数。
& |$ r' g$ F. t步骤 1: 定义目标函数 首先,定义我们需要优化的函数。在MATLAB中,我们可以创建一个函数来计算给定x值的 𝑓(𝑥)。  - function y = myFunction(x); W0 U% S* U' b- M2 x2 J
- y = -x^2 + 4*x;
- + [& t3 D0 a3 }$ C1 Z' G+ [0 @ ]
- end
步骤 2: 实现爬山算法 接着,实现爬山算法。我们从一个随机点开始,然后在每一步尝试移动到一个“邻居”点,如果那里的值更高,就移动到那里。  - function [bestX, bestY] = hillClimbing(func, initialX, stepSize, numIterations)- X6 e! m7 G6 [2 N% i/ |
- currentX = initialX;
- % C; a# |. |4 j+ _( T+ ^
- currentY = func(currentX);
- $ V9 v! w\\" W& |, H, E
- for i = 1:numIterations
- . c3 C4 G: A2 b\\" n
- % 尝试在两个方向上移动2 B1 Z& ^9 r5 \. Q
- newX = [currentX + stepSize, currentX - stepSize];
- : }) s! M- i( }* n; R4 V8 R
- newY = [func(newX(1)), func(newX(2))];
- 3 a3 P0 V2 ?$ V: W' H
- 1 ?% r2 q3 `$ Q% m& b* q( @# V9 G
- % 找出最好的移动方向% B( b: B& ~) M. ^8 T
- [maxY, idx] = max(newY);
- - @* p6 c3 T, R' v4 J; I
-
- ) w, i8 x; p7 Y+ |9 c
- % 如果找到了更好的解,则更新当前解. [. C\\" ]1 W! T% E2 o4 U9 C
- if maxY > currentY4 v7 F* H# y$ C4 I/ Z- T* L
- currentX = newX(idx);2 o% _$ @; W- X7 k* Z
- currentY = maxY;0 n) g' u8 E5 u8 d
- else) L+ p' w# T, ~( d' ?0 J% I
- % 如果没有更好的解,结束搜索0 M8 s% ?# X b2 a' t\\" O
- break;* t% [9 G: r, ~$ M% _# T# d, ~
- end8 w6 f; P9 a! Z( T9 x% |. v+ u S Q7 {
- end
- % ~2 i, d8 z8 {9 u9 |7 N, e; r
- bestX = currentX;
- + j' r' I# L6 J6 _% ?3 \: z
- bestY = currentY;9 P\\" w3 o2 z% Q( Z* r* S; N
- end
- 9 y( H8 q' k. l3 `
- ) E+ z9 `. D& E
- % 运行爬山算法
- # `' k- a% C: f7 d
- initialX = 0; % 初始点8 G+ z! |- @) H. Y; y7 M
- stepSize = 0.1; % 步长, t7 Q/ i7 w$ @, G4 K
- numIterations = 100; % 迭代次数
- 6 i0 r$ e% p7 ]4 H' @
- [bestX, bestY] = hillClimbing(@myFunction, initialX, stepSize, numIterations);
步骤 3: 输出结果 展示算法找到的最优解。 - disp(['The maximum value of f(x) is found at x = ', num2str(bestX)]);% ~7 V\" L& m9 I5 P: O
- disp(['The maximum value of f(x) is ', num2str(bestY)]);
复制代码 步骤 4: 可视化 可视化函数和算法找到的最大值点,以更好地理解算法的行为。  - x = 0:0.01:5;
- 7 o6 \/ v( t# b6 A0 K/ S
- y = myFunction(x);. g5 N7 u9 W1 L4 i$ J
- figure;2 y+ d8 h8 i. K. \: x
- plot(x, y, 'b-', bestX, bestY, 'ro');
- ! G0 H0 I0 o# h8 N1 g2 \7 Z9 D
- title('Function Optimization using Hill Climbing');5 {% X2 r3 F3 u) X( m8 \8 [
- xlabel('x');* ?4 F& ^# Q. B* n/ L/ W5 }
- ylabel('f(x)');
- 2 q! U: |( I& f j% J) K
- legend('Function', 'Maximum Point');
( Y; |2 c8 b4 I9 n" H |