带交叉因子的粒子群优化算法matlab源程序

 

带交叉因子的粒子群优化算法matlab源程序
大明 发表于 2006-8-26 17:04:00

      程序源代码:其中PSOGA.m文件,也就是主程序如下

%-----------------------------------------------
%------名称:带交叉因子的改进PSO算法
%------功能:求解多维无约束优化问题
%------特点:收敛性强,还可以加入变异算子
%------作者:孙明杰 <dreamsun2001@126.com>
%------单位:中国矿业大学计算数学硕2005
%------日期:2006年8月26日
%-----------------------------------------------

%格式标准化
clear all;
clc;
format long;
%初始化各个因子
c1=1.4962;    %学习因子c1
c2=1.4962;    %学习因子c2
w=0.7298;     %惯性权重w
N=20;         %粒子群规模
D=6;          %搜索空间维数(本程序适合3维及以上,不能求解1,2维)
eps=10^(-6);  %满足条件限制的误差(在不知道最小值时候不用设置)
MaxDT=500;    %粒子群繁殖的代数

%初始化粒子的速度和位置,数据结构用矩阵A表示
for i=1:N
    for j=1:2*D
        A(i,j)=rand;
    end
end
for i=1:N
    for j=2*D+1:3*D
        A(i,j)=A(i,j-2*D);
    end
end
%计算各个粒子的适应度
for i=1:N
    A(i,3*D+1)=fitness(A(i,1:D),D);
end
%对粒子的适应度进行排序
B=sortrows(A,3*D+1);
%排序后适应度低的前面一半粒子直接进入下一代
NextGeneration=zeros(N,3*D+1);
for i=1:N/2
    for j=1:3*D+1
        NextGeneration(i,j)=B(i,j);
    end
end
%后一半粒子进行遗传选择和交叉操作
for i=1:N/2
    for j=1:3*D+1
        Cross(i,j)=B(i+N/2,j);
    end
end
%产生一个随机的交叉位置
for i=1:N/4
    Anumber=randperm(D-1);
    if Anumber(1)~=1
        position=Anumber(1);
    else
        position=Anumber(2);
    end
    %交叉进行
    for j=position:D-1
        temp=Cross(i,j);
        Cross(i,j)=Cross(N/2-i+1,j);
        Cross(N/2-i+1,j)=temp;
    end
end
%交叉结束,进行更新
for i=1:N/2
    Cross(i,3*D+1)=fitness(Cross(i,1:D),D);
    if Cross(i,3*D+1)<B(i+N/2,3*D+1)
        for j=2*D+1:3*D
            Cross(i,j)=Cross(i,j-2*D);
        end
    else
        for j=2*D+1:3*D
            Cross(i,j)=B(i,j);
        end
    end
end
%下面选择最好的粒子N/2个进入下一代
Pool=zeros(N,3*D+1);
for i=1:N/2
    for j=1:3*D+1
        Pool(i,j)=B(i+N/2,j);
    end
end
for i=1+N/2:N
    for j=1:3*D+1
        Pool(i,j)=Cross(i-N/2,j);
    end
end
%POOLX表示排序后的粒子选择池
PoolX=sortrows(Pool,3*D+1);
for i=1+N/2:N
    for j=1:3*D+1
        NextGeneration(i,j)=PoolX(i-N/2,j);
    end
end
Pbest=NextGeneration(i,2*D+1:3*D);
for i=2:N
    if NextGeneration(i,3*D+1)<fitness(Pbest,D)
        Pbest=NextGeneration(i,2*D+1:3*D);
    end
end
%根据粒子群公式进行迭代(Stander PSO Step)
%速度更新
for i=1:N
    for j=D+1:2*D
        A(i,j)=w*NextGeneration(i,j)+c1*rand*(NextGeneration(i,j+D)-NextGeneration(i,j-D))+c2*rand*(Pbest(j-D)-NextGeneration(i,j-D));
    end
