|
使用爬山算法优化简单的数学函数 假设我们需要找到函数 𝑓(𝑥)=−𝑥^2+4𝑥的最大值。这是一个具有单个局部最大值的简单抛物线函数。 # c g5 h8 Y, N2 i5 `9 j" S( l1 S
步骤 1: 定义目标函数 首先,定义我们需要优化的函数。在MATLAB中,我们可以创建一个函数来计算给定x值的 𝑓(𝑥)。  - function y = myFunction(x)
- 3 ~0 P* F7 P2 |( e
- y = -x^2 + 4*x; W$ }) m8 ]/ E- \
- end
步骤 2: 实现爬山算法 接着,实现爬山算法。我们从一个随机点开始,然后在每一步尝试移动到一个“邻居”点,如果那里的值更高,就移动到那里。  - function [bestX, bestY] = hillClimbing(func, initialX, stepSize, numIterations)
- 1 ?/ L# f\\" U9 U2 W; p @$ v% x. R
- currentX = initialX;
- 4 r+ }( _ V1 J
- currentY = func(currentX);0 a4 ]$ R* h7 }8 N- y
- for i = 1:numIterations/ n5 _: A' f( A8 s5 P) z* ~, G7 I
- % 尝试在两个方向上移动. d2 q4 d* L: x0 |6 U6 p, g$ Y
- newX = [currentX + stepSize, currentX - stepSize];
- , ^- A3 i( E) g8 `+ r8 X4 ^8 ?
- newY = [func(newX(1)), func(newX(2))]; A. u+ l3 Y$ O2 F3 d8 S
- * k4 f; ~* `$ I& q, A7 m
- % 找出最好的移动方向
- \\" M) x0 @/ A0 L- ?6 |+ `
- [maxY, idx] = max(newY);
- 3 v3 n' w( W, [3 s8 l. k$ i
- 6 C+ K5 Q! J+ d! c& V* m ~1 G7 W0 }
- % 如果找到了更好的解,则更新当前解6 D) K3 u& S- `! \
- if maxY > currentY1 Q8 k+ _, f! ^! A& ^\\" Q+ y5 ^
- currentX = newX(idx);( _, X6 K; P% t\\" g$ Y\\" b
- currentY = maxY;& V( o1 g* I; ]
- else
- 6 \+ T) t- Q\\" [ W) m, @
- % 如果没有更好的解,结束搜索$ C( [- B/ H0 z. D5 G) f
- break;
- 4 Y% f# F0 w2 x8 O5 C1 j\\" `
- end+ S* e/ c5 L+ X* g% y) R
- end9 {- m6 H% m x' u# i/ `
- bestX = currentX;
- 7 ?8 i# o3 }3 |/ [7 l
- bestY = currentY;
- \\" B$ q3 G0 _4 i1 B
- end, p# J1 t; O u* c0 ^1 H
- ' B\\" f8 F8 n* x/ D
- % 运行爬山算法9 _0 e+ r- X; Y/ c1 n
- initialX = 0; % 初始点
- 9 n4 c) q( A, u! N ~0 t, N
- stepSize = 0.1; % 步长* W# F( Z, {+ O
- numIterations = 100; % 迭代次数
- ( L! t5 s1 ]% Z; L
- [bestX, bestY] = hillClimbing(@myFunction, initialX, stepSize, numIterations);
步骤 3: 输出结果 展示算法找到的最优解。 - disp(['The maximum value of f(x) is found at x = ', num2str(bestX)]);2 d+ R1 y# T/ O% u
- disp(['The maximum value of f(x) is ', num2str(bestY)]);
复制代码 步骤 4: 可视化 可视化函数和算法找到的最大值点,以更好地理解算法的行为。  - x = 0:0.01:5;
- ; q5 `( b8 o: y' w
- y = myFunction(x);
- % R5 W* p7 h\\" y$ J\\" B7 I/ w
- figure;
- o# D& H\\" R4 p; k
- plot(x, y, 'b-', bestX, bestY, 'ro');+ i: W9 p3 k ]# Z* b9 W% k
- title('Function Optimization using Hill Climbing');
- , R3 w0 y* a. I: o0 G
- xlabel('x');
- * z H$ R; o0 s4 Y( i
- ylabel('f(x)');
- & g* R\\" O4 g& G1 O$ H$ G
- legend('Function', 'Maximum Point');
; G( O2 I% N1 y' ]" w! C& s
|