• 蚁群算法ACO求解连续函数问题


    例 2   求函数 f(x,y)=20(x^2-y^2)2-(1-y)^2-3(1+y)^2+0.3 的最小值,其中 x的取值范围为 [–5,5],y的取值范围为 [–5,5]。这是一个有多个局部极值的函数,其函数值图形如下图所示。

    解:仿真过程如下:

    (1)初始化蚂蚁个数 m = 20,最大迭代次数 G = 500,信息素蒸发系数 Rho = 0.9,转移概率常数 P0 = 0.2,局部搜索补偿 step = 0.1。

    (2)随机产生蚂蚁初始位置,计算适应度函数值,设为初始信息素,计算状态转移概率。

    (3)进行位置更新:当状态转移概率小于转移概率常数时,进行局部搜索;当状态转移概率大于转移概率常数时,进行全局搜索,产生新的蚂蚁位置,并利用边界吸收方式进行边界条件处理,将蚂蚁位置界定在取值范围内。

    (4)计算新的蚂蚁位置的适应度值,判断蚂蚁是否移动,更新信息素。

    (5)判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。

    1. %%
    2. clear all;
    3. close all;
    4. clc;
    5. m=20;
    6. G=200;
    7. Rho=0.9;
    8. P0=0.2;
    9. XMAX=5;
    10. XMIN=-5;
    11. YMAX=5;
    12. YMIN=-5;
    13. %%%%%设置蚂蚁初始位置
    14. for i=1:m
    15. X(i,1)=XMIN+(XMAX-XMIN)*rand;
    16. X(i,2)=YMIN+(YMAX-YMIN)*rand;
    17. Tau(i)=func(X(i,1),X(i,2));
    18. end
    19. step=0.1;
    20. for NC=1:G
    21. lamda=1/NC;%用于局部搜索
    22. [Tau_best,BestIndex]=min(Tau);
    23. %%%计算状态转移概率
    24. for i=1:m
    25. P(NC,i)=(Tau(BestIndex)-Tau(i))/Tau(BestIndex);%用best-so-far解约束蚂蚁移动
    26. end
    27. %%%位置更新
    28. for i=1:m
    29. %%%%%局部搜索___根据步长和lamda转移
    30. if P(NC,i)
    31. temp1=X(i,1)+(2*rand-1)*step*lamda;
    32. temp2=X(i,2)+(2*rand-1)*step*lamda;
    33. else
    34. %%%全局搜索__随机一个偏移量
    35. temp1=X(i,1)+(XMAX-XMIN)*(rand-0.5);
    36. temp2=X(i,2)+(YMAX-YMIN)*(rand-0.5);
    37. end
    38. %%%边界处理
    39. if temp1
    40. temp1=XMIN;
    41. end
    42. if temp1>XMAX
    43. temp1=XMAX;
    44. end
    45. if temp2
    46. temp2=YMIN;
    47. end
    48. if temp2>YMAX
    49. temp2=YMAX;
    50. end
    51. %%%%%%%判断蚂蚁是否移动
    52. if func(temp1,temp2)1),X(i,2))
    53. X(i,1)=temp1;
    54. X(i,2)=temp2;
    55. end
    56. end
    57. %%%%%%%%%%%%更新信息素
    58. for i=1:m
    59. Tau(i)=(1-Rho)*Tau(i)+func(X(i,1),X(i,2));
    60. end
    61. [value,index]=min(Tau);%Tau最小就是最优解????/
    62. trace(NC)=func(X(index,1),X(index,2));
    63. end
    64. [min_value,min_index]=min(Tau);
    65. minX=X(min_index,1)
    66. minY=X(min_index,2)
    67. minCalue=func(minX,minY);
    68. figure
    69. plot(trace)
    70. xlabel('搜索次数');
    71. ylabel('适应度值');
    72. title('适应度进化曲线')
    73. %%%%自适应度函数
    74. function value=func(x,y)
    75. value=20*(x^2-y^2)^2-(1-y)^2-3*(1+y)^2+0.3;
    76. end

  • 相关阅读:
    内存利用:迟来的blindless与逃不掉的exit漏洞
    Linux进程详解三:进程状态
    OrbbecSDK_ros关于imu数据的发布
    没有对象怎么面向对象编程呢?这份风趣幽默的图解面向对象编程你值得拥有!
    学习笔记20--汽车运动控制
    Windows远程桌面连接cpolar
    JavaScript(ES6)入门
    《痞子衡嵌入式半月刊》 第 72 期
    dubbo学习(一)-dubbo基于SPI思想的实现
    知识点5--CMS项目个人中心
  • 原文地址:https://blog.csdn.net/qq_54169998/article/details/126279304