end
%位置更新
for i=1:N
    for j=1:D
        A(i,j)=NextGeneration(i,j)+A(i,j+D);
    end
    A(i,3*D+1)=fitness(A(i,1:D),D);
    if A(i,3*D+1)<NextGeneration(i,3*D+1)
        for j=2*D+1:3*D
            A(i,j)=A(i,j-2*D);
        end
    else
        for j=2*D+1:3*D
            A(i,j)=NextGeneration(i,j-2*D);
        end
    end
end
%下面进入主要循环,循环到最大次数得到最优解和最小值
%DDTime=1;
for time=1:MaxDT
    B=sortrows(A,3*D+1);
    NextGeneration=zeros(N,3*D+1);
    for i=1:N/2
        for j=1:3*D+1
            NextGeneration(i,j)=B(i,j);
        end
    end
    %遗传选择交叉
    for i=1:N/2
        for j=1:3*D+1
            Cross(i,j)=B(i+N/2,j);
        end
    end

    for i=1:N/4
        Anumber=randperm(D-1);
        if Anumber(1)~=1
            position=Anumber(1);
        else
            position=Anumber(2);
        end
       
        for j=position:D-1
            temp=Cross(i,j);
            Cross(i,j)=Cross(N/2-i+1,j);
            Cross(N/2-i+1,j)=temp;
        end
    end
    %交叉结束,进行更新
    for i=1:N/2
        Cross(i,3*D+1)=fitness(Cross(i,1:D),D);
        if Cross(i,3*D+1)<B(i+N/2,3*D+1)
            for j=2*D+1:3*D
                Cross(i,j)=Cross(i,j-2*D);
            end
        else
            for j=2*D+1:3*D
                Cross(i,j)=B(i,j);
            end
        end
    end
    %下面选择最好的粒子N/2个进入下一代
    Pool=zeros(N,3*D+1);
    for i=1:N/2
        for j=1:3*D+1
            Pool(i,j)=B(i+N/2,j);
        end
    end
    for i=1+N/2:N
        for j=1:3*D+1
            Pool(i,j)=Cross(i-N/2,j);
        end
    end
   
    PoolX=sortrows(Pool,3*D+1);
    for i=1+N/2:N
        for j=1:3*D+1
            NextGeneration(i,j)=PoolX(i-N/2,j);
        end
    end
    Pbest=NextGeneration(i,2*D+1:3*D);
    for i=2:N
        if NextGeneration(i,3*D+1)<fitness(Pbest,D)
            Pbest=NextGeneration(i,2*D+1:3*D);
        end
    end
    %根据粒子群公式进行迭代
    for i=1:N
        for j=D+1:2*D
            A(i,j)=w*NextGeneration(i,j)+c1*rand*(NextGeneration(i,j+D)-NextGeneration(i,j-D))+c2*rand*(Pbest(j-D)-NextGeneration(i,j-D));
       end
    end
   
    for i=1:N
        for j=1:D
            A(i,j)=NextGeneration(i,j)+A(i,j+D);
        end
        A(i,3*D+1)=fitness(A(i,1:D),D);
        if A(i,3*D+1)<NextGeneration(i,3*D+1)
            for j=2*D+1:3*D
                A(i,j)=A(i,j-2*D);
            end
        else
            for j=2*D+1:3*D
                A(i,j)=NextGeneration(i,j-2*D);
            end
        end
    end
    Pg(time)=fitness(Pbest,D);
    %DDTime=DDTime+1;
    %if fitness(Pbest,D)<eps
        %break;
    %end
