使用爬山算法优化简单的数学函数 假设我们需要找到函数 𝑓(𝑥)=−𝑥^2+4𝑥的最大值。这是一个具有单个局部最大值的简单抛物线函数。
5 t0 G- j4 X- R$ P, j7 O9 N步骤 1: 定义目标函数 首先,定义我们需要优化的函数。在MATLAB中,我们可以创建一个函数来计算给定x值的 𝑓(𝑥)。 - function y = myFunction(x)) j( R/ {7 ^2 `1 L! d# R
- y = -x^2 + 4*x;6 a8 o3 H1 v: q3 T, B+ L) ]
- end
步骤 2: 实现爬山算法 接着,实现爬山算法。我们从一个随机点开始,然后在每一步尝试移动到一个“邻居”点,如果那里的值更高,就移动到那里。 - function [bestX, bestY] = hillClimbing(func, initialX, stepSize, numIterations)) K2 X, M3 v+ N! V# t1 K
- currentX = initialX;1 b4 Q' q, G8 w
- currentY = func(currentX);
- $ K, y$ F& B5 z. V$ M( Q
- for i = 1:numIterations
- 8 z+ {( A1 w, y
- % 尝试在两个方向上移动
- ; d+ l! W; W+ M1 w5 Q T* a* Q9 O
- newX = [currentX + stepSize, currentX - stepSize];3 Q- ^( _8 q8 ]- d. n! ?2 i% t5 V
- newY = [func(newX(1)), func(newX(2))];
- + z: N! i9 e Y: H3 I9 P
-
- 4 Z4 }\\" O, @8 ~7 h, M& ^! w
- % 找出最好的移动方向7 g! i/ L, X: A5 g& H. H$ Y) q
- [maxY, idx] = max(newY);
- A0 e0 w% c& b: c# i\\" C( I
- ) k+ M1 v5 L% T# T. l\\" j' ?
- % 如果找到了更好的解,则更新当前解9 X I1 G4 P# K- o' E\\" ]
- if maxY > currentY2 j/ X# ^6 K# o% M
- currentX = newX(idx);
- ! a3 r3 a& I5 e7 u1 Z3 {/ y5 C w! n, W
- currentY = maxY;
- ) |$ q' V, z6 P5 l. N$ @, U
- else* E9 u3 Q$ i. H% R, Q
- % 如果没有更好的解,结束搜索
- 7 N: i\\" e7 l) R* W
- break;& D: I M0 e0 O4 u) u7 a
- end& j8 u6 Y, f\\" z9 ?
- end0 P+ c6 }+ f% ^
- bestX = currentX;' M8 r\\" W5 i W8 u y' G
- bestY = currentY;. z2 w! V. C\\" U+ f; k
- end
- 6 b: h% P/ J! A6 ?* w
-
- 3 h5 T# F( X: o/ t l* y2 B
- % 运行爬山算法6 n: _7 X1 N8 {4 I
- initialX = 0; % 初始点
- $ n1 J: ^0 A5 [! I! ^
- stepSize = 0.1; % 步长
- 3 V9 x; P! ^\\" ^8 v
- numIterations = 100; % 迭代次数7 d8 N- H3 w1 _0 s! V- P* v& w7 a
- [bestX, bestY] = hillClimbing(@myFunction, initialX, stepSize, numIterations);
步骤 3: 输出结果 展示算法找到的最优解。 - disp(['The maximum value of f(x) is found at x = ', num2str(bestX)]);\" f6 Z$ C4 E+ y% I
- disp(['The maximum value of f(x) is ', num2str(bestY)]);
复制代码 步骤 4: 可视化 可视化函数和算法找到的最大值点,以更好地理解算法的行为。 - x = 0:0.01:5;
- ! S* n- e5 J& X* E2 ^1 e: C9 p% a1 |+ D
- y = myFunction(x);
- 5 r. N/ u$ m5 i; q1 ~
- figure;
- n9 \% {5 x, a\\" x: u; S! c5 Q
- plot(x, y, 'b-', bestX, bestY, 'ro');& N6 k\\" g! [8 R/ K
- title('Function Optimization using Hill Climbing');& b) b z s2 O: M, J& q
- xlabel('x'); y) b5 e! [$ {6 }+ t2 b5 h
- ylabel('f(x)');8 I8 F- N9 Y% O
- legend('Function', 'Maximum Point');
6 p' X) r5 ]! K# E7 ?2 E9 I |