码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 正余弦(SCO)优化算法(附完整Matlab代码,可直接复制))


    尊重他人劳动成果,请勿转载!

    有问题可留言或私信,看到了都会回复解答!

    其他算法请参考:

    1、粒子群(PSO)优化算法(附完整Matlab代码,可直接复制)https://blog.csdn.net/xinzhi1992/article/details/125730562?spm=1001.2014.3001.5502

    2、灰狼(GWO)优化算法(附完整Matlab代码,可直接复制)https://blog.csdn.net/xinzhi1992/article/details/125826933?spm=1001.2014.3001.5502

    3、正余弦(SCA)优化算法(附完整Matlab代码,可直接复制)https://blog.csdn.net/xinzhi1992/article/details/115359297?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22115359297%22%2C%22source%22%3A%22xinzhi1992%22%7D

    4、萤火虫(FA)优化算法(附完整Matlab代码,可直接复制)https://blog.csdn.net/xinzhi1992/article/details/126761617?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22126761617%22%2C%22source%22%3A%22xinzhi1992%22%7D5、果蝇(FOA)优化算法(附完整Matlab代码,可直接复制)https://blog.csdn.net/xinzhi1992/article/details/127649424

    正余弦算法是一种随机优化算法,原理简单,易于实现。其寻优过程可分为两个阶段:
    1、全局探索阶段:快速搜索空间中的可行区域。
    2、局部开发阶段:即局部寻优。
    其种群更新公式为:
    X_{i}^{t+1}=X_{i}^{t}+r_{1}*sin(r_2)*|r_3*P_{i}^{t}-X_{i}^{t}| (r_4<0.5)

    X_{i}^{t+1}=X_{i}^{t}+r_{1}*sin(r_2)*|r_3*P_{i}^{t}-X_{i}^{t}| (r_4\geqslant 0.5)

    r_1=a-t*\frac{a}{T}

    X_{i}^{t}为当前个体第i维第t代位置;

    P_{i}^{t}为当前全局最优解;

    r_1表示下一个解的位置区域在当前解和最优解之内或者之外,较小的r_1利于算法的局部开发、较大的r_1能提高算法的全局搜索能力;

    r_2为区间[0,2*pi]内的随机数;

    r_3为[0,2]之间的随机数;

    r_4为[0,1]之间的随机数,保证位置更新在正弦和余弦函数之间的平等切换;

    a恒等于2;

    T为最大迭代次数;

    t为当前迭代次数;

     Fig1.正余弦算法的全局搜索和局部搜索切换

    使用正余弦算法的寻优能力较差,很可能多次运行最优适应度值没有变化,多运行几次试试。

    正余弦算法的完整matlab代码如下:

    1. %pop——种群数量
    2. %dim——问题维度
    3. %ub——变量上界,[1,dim]矩阵
    4. %lb——变量下界,[1,dim]矩阵
    5. %fobj——适应度函数(指针)
    6. %MaxIter——最大迭代次数
    7. %Best_Pos——x的最佳值
    8. %Best_Score——最优适应度值
    9. clc;
    10. clear all;
    11. close all;
    12. pop=50;
    13. dim=2;
    14. ub=[10,10];
    15. lb=[-10,-10];
    16. MaxIter=100;
    17. fobj=@(x)fitness(x);%设置适应度函数
    18. [Best_Pos,Best_Score,IterCurve]=SCA(pop,dim,ub,lb,fobj,MaxIter);
    19. %…………………………………………绘图…………………………………………
    20. figure(1);
    21. plot(IterCurve,'r-','linewidth',2);
    22. grid on;
    23. title('正余弦算法迭代曲线');
    24. xlabel('迭代次数');
    25. ylabel('适应度值');
    26. %…………………………………… 结果显示……………………………………
    27. disp(['求解得到的x1,x2是:',num2str(Best_Pos(1)),' ',num2str(Best_Pos(2))]);
    28. disp(['最优解对应的函数:',num2str(Best_Score)]);
    29. %种群初始化函数
    30. function x=initialization(pop,ub,lb,dim)
    31. for i=1:pop
    32. for j=1:dim
    33. x(i,j)=(ub(j)-lb(j))*rand()+lb(j);
    34. end
    35. end
    36. end
    37. %种群越界调整函数
    38. function x=BoundrayCheck(x,ub,lb,dim)
    39. for i=1:size(x,1)
    40. for j=1:dim
    41. if x(i,j)>ub(j)
    42. x(i,j)=ub(j);
    43. end
    44. if x(i,j)<lb(j)
    45. x(i,j)=lb(j);
    46. end
    47. end
    48. end
    49. end
    50. %适应度函数,可根据自身需要调整
    51. function [Fitness]=fitness(x)
    52. Fitness=sum(x.^2);
    53. end
    54. %…………………………………………正余弦算法主体………………………………………
    55. function [Best_Pos,Best_Score,IterCurve]=SCA(pop,dim,ub,lb,fobj,MaxIter)
    56. a=2;
    57. x=initialization(pop,ub,lb,dim);%种群初始化
    58. Fitness=zeros(1,pop);%适应度值初始化
    59. for i=1:pop
    60. Fitness(i)=fobj(x(i,:));%计算适应度值
    61. end
    62. [SortFitness,Index]=sort(Fitness);
    63. Global_Best_Pos=x(Index(1),:);
    64. Global_Best_Score=SortFitness(1);
    65. for t=1:MaxIter
    66. r1=a-t*(a/MaxIter);%计算r1
    67. for i=1:pop
    68. for j=1:dim
    69. r2=rand()*(2*pi);
    70. r3=2*rand();
    71. r4=rand();
    72. if(r4<0.5)
    73. x(i,j)=x(i,j)+(r1*sin(r2)*abs(r3*Global_Best_Pos(j)-x(i,j)));%采用正弦更新位置
    74. else
    75. x(i,j)=x(i,j)+(r1*cos(r2)*abs(r3*Global_Best_Pos(j)-x(i,j)));%采用余弦更新位置
    76. end%结束if
    77. end%结束j循环
    78. x(i,:)=BoundrayCheck(x(i,:),ub,lb,dim);
    79. end%结束i循环
    80. for i=1:pop
    81. Fitness(i)=fobj(x(i,:));
    82. if Fitness(i)<Global_Best_Pos
    83. Global_Best_Score=Fitness(i);
    84. Global_Best_Pos=x(i,:);
    85. end%结束if
    86. end%结束i循环
    87. IterCurve(t)=Global_Best_Score;
    88. end%结束t循环
    89. Best_Pos=Global_Best_Pos;
    90. Best_Score=Global_Best_Score;
    91. end

    运行结果:

     

    相关阅读:4、萤火虫(FA)优化算法(附完整Matlab代码,可直接复制)https://blog.csdn.net/xinzhi1992/article/details/126761617?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22126761617%22%2C%22source%22%3A%22xinzhi1992%22%7D

  • 相关阅读:
    MySQL 更新表的记录
    面向对象-Python
    SpringBoot+Vue项目小区疫苗接种管理系统的设计与实现
    IDEA打开项目文件目录不见了
    Linux中的日志
    教你在批量将视频逆时针旋转90度的同时添加马赛克
    python 学习之typing模块
    学信息系统项目管理师第4版系列16_资源管理过程
    EV代码签名证书申请的具体步骤是什么?
    震惊!强大的接口自动化测试框架2.0,unittest与pytest无缝穿插对接,可以像postman一样编写代码
  • 原文地址:https://blog.csdn.net/xinzhi1992/article/details/115359297
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号