end
%算法结束,得到的结果显示如下:
disp('****************************************************')
disp('最后得到的最优位置为:')
X=Pbest'
disp('得到的函数最小值为:')
Minimize=fitness(Pbest,D)
disp('****************************************************')
%绘制进化代数和适应度关系曲线图
xx=linspace(1,MaxDT,MaxDT);
yy=Pg(xx);
plot(xx,yy,'b-')
hold on
grid on
title('带交叉因子的粒子群优化算法进化代数与适应度值关系曲线图')
legend('粒子适应度曲线走势')
%------算法结束---DreamSun GL & HF-------------------------

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
多目标粒子群优化算法(MOPSO)是一种常用于求解多目标优化问题的算法。下面是一个使用MATLAB实现的MOPSO算法的源代码: ```matlab function [best_position, best_fitness] = MOPSO(function_handle, num_particles, num_iterations, num_objectives) % 初始化粒子群 particles = struct('position', [], 'velocity', [], 'pbest_position', [], 'pbest_fitness', [], 'dominated_count', 0, 'dominated_set', []); for i = 1:num_particles particles(i).position = rand(1, num_objectives); % 随机初始化每个粒子的位置 particles(i).velocity = zeros(1, num_objectives); % 初始化每个粒子的速度 particles(i).pbest_position = particles(i).position; % 将每个粒子的当前位置设置为个体最优解 particles(i).pbest_fitness = evaluate_fitness(function_handle, particles(i).position); % 计算每个粒子的适应度值 end % 迭代更新粒子群 for t = 1:num_iterations for i = 1:num_particles % 更新粒子速度和位置 particles(i).velocity = update_velocity(particles(i).velocity, particles(i).position, particles(i).pbest_position); particles(i).position = update_position(particles(i).position, particles(i).velocity); % 更新个体最优解 fitness = evaluate_fitness(function_handle, particles(i).position); if dominates(fitness, particles(i).pbest_fitness) particles(i).pbest_position = particles(i).position; particles(i).pbest_fitness = fitness; end % 更新非支配排序信息 particles = update_dominated_set(particles, i); end % 更新全局最优解 [best_fitness, best_particle_index] = get_best_fitness(particles); best_position = particles(best_particle_index).position; end end % 更新粒子速度 function new_velocity = update_velocity(velocity, position, pbest_position) w = 0.6; % 惯性权重 c1 = 1; % 自我认知学习因子 c2 = 1; % 社会认知学习因子 r1 = rand(size(velocity)); r2 = rand(size(velocity)); new_velocity = w * velocity + c1 * r1 .* (pbest_position - position) + c2 * r2 .* (gbest_position - position); end % 更新粒子位置 function new_position = update_position(position, velocity) new_position = position + velocity; end % 计算适应度值 function fitness = evaluate_fitness(function_handle, position) fitness = feval(function_handle, position); end % 判断是否支配 function is_dominated = dominates(fitness1, fitness2) is_dominated = all(fitness1 <= fitness2) && any(fitness1 < fitness2); end % 更新非支配排序信息 function particles = update_dominated_set(particles, i) for j = 1:length(particles) if dominates(particles(i).pbest_fitness, particles(j).pbest_fitness) particles(i).dominated_set = [particles(i).dominated_set, j]; elseif dominates(particles(j).pbest_fitness, particles(i).pbest_fitness) particles(i).dominated_count = particles(i).dominated_count + 1; end end end % 获取最好的适应度值和粒子索引 function [best_fitness, best_particle_index] = get_best_fitness(particles) best_fitness = Inf; best_particle_index = 0; for i = 1:length(particles) if particles(i).dominated_count == 0 && sum(particles(i).pbest_fitness) < best_fitness best_fitness = sum(particles(i).pbest_fitness); best_particle_index = i; end end end ``` 这是一个基本的MOPSO算法实现,其中函数`function_handle`是需要优化的目标函数的句柄,`num_particles`是粒子群中的粒子数目,`num_iterations`是迭代次数,`num_objectives`是目标函数的数目。该算法通过更新粒子的速度和位置,逐步寻找多目标优化问题的最优解集。最后,算法输出全局最优解的位置(`best_position`)和适应度值(`best_fitness`)。 请注意,上述代码仅为一个简单的实现示例,实际应用中可能需要根据具体问题进行一些改进或调整。同时,算法的性能还受到参数的选择和调整的影响,需要根据具体问题进行适当的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值