数学建模社区-数学中国

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

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

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


6 A$ j5 m5 \4 _1 H( j/ T; S2 P, [9 t步骤 1: 定义目标函数

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

  1. function y = myFunction(x)/ t  e# D7 Y" h9 o4 [
  2.     y = -x^2 + 4*x;2 E, g$ B  v# U% k& j
  3. end
复制代码
步骤 2: 实现爬山算法

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

  1. function [bestX, bestY] = hillClimbing(func, initialX, stepSize, numIterations)0 d4 \" C& P9 Q+ K( n; G
  2.     currentX = initialX;
    $ U- W7 @, g1 m* S- o6 S
  3.     currentY = func(currentX);
    - C9 f. `  f' t1 u% B4 p
  4.     for i = 1:numIterations
    1 _2 a5 a+ G3 w6 h4 W; K" t
  5.         % 尝试在两个方向上移动6 r& ^+ k6 R( |5 R' R( i, C
  6.         newX = [currentX + stepSize, currentX - stepSize];) d! @5 ]0 M! f
  7.         newY = [func(newX(1)), func(newX(2))];  m9 e" I( v0 Y/ ^7 C4 a. f
  8. $ R7 v. y. v$ ^1 |$ m
  9.         % 找出最好的移动方向$ z1 R" t3 e' m: m* }: e; |
  10.         [maxY, idx] = max(newY);; p) H6 u; ~% P5 A3 @8 M
  11.         
    ( b5 i( i6 F/ n
  12.         % 如果找到了更好的解,则更新当前解
    1 E4 n+ k+ d! @3 T
  13.         if maxY > currentY
    ! C  d& P! L/ @8 h, h1 N
  14.             currentX = newX(idx);
    7 \6 f; [5 N( ~: s. ^$ K! |
  15.             currentY = maxY;
    * x0 q2 ?2 a8 s( ?( |9 i# c! a' K, \
  16.         else7 r( X( b% _, g$ c  I! ^6 m; g2 v
  17.             % 如果没有更好的解,结束搜索' X6 Z6 b4 Z4 N2 s" R
  18.             break;
    4 S& a4 [+ J8 ~. F' M: {% a! E
  19.         end: b; j1 ~+ J" b5 [/ ^  k
  20.     end
    3 p. ~5 s, g7 `  O' p% b
  21.     bestX = currentX;
    2 P3 i, t' G2 Z1 q3 k4 D9 V! V2 b
  22.     bestY = currentY;' P( ]' Y7 ]% i& T5 F2 Q5 K. d# I; {2 q
  23. end( q! c( _% z' N9 P; X# a3 h3 g( B
  24. " _6 j. f/ b2 u' k
  25. % 运行爬山算法
    0 ?; H3 x2 Z) Z" B3 {) T
  26. initialX = 0; % 初始点4 W. q2 \' U- A% s- S! i8 Q( x
  27. stepSize = 0.1; % 步长% I" Q) D$ d' M5 W. h6 @; R; ~( e- i
  28. numIterations = 100; % 迭代次数
    " @' ~2 K. [; S; {8 H1 [2 \
  29. [bestX, bestY] = hillClimbing(@myFunction, initialX, stepSize, numIterations);
复制代码
步骤 3: 输出结果

        展示算法找到的最优解。

  1. disp(['The maximum value of f(x) is found at x = ', num2str(bestX)]);
    ) W3 ?5 x  `5 f
  2. disp(['The maximum value of f(x) is ', num2str(bestY)]);
复制代码
步骤 4: 可视化

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

  1. x = 0:0.01:5;
    4 h6 c% v0 c5 E  A6 b
  2. y = myFunction(x);
    5 m4 c. Y# L, u+ P' m% m- b
  3. figure;' R) j! a. V" n5 j7 [+ L6 x- L
  4. plot(x, y, 'b-', bestX, bestY, 'ro');
    2 w8 s0 l+ O, @. P
  5. title('Function Optimization using Hill Climbing');. p/ X6 W5 [6 S) l& F
  6. xlabel('x');
    4 X/ G9 U& M1 V1 }5 w, I. _
  7. ylabel('f(x)');
    ) ?5 Z' F& ~" |3 b1 G3 w
  8. legend('Function', 'Maximum Point');
复制代码
& r0 ?$ S: X7 `& I/ o





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