数学建模社区-数学中国

标题: 爬山算法 [打印本页]

作者: 2744557306    时间: 2024-4-26 15:44
标题: 爬山算法
使用爬山算法优化简单的数学函数

        假设我们需要找到函数 𝑓(𝑥)=−𝑥^2+4𝑥的最大值。这是一个具有单个局部最大值的简单抛物线函数。

7 U4 A" }' o. D
步骤 1: 定义目标函数

        首先,定义我们需要优化的函数。在MATLAB中,我们可以创建一个函数来计算给定x值的 𝑓(𝑥)。

  1. function y = myFunction(x)7 W1 t1 W  P+ |  k' L
  2.     y = -x^2 + 4*x;
    $ J0 K0 n3 |3 T( g
  3. end
复制代码
步骤 2: 实现爬山算法

        接着,实现爬山算法。我们从一个随机点开始,然后在每一步尝试移动到一个“邻居”点,如果那里的值更高,就移动到那里。

  1. function [bestX, bestY] = hillClimbing(func, initialX, stepSize, numIterations)
    / d. d* ]' G/ o, F3 K, l" P
  2.     currentX = initialX;. k" @! E5 {, C: o, {
  3.     currentY = func(currentX);
    0 Z1 n: \; f) `0 h/ p
  4.     for i = 1:numIterations) X! v6 I( \1 l9 H9 |5 K9 K
  5.         % 尝试在两个方向上移动: ~+ n0 j( }: T  K
  6.         newX = [currentX + stepSize, currentX - stepSize];
    " H: p& t& x4 n
  7.         newY = [func(newX(1)), func(newX(2))];
    ) s; K6 ^8 B7 x0 H: x1 m2 y
  8. 0 w; v* P  V& x
  9.         % 找出最好的移动方向2 n4 R# _; E; y
  10.         [maxY, idx] = max(newY);
    7 x+ U  |' O; l: |
  11.         ) e5 X" E8 p5 d0 N/ _: l. l5 \
  12.         % 如果找到了更好的解,则更新当前解
    8 p" g$ W/ X4 \  Q: k
  13.         if maxY > currentY4 P  J+ F6 O; X2 [5 _) s9 J
  14.             currentX = newX(idx);3 P$ r' P  Q0 W  W, r- ~
  15.             currentY = maxY;
    / V* U9 |# e- n* g: n& s  L3 m; {3 {
  16.         else- Z: F$ f$ f" W9 g0 d/ A
  17.             % 如果没有更好的解,结束搜索( o1 l, s  y. C) j/ }) ]7 Z" W% @
  18.             break;
    7 `, [' g% ?0 H/ D
  19.         end
    & A7 b0 w3 B- j, r
  20.     end7 S4 E* e! L$ g$ s$ W2 R* e' z
  21.     bestX = currentX;
    $ ^$ s# y% s8 W0 F8 M: }, W$ i
  22.     bestY = currentY;7 M' M' Q. X! s3 D8 Q( \  P1 ^% Z5 p, W
  23. end" q  p. c  Y% a) S4 \4 M
  24. + H' h% |& z* o/ a
  25. % 运行爬山算法2 }0 O- h- G! @. X& d
  26. initialX = 0; % 初始点2 d* l9 t4 p1 Y8 B# K3 E& h
  27. stepSize = 0.1; % 步长
    ; r3 ]* o8 Y: a/ F
  28. numIterations = 100; % 迭代次数
    # ^$ l! }2 s8 P
  29. [bestX, bestY] = hillClimbing(@myFunction, initialX, stepSize, numIterations);
复制代码
步骤 3: 输出结果

        展示算法找到的最优解。

  1. disp(['The maximum value of f(x) is found at x = ', num2str(bestX)]);
    ) N8 c+ i; C, ^: |* p  c/ B
  2. disp(['The maximum value of f(x) is ', num2str(bestY)]);
复制代码
步骤 4: 可视化

        可视化函数和算法找到的最大值点,以更好地理解算法的行为。

  1. x = 0:0.01:5;
    $ b5 I7 e+ w4 t) L/ j# R
  2. y = myFunction(x);. T& d9 N5 W+ ~& \: b
  3. figure;! _$ B! `+ o# [1 A
  4. plot(x, y, 'b-', bestX, bestY, 'ro');: A" O5 m8 B) c
  5. title('Function Optimization using Hill Climbing');! l# |. y- f) s9 u
  6. xlabel('x');8 O4 Z9 s# _; j  ~8 M5 w% P6 Q
  7. ylabel('f(x)');9 F- e3 `# s0 k% `! {, K, U; s
  8. legend('Function', 'Maximum Point');
复制代码
1 V% f3 o6 w& m4 w' e3 h





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5