|
使用爬山算法优化简单的数学函数 假设我们需要找到函数 𝑓(𝑥)=−𝑥^2+4𝑥的最大值。这是一个具有单个局部最大值的简单抛物线函数。 $ J' l9 Y, ~ p5 b; v8 p, J& k% Q
步骤 1: 定义目标函数 首先,定义我们需要优化的函数。在MATLAB中,我们可以创建一个函数来计算给定x值的 𝑓(𝑥)。  - function y = myFunction(x)
- . S+ U3 h. v, G( R7 Y0 N% D0 n5 F
- y = -x^2 + 4*x;( q' N. C; x\\" ?5 C
- end
步骤 2: 实现爬山算法 接着,实现爬山算法。我们从一个随机点开始,然后在每一步尝试移动到一个“邻居”点,如果那里的值更高,就移动到那里。  - function [bestX, bestY] = hillClimbing(func, initialX, stepSize, numIterations)4 M0 V! O7 G. v
- currentX = initialX;
- 2 {; `. {\\" V' {% e
- currentY = func(currentX);1 U: r/ H' e( ]3 c& L% l
- for i = 1:numIterations5 D. T2 A h, H- x
- % 尝试在两个方向上移动* Z6 L$ o% ~( X; T+ s
- newX = [currentX + stepSize, currentX - stepSize];& C5 ~, F7 }2 }, a; B) Z
- newY = [func(newX(1)), func(newX(2))]; V0 t; S/ K9 r3 J
- 9 _\\" Y7 C* q# y9 `8 f& y3 H4 H
- % 找出最好的移动方向* |+ Z! B3 v: s& F; x6 Z) w
- [maxY, idx] = max(newY);1 g0 I; z1 K- b% U1 k0 n
-
- + g6 e- L/ G/ n9 G
- % 如果找到了更好的解,则更新当前解+ t3 M/ F, f' W+ Z
- if maxY > currentY4 H0 a: O* @& N- E& {\\" k
- currentX = newX(idx);
- - G+ S\\" z; h8 P; c/ k ]' p2 R9 b& V
- currentY = maxY;) `8 C( k U$ }# D3 T8 Z3 q1 Q2 H
- else
- ! b5 R\\" M7 M0 ]8 d% H* c
- % 如果没有更好的解,结束搜索& o7 G6 e0 s F! o1 ?+ s
- break;
- . M8 m# u( k% D2 ^# I, x
- end! i: b1 Y+ ~: ~; Y! V$ F
- end# T/ @9 p6 Y0 p4 i* |- o- f) \8 `
- bestX = currentX;4 E1 U$ g* b5 t9 z
- bestY = currentY;( A9 Z7 N( ]8 ]- i
- end) ~- O6 ?9 z) U9 h\\" P/ `8 k
- [0 X0 \8 A; N\\" A9 w4 p! {) P2 M
- % 运行爬山算法+ x+ o1 W. K7 e$ c
- initialX = 0; % 初始点
- \\" D; r! E) j+ i- G\\" p( s9 v7 W' h5 S
- stepSize = 0.1; % 步长. N, X( {2 |. {- R5 c5 |
- numIterations = 100; % 迭代次数 d- l |5 V3 K, x\\" J' `$ ^$ o$ J
- [bestX, bestY] = hillClimbing(@myFunction, initialX, stepSize, numIterations);
步骤 3: 输出结果 展示算法找到的最优解。 - disp(['The maximum value of f(x) is found at x = ', num2str(bestX)]);% [* j; \6 F' |* J
- disp(['The maximum value of f(x) is ', num2str(bestY)]);
复制代码 步骤 4: 可视化 可视化函数和算法找到的最大值点,以更好地理解算法的行为。  - x = 0:0.01:5;
- 1 x5 } X3 C' S\\" t: T- m0 O
- y = myFunction(x);: J2 |! ^. A! C( `( Z3 p
- figure;$ W F, W$ W, C# u) |8 C
- plot(x, y, 'b-', bestX, bestY, 'ro');
- , b+ A; K8 Y/ ^\\" e2 k% d
- title('Function Optimization using Hill Climbing');& ]5 T/ n+ n' T9 m, K
- xlabel('x'); D, E4 W6 X' v7 ?
- ylabel('f(x)');
- 4 M\\" @\\" k3 Y2 B4 x* s3 {# \
- legend('Function', 'Maximum Point');
/ ~3 \/ G( U6 {7 u |