|
使用爬山算法优化简单的数学函数 假设我们需要找到函数 𝑓(𝑥)=−𝑥^2+4𝑥的最大值。这是一个具有单个局部最大值的简单抛物线函数。
6 a. V1 `" _& ?9 t步骤 1: 定义目标函数 首先,定义我们需要优化的函数。在MATLAB中,我们可以创建一个函数来计算给定x值的 𝑓(𝑥)。  - function y = myFunction(x)5 m/ \6 O* o) T! ~. R7 R; }' v
- y = -x^2 + 4*x;
- # R, q! [ E\\" b: Z7 X q\\" g
- end
步骤 2: 实现爬山算法 接着,实现爬山算法。我们从一个随机点开始,然后在每一步尝试移动到一个“邻居”点,如果那里的值更高,就移动到那里。  - function [bestX, bestY] = hillClimbing(func, initialX, stepSize, numIterations)3 G6 H\\" B% K8 l; [% l: Z
- currentX = initialX;
- U( n+ _. X/ X1 R/ w$ K3 M
- currentY = func(currentX);
- % b( b9 T9 C6 i7 a( j3 q
- for i = 1:numIterations0 D4 W9 P; A# p4 k$ u. P6 s
- % 尝试在两个方向上移动
- 2 c) F+ h+ K C7 ^' s
- newX = [currentX + stepSize, currentX - stepSize];
- + l\\" c3 z* Z+ n, P% U
- newY = [func(newX(1)), func(newX(2))];- {3 }) V! V! h6 e- |
- / K. I b2 k. y; e& E8 _7 M
- % 找出最好的移动方向* [4 o5 q! f. ?, C7 Z! ]
- [maxY, idx] = max(newY);' }: X, K+ o$ s' f5 N2 _. v
-
- ) _. h8 I5 {( [) O7 G
- % 如果找到了更好的解,则更新当前解
- ( k& K, j; L) _* H
- if maxY > currentY b$ K6 `4 G( b/ [
- currentX = newX(idx);5 M# G' x$ o2 b' G M c
- currentY = maxY;& M5 E2 P$ ^( c% X8 H4 A
- else
- 7 Z p4 L1 h' y1 O9 C; ?, T
- % 如果没有更好的解,结束搜索 ~- I9 N6 e: T$ P) n' J; j
- break;
- ; m: o% Y. G3 T/ G) B |; v
- end7 a1 u\\" z0 N4 s, G* t\\" K* v# W' ^
- end
- 7 N- ]+ [) y3 i O0 K! D
- bestX = currentX;
- 0 Z# a% [8 p6 G3 G5 s
- bestY = currentY;9 \. P1 `- V) R$ o( ?+ u
- end# x& N5 q$ L$ ]& ]7 @
-
- 5 ?& V3 Q( r& E% f\\" B- W0 ?
- % 运行爬山算法
- * y. D4 I: G# F' L3 C B\\" L
- initialX = 0; % 初始点2 c5 K* V1 s$ T9 X R0 N\\" `' Y! r9 t
- stepSize = 0.1; % 步长0 N/ l/ u$ n' V( J
- numIterations = 100; % 迭代次数; \0 s\\" e\\" l: v( q- x& J\\" m W
- [bestX, bestY] = hillClimbing(@myFunction, initialX, stepSize, numIterations);
步骤 3: 输出结果 展示算法找到的最优解。 - disp(['The maximum value of f(x) is found at x = ', num2str(bestX)]);
9 S/ n5 T, @% l1 e - disp(['The maximum value of f(x) is ', num2str(bestY)]);
复制代码 步骤 4: 可视化 可视化函数和算法找到的最大值点,以更好地理解算法的行为。  - x = 0:0.01:5;/ H! l. u5 z- F! |; g9 j
- y = myFunction(x);
- 4 F; h7 [9 ?- Y( S/ p% A
- figure;
- ( s# n$ c# J; n3 t. ^# |0 z* p( J; N- ?( |
- plot(x, y, 'b-', bestX, bestY, 'ro');& x# Z6 I6 i k( E& j
- title('Function Optimization using Hill Climbing');
- ' I, ^: w/ w8 K% l3 ]) [
- xlabel('x');
- 8 B4 m- X M6 t! Y
- ylabel('f(x)');
- ! O$ v) s9 q }# A3 l- k0 N
- legend('Function', 'Maximum Point');
+ Z9 q7 x9 T) w) \* Z+ ?% l2 d |