|
使用爬山算法优化简单的数学函数 假设我们需要找到函数 𝑓(𝑥)=−𝑥^2+4𝑥的最大值。这是一个具有单个局部最大值的简单抛物线函数。
5 r0 _0 W+ i" J6 @ I( G$ r: M% t步骤 1: 定义目标函数 首先,定义我们需要优化的函数。在MATLAB中,我们可以创建一个函数来计算给定x值的 𝑓(𝑥)。  - function y = myFunction(x)+ l( q' I5 e2 \. i; u: h3 P
- y = -x^2 + 4*x;9 T2 [* R9 z& V4 m' G0 I
- end
步骤 2: 实现爬山算法 接着,实现爬山算法。我们从一个随机点开始,然后在每一步尝试移动到一个“邻居”点,如果那里的值更高,就移动到那里。  - function [bestX, bestY] = hillClimbing(func, initialX, stepSize, numIterations)
- , ]+ f6 ?# b\\" B, H! r1 S4 y
- currentX = initialX;
- - N+ g- `# c( Q: Z! \$ k
- currentY = func(currentX);0 u7 m\\" a! o0 L# }\\" v* A; w8 S9 D
- for i = 1:numIterations
- 3 M1 w\\" {\\" g4 x! _6 y) n
- % 尝试在两个方向上移动, u c( \3 J* p. z, w& t8 |! [1 s
- newX = [currentX + stepSize, currentX - stepSize];
- ' I+ E. L c y/ P) t3 O' T0 U
- newY = [func(newX(1)), func(newX(2))];) g' M& L. U% t. A0 m! ]. V
-
- : w* c0 j! L& {6 R) Z$ g\\" n4 V
- % 找出最好的移动方向7 K8 z8 q: R1 D: Y2 B
- [maxY, idx] = max(newY);
- ( @1 J5 a, x# f: j/ |
- # K( m0 ^+ i2 C+ u) Y9 ?
- % 如果找到了更好的解,则更新当前解
- ! R: [9 T! j' B- L ?
- if maxY > currentY
- 4 k/ m _' X% q* N8 O\\" e
- currentX = newX(idx);
- 2 K* t1 `: a% [# U
- currentY = maxY;4 u\\" P. t( M2 D! E
- else
- 9 B& @# `( g' L% V: L- L
- % 如果没有更好的解,结束搜索1 O' m' o6 ?- Q* `
- break;
- 3 q& p) A* I5 a( m
- end
- # _1 Y+ p( d+ W) |$ H
- end8 C) h% A# p! {1 x
- bestX = currentX;1 `/ [: G9 P c% F
- bestY = currentY;
- ! M\\" }9 R; v5 q
- end
- - o2 W+ q* e4 o: t
-
- : n7 \1 ?. S# p5 v7 R
- % 运行爬山算法6 E! L4 f; [- k
- initialX = 0; % 初始点
- ! ~ n# P# Z/ J
- stepSize = 0.1; % 步长
- & C x, l6 J4 m2 B+ d( s
- numIterations = 100; % 迭代次数
- 8 m5 U% C, \0 `0 E( W7 y1 |/ F
- [bestX, bestY] = hillClimbing(@myFunction, initialX, stepSize, numIterations);
步骤 3: 输出结果 展示算法找到的最优解。 - disp(['The maximum value of f(x) is found at x = ', num2str(bestX)]);
4 K: M4 w/ L3 w, x! w2 t - disp(['The maximum value of f(x) is ', num2str(bestY)]);
复制代码 步骤 4: 可视化 可视化函数和算法找到的最大值点,以更好地理解算法的行为。  - x = 0:0.01:5;
- 1 u4 t: W' u2 G- e, ^6 S\\" s
- y = myFunction(x);% j\\" U$ t: m: o
- figure;2 d: W& ^) S\\" {+ I) c
- plot(x, y, 'b-', bestX, bestY, 'ro');( L+ y' T* s$ J/ U! T- k% `. s
- title('Function Optimization using Hill Climbing');0 V2 [- l g5 d+ ~* x1 y2 R
- xlabel('x');& ?0 Q5 E# K( J
- ylabel('f(x)');: r9 S- E9 ~' _- a8 T- N/ y5 {% G
- legend('Function', 'Maximum Point');
8 S/ F3 ]9 A% E3 G: _- u |