正余弦(SCA)优化算法(附完整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代码如下:

 
 
%pop——种群数量
%dim——问题维度
%ub——变量上界,[1,dim]矩阵
%lb——变量下界,[1,dim]矩阵
%fobj——适应度函数(指针)
%MaxIter——最大迭代次数
%Best_Pos——x的最佳值
%Best_Score——最优适应度值
clc;
clear all;
close all;
pop=50;
dim=2;
ub=[10,10];
lb=[-10,-10];
MaxIter=100;
fobj=@(x)fitness(x);%设置适应度函数
[Best_Pos,Best_Score,IterCurve]=SCA(pop,dim,ub,lb,fobj,MaxIter);
%…………………………………………绘图…………………………………………
figure(1);
plot(IterCurve,'r-','linewidth',2);
grid on;
title('正余弦算法迭代曲线');
xlabel('迭代次数');
ylabel('适应度值');
%…………………………………… 结果显示……………………………………
disp(['求解得到的x1,x2是:',num2str(Best_Pos(1)),' ',num2str(Best_Pos(2))]);
disp(['最优解对应的函数:',num2str(Best_Score)]);
 
 
%种群初始化函数
function x=initialization(pop,ub,lb,dim)
for i=1:pop
    for j=1:dim
        x(i,j)=(ub(j)-lb(j))*rand()+lb(j);
    end
end
end
%种群越界调整函数
function x=BoundrayCheck(x,ub,lb,dim)
for i=1:size(x,1)
    for j=1:dim
        if x(i,j)>ub(j)
            x(i,j)=ub(j);
        end
        if x(i,j)<lb(j)
            x(i,j)=lb(j);
        end
    end
end
end
 
%适应度函数,可根据自身需要调整
function [Fitness]=fitness(x)
    Fitness=sum(x.^2);
end

%…………………………………………正余弦算法主体………………………………………
function [Best_Pos,Best_Score,IterCurve]=SCA(pop,dim,ub,lb,fobj,MaxIter)
  a=2;
  x=initialization(pop,ub,lb,dim);%种群初始化
  Fitness=zeros(1,pop);%适应度值初始化
  for i=1:pop
      Fitness(i)=fobj(x(i,:));%计算适应度值
  end
  [SortFitness,Index]=sort(Fitness);
  Global_Best_Pos=x(Index(1),:);
  Global_Best_Score=SortFitness(1);
  for t=1:MaxIter
      r1=a-t*(a/MaxIter);%计算r1
      for i=1:pop
          for j=1:dim
              r2=rand()*(2*pi);
              r3=2*rand();
              r4=rand();
              if(r4<0.5)
                  x(i,j)=x(i,j)+(r1*sin(r2)*abs(r3*Global_Best_Pos(j)-x(i,j)));%采用正弦更新位置
              else
                  x(i,j)=x(i,j)+(r1*cos(r2)*abs(r3*Global_Best_Pos(j)-x(i,j)));%采用余弦更新位置
              end%结束if
          end%结束j循环
          x(i,:)=BoundrayCheck(x(i,:),ub,lb,dim);
      end%结束i循环
      for i=1:pop
           Fitness(i)=fobj(x(i,:));
           if Fitness(i)<Global_Best_Pos
              Global_Best_Score=Fitness(i);
              Global_Best_Pos=x(i,:);
          end%结束if
      end%结束i循环
      IterCurve(t)=Global_Best_Score;
  end%结束t循环
  Best_Pos=Global_Best_Pos;
  Best_Score=Global_Best_Score;
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

  • 12
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
SCA余弦优化算法(Sine Cosine Algorithm,SCA)是一种基于弦和余弦函数优化的算法。它是由Seyedali Mirjalili于2016年提出的,用于求解全局优化问题。 SCA算法的主要思想是通过模拟弦和余弦函数的运动规律来搜索最优解。弦函数在区间[0,π]上递增,而余弦函数在区间[0,π/2]上递减。利用这种特性,SCA算法引入了两个变量:弦变量sin(t)和余弦变量cos(t),t为迭代次数。 算法的优化过程包括两个主要步骤:位置更新和解搜索。在位置更新步骤中,根据弦和余弦函数的运动规律,更新每个解的位置。同时,引入一个随机数项来增加算法的搜索范围。在解搜索步骤中,通过计算适应度函数来评估每个解的质量,并根据适应度函数的值进行解的选择和更新。 SCA算法的优点包括以下几个方面: 1. 算法简单易实现,没有复杂的参数设置过程; 2. 具有较强的全局搜索能力,能够有效地搜索到最优解; 3. 算法具有较好的收敛性能,收敛速度较快。 然而,SCA算法也存在一些不足之处: 1. 对于复杂的优化问题,算法可能会陷入局部最优解; 2. 算法的搜索范围受到弦和余弦函数的限制,可能导致搜索空间不足。 总之,SCA余弦优化算法是一种基于弦和余弦函数优化的算法,通过模拟弦和余弦函数的运动规律来搜索最优解。它具有简单易实现、全局搜索能力强和较快的收敛速度等优点,但也需要考虑到局部最优解和搜索范围受限的问题。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

karwen2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值