|
使用爬山算法优化简单的数学函数 假设我们需要找到函数 𝑓(𝑥)=−𝑥^2+4𝑥的最大值。这是一个具有单个局部最大值的简单抛物线函数。
& i" ?1 n1 I* c, X$ y) c, w; t5 o( Z步骤 1: 定义目标函数 首先,定义我们需要优化的函数。在MATLAB中,我们可以创建一个函数来计算给定x值的 𝑓(𝑥)。  - function y = myFunction(x)+ A! h/ M9 |5 G9 }: l
- y = -x^2 + 4*x;
- % p- n. G9 h5 m: i
- end
步骤 2: 实现爬山算法 接着,实现爬山算法。我们从一个随机点开始,然后在每一步尝试移动到一个“邻居”点,如果那里的值更高,就移动到那里。  - function [bestX, bestY] = hillClimbing(func, initialX, stepSize, numIterations)
- % b7 a2 x/ Z( j* ~' I
- currentX = initialX;# E' G& ^& ]: B2 u4 r3 m
- currentY = func(currentX);0 T8 h' [3 V8 x, E7 u1 Y
- for i = 1:numIterations1 I5 ?+ [) k# d\\" P/ y' Z
- % 尝试在两个方向上移动1 Z7 e5 d0 a) m* W! J
- newX = [currentX + stepSize, currentX - stepSize];
- & K7 ~/ W& ^$ y
- newY = [func(newX(1)), func(newX(2))];
- ! A6 J. s4 D) n* ]5 V
- & v+ e4 x- U- H8 d' f7 F
- % 找出最好的移动方向! Y( c# j- U: d
- [maxY, idx] = max(newY);
- ) R0 B+ g3 \2 W( @- r, |
-
- ! n! M! l' h. p\\" }& P! I
- % 如果找到了更好的解,则更新当前解
- , o7 ~# Z/ _2 g. H% L9 a
- if maxY > currentY4 U; i, \; j) l* B
- currentX = newX(idx);
- . n( o1 S, D' [
- currentY = maxY;
- 1 Y! Y5 U. _1 W; U( R
- else
- % d9 ?- h% u# a1 U
- % 如果没有更好的解,结束搜索
- , }9 B6 h3 H2 e$ S4 e! L
- break;
- # m) Q8 ~* l, M' E9 x( \
- end
- B4 C4 n4 B9 \ J9 A. N; N
- end
- % H( i$ _. `8 n; v! J
- bestX = currentX;
- 9 W7 s! t4 y$ G- M, u1 U4 s
- bestY = currentY;
- 4 ^( `6 ]( o, b0 S3 k1 W7 D: K
- end. x- P/ N6 R& {% X8 c! E
-
- 1 u0 j! r# H( e7 D5 C$ p% \
- % 运行爬山算法
- 8 C: }8 _5 v& g
- initialX = 0; % 初始点
- / \) {+ p( \- S5 d: {5 I
- stepSize = 0.1; % 步长- `& b I1 F) ?4 @; ?0 S
- numIterations = 100; % 迭代次数
- 2 D6 n4 g1 A( |$ K. \* Z* q
- [bestX, bestY] = hillClimbing(@myFunction, initialX, stepSize, numIterations);
步骤 3: 输出结果 展示算法找到的最优解。 - disp(['The maximum value of f(x) is found at x = ', num2str(bestX)]);
5 G' D8 e$ h/ A8 y$ q) n I0 {. `8 M - disp(['The maximum value of f(x) is ', num2str(bestY)]);
复制代码 步骤 4: 可视化 可视化函数和算法找到的最大值点,以更好地理解算法的行为。  - x = 0:0.01:5;. [ k/ K, u* Q
- y = myFunction(x);
- 4 E1 x2 v7 d( m, A
- figure;
- 6 T$ g9 k* `\\" e\\" E: H. {
- plot(x, y, 'b-', bestX, bestY, 'ro');, A2 m6 L& S+ i' b9 I' `. }# t
- title('Function Optimization using Hill Climbing');
- 9 C( m& ?; Z: K; G
- xlabel('x');
- ! s- P d/ L$ N
- ylabel('f(x)');
- 6 V0 v7 h1 g; K6 D8 j# p8 f/ X
- legend('Function', 'Maximum Point');
6 w3 x/ d7 G( t: ]' |8 F ]1 k |