数学建模社区-数学中国

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

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

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

; G5 Z% e. w3 `' y
步骤 1: 定义目标函数

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

  1. function y = myFunction(x)
    : q8 J' i( w% w6 O  I8 I9 M# S
  2.     y = -x^2 + 4*x;
    . o. T! {$ a& W
  3. end
复制代码
步骤 2: 实现爬山算法

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

  1. function [bestX, bestY] = hillClimbing(func, initialX, stepSize, numIterations)
    # D, `- M- C& i% W* S
  2.     currentX = initialX;
    # Q/ ^' \1 Q  w0 L+ [& e2 i/ o
  3.     currentY = func(currentX);
    6 B. X' {* }) H& E) c: P1 B6 u
  4.     for i = 1:numIterations7 P- J! t6 l$ G
  5.         % 尝试在两个方向上移动
    0 `' {- V8 N0 W' u9 d( U( h% J- ^
  6.         newX = [currentX + stepSize, currentX - stepSize];
    # S8 m3 w1 c$ J+ y1 ], j# y7 R6 C
  7.         newY = [func(newX(1)), func(newX(2))];
    6 B; b9 a1 _4 H7 Z
  8. : \  M2 L( ~% P* ?. M
  9.         % 找出最好的移动方向) o( B3 @; z: q8 Q$ ~; R
  10.         [maxY, idx] = max(newY);+ _2 v4 O7 a& G
  11.         : C- L; L( ^/ `6 M1 G, S
  12.         % 如果找到了更好的解,则更新当前解
    ' k) M' D/ Y5 u) D; d
  13.         if maxY > currentY
    2 ?/ f. S& H0 n# s9 p- G6 D( o
  14.             currentX = newX(idx);0 A: I, T8 e. J: ~
  15.             currentY = maxY;. b$ D+ p+ E* Z: n; Z- ^, n
  16.         else8 r; u5 J6 K1 s, X* v
  17.             % 如果没有更好的解,结束搜索
    " ]! u) I, `  e" S
  18.             break;4 D4 O) Q$ V' @8 X
  19.         end1 J2 ^; m0 m5 ~' v+ I" E6 [- o
  20.     end* M  I  {. I" D  V
  21.     bestX = currentX;$ z, L; q8 N( k; P9 O$ |
  22.     bestY = currentY;3 G* g' x0 z4 F- Y0 k
  23. end% x  a3 \! p8 _3 m; o. D
  24. 5 ~' J- m9 }6 b2 o: d* D/ @% Q2 y& g3 m
  25. % 运行爬山算法
    9 H* k2 n6 |8 c5 [( {/ a
  26. initialX = 0; % 初始点$ `5 U; F9 ~5 t0 h8 g7 \3 A
  27. stepSize = 0.1; % 步长# J  r6 H# B/ ^& Q8 V! a
  28. numIterations = 100; % 迭代次数
    9 X+ {, U. T1 U- [3 o; C
  29. [bestX, bestY] = hillClimbing(@myFunction, initialX, stepSize, numIterations);
复制代码
步骤 3: 输出结果

        展示算法找到的最优解。

  1. disp(['The maximum value of f(x) is found at x = ', num2str(bestX)]);
    ; i- p# [7 R! z, r9 t/ }
  2. disp(['The maximum value of f(x) is ', num2str(bestY)]);
复制代码
步骤 4: 可视化

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

  1. x = 0:0.01:5;1 r5 Y  s& C' s1 O1 B
  2. y = myFunction(x);
    ; L/ T0 E9 I8 }, W9 E% k
  3. figure;- i# `1 Q& t( w% G& n( C
  4. plot(x, y, 'b-', bestX, bestY, 'ro');
    7 }( w" e$ V5 _  L& s. M8 N: b. O
  5. title('Function Optimization using Hill Climbing');$ h: u* x# s, [$ s' e' }8 E) Y
  6. xlabel('x');
    # v. k  L, W8 Q; Z
  7. ylabel('f(x)');
    % ^3 A3 a. r* K/ C) c7 N
  8. legend('Function', 'Maximum Point');
复制代码
! L1 ?" L  O9 ?) f2 M& [  u# w5 [





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