算法-PSO+遗传算法搞定无重复序列型最优解

写在前面:考虑到该算法工程应用较多,这里先用Matlab语言讲解

PSO算法主要根据速度更新来更新当前位置,进而逼近最优解。
但是,PSO算法不能保证在解为序列时,序列解出现重复的情况。

这里以实例分析:
假设第i个粒子为x[i, :],size(x,2)即为序列长度
我们假设x[i, :] = [1,2,3,4,5]
设此时v[i, :] = [-2,2,1,-1,1]
更新后x[i, :] = x[i, :] + v[i, :] = [-1,4,4,3,6]

更新后的序列会出现大于5或者小于1且重复的情况

如何解决呢?
基本的想法是:
将更新速度大的序列中的元素先进行更新,更新后如果出现重复的情况,则替换重复元素。
遗传算法的交叉变异则提供了一种更好的替换思路。
附上核心代码:

初始化所有粒子

for i=1:m

    x(i,:)=randperm(round(n));  %粒子位置,生成m个初始化序列,
end


F=fitness(x,X,Y,Z,D,S,C,T);         %计算种群适应度 
%xuhao=xulie(F)           %最小适应度种群序号
a1=F(1);
a2=1;
for i=1:m
    if a1>=F(i)
        a1=F(i);
        a2=i;
    end
end
xuhao=a2;
Tour_pbest=x;            %当前个体最优
Tour_gbest=x(xuhao,:) ;  %当前全局最优路径
Pb=inf*ones(1,m);        %个体最优记录
Gb=F(a2);                %群体最优记录
xnew1=x;
N=1;
while N<=Nmax
    %计算适应度 
    F=fitness(x,X,Y,Z,D,S,C,T);
    for i=1:m
        if F(i)<Pb(i)
            Pb(i)=F(i);                 %将当前值赋给新的最佳值
            Tour_pbest(i,:)=x(i,:);     %将当前路径赋给个体最优路径
        end
        if F(i)<Gb
            Gb=F(i);
            Tour_gbest=x(i,:);
        end
    end
    a1=Pb(1);
    a2=1;
    for i=1:m
        if a1>=Pb(i)
            a1=Pb(i);
            a2=i;
        end
    end
    nummin=a2;
    Gb(N)=Pb(nummin);          %当前群体最优长度

与个体最优进行交叉

 for i=1:m
     
          c1=round(rand*(n-2))+1;  %[1,n-1]范围内随机产生一个交叉位
          c2=round(rand*(n-2))+1;
          while c1==c2
              c1=round(rand*(n-2))+1;  %[1,n-1]范围内随机产生一个交叉位
              c2=round(rand*(n-
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值