码农知识堂 - 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

  • 相关阅读:
    挂载VMware esxi服务器文件夹到本地ubuntu
    优化 - 不要在for循环中调用数据库
    【配置vscode编写python代码并输出到外部控制台】
    ESP8266 WiFi物联网智能插座—下位机软件实现
    TARNet: Task-Aware Reconstruction for Time-Series Transformer(KDD2022)
    【NVMe2.0b 14-3】Doorbell Buffer Config command、Device Self-test command
    idea启动tomcat报错404
    Win11运行虚拟机死机了?Win11运行VMware虚拟机崩溃的解决方法
    希望所有计算机专业学生都知道这门课
    【Java从入门到精通 04】:Java标识符命名及关键字、保留字
  • 原文地址:https://blog.csdn.net/xinzhi1992/article/details/115359297
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号