⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 constrainpso.txt

📁 求解约束优化问题的改进粒子群优化算法
💻 TXT
字号:
待改进的约束优化问题的粒子群算法

    今天写了一个解决约束优化问题的算法,但是对一个测试函数无法达到全局最优.所以贴上来大家一起想想改进办法.

    主函数:

%-----------------------------------------------
%程序名称:求解约束优化问题的改进粒子群优化算法
%程序功能:求解带各种约束条件的优化问题
%输入条件:各种初始条件,以及设定参数
%输出数值:最优解位置以及函数极小值
%-----------------------------------------------
%格式设定
clear all;
clc;
format long;
%参数设置
D=10;          %搜索空间维数
N=40;          %粒子群规模
MaxDT=1000;    %最大迭代次数
w=0.7298;      %惯性权重w
c1=1.49618;    %学习因子c1
c2=1.49618;    %学习因子c2
%随机初始化粒子的位置和速度
for i=1:N
    for j=1:D
        x(i,j)=1+rand*9; %0到10之间的随机数(不同情况要改变)
        v(i,j)=rand;
    end
    p(i,:)=x(i,:); %初始化时把粒子位置设为个体最优位置
end
%根据两个函数确定最优位置适应度函数
Pbest=10^8;
for i=1:D
    if fitness(p(i,:),D)<Pbest
        Pbest=fitness(p(i,:),D);
        Pg=p(i,:);
    end
end
%根据基本粒子群迭代公式进行一次进化迭代产生中间子代mid
for i=1:N
    for j=1:D
        v(i,j)=w*v(i,j)+c1*rand*(p(i,j)-x(i,j))+c2*rand*(Pg(j)-x(i,j));
        mid(i,j)=x(i,j)+v(i,j);  %中间代mid
    end
end
%判断中间代与原父代的优劣(进化选择)
for i=1:N
    %若都一个可行,另一个不可行,则无条件选择可行解
    if violent(x(i,:),D)==0 && violent(mid(i,:),D)>0
        NextGeneration(i,:)=x(i,:);
    end
    %若都可行,选择适应度小的进入下一代
    if violent(x(i,:),D)==0 && violent(mid(i,:),D)==0
            if fitness(x(i,:),D)<=fitness(mid(i,:),D)
                NextGeneration(i,:)=x(i,:);
            else
                NextGeneration(i,:)=mid(i,:);
            end
    end
    %若都一个可行,另一个不可行,则无条件选择可行解
    if violent(x(i,:),D)>0 && violent(mid(i,:),D)==0
        NextGeneration(i,:)=mid(i,:);
    end
    %若两个都不可行,选择违背约束小的进入下一代
    if violent(x(i,:),D)>0 && violent(mid(i,:),D)>0
            if violent(x(i,:),D)<=violent(mid(i,:),D)
                NextGeneration(i,:)=x(i,:);
            else
                NextGeneration(i,:)=mid(i,:);
            end
    end
end
%NextGeneration复制给更新的粒子群x
x=NextGeneration;
%下面进入主循环,迭代最大次数后输出优化结果
for t=1:MaxDT
    %更新个体和全局最优位置
    for i=1:N
        if fitness(x(i,:),D)<fitness(p(i,:),D)
            p(i,:)=x(i,:);
        end
        if fitness(p(i,:),D)<Pbest && violent(p(i,:),D)==0
            Pg=p(i,:);
        end
    end
    %根据基本粒子群迭代公式进行一次进化迭代产生中间子代mid
    for i=1:N
        for j=1:D
            v(i,j)=w*v(i,j)+c1*rand*(p(i,j)-x(i,j))+c2*rand*(Pg(j)-x(i,j));
            mid(i,j)=x(i,j)+v(i,j);  %中间代mid
        end
    end
    %判断中间代与原父代的优劣(进化选择)
    for i=1:N
        %若都一个可行,另一个不可行,则无条件选择可行解
        if violent(x(i,:),D)==0 && violent(mid(i,:),D)>0
            NextGeneration(i,:)=x(i,:);
        end
        %若都可行,选择适应度小的进入下一代
        if violent(x(i,:),D)==0 && violent(mid(i,:),D)==0
                if fitness(x(i,:),D)<=fitness(mid(i,:),D)
                    NextGeneration(i,:)=x(i,:);
                else
                    NextGeneration(i,:)=mid(i,:);
                end
        end
        %若都一个可行,另一个不可行,则无条件选择可行解
        if violent(x(i,:),D)>0 && violent(mid(i,:),D)==0
            NextGeneration(i,:)=mid(i,:);
        end
        %若两个都不可行,选择违背约束小的进入下一代
        if violent(x(i,:),D)>0 && violent(mid(i,:),D)>0
                if violent(x(i,:),D)<=violent(mid(i,:),D)
                    NextGeneration(i,:)=x(i,:);
                else
                    NextGeneration(i,:)=mid(i,:);
                end
        end
    end
    %NextGeneration复制给更新的粒子群x
    x=NextGeneration;
end
disp('函数的最大值为')
-Pbest
%----算法结束-------------------------------------

m文件1:

%名称:被优化函数的适应度函数
%输入:代表粒子的向量x,粒子搜索空间维数D
%输出:粒子的适应度值
%形式:M文件调用函数
function result=fitness(x,D)
sum1=0;
sum2=1;
sum3=0;
for i=1:D
    sum1=sum1+cos(x(i))^4;
    sum2=sum2*cos(x(i))^2;
    sum3=sum3+i*x(i)^2;
end
result=-abs(sum1-2*sum2)/sqrt(sum3);

m文件2

%名称:粒子违反约束程度函数
%输入:粒子位置x,搜索空间维数D
%输出:粒子违反约束条件的程度(若违反输出大于,不违反输出等于零)
%形式:保存为M文件被调用
function result=violent(x,D)
sum1=1;
sum2=0;
for i=1:D
    sum1=sum1*x(i);
    sum2=sum2+x(i);
end
part1=max(0,0.75-sum1);
part2=max(0,sum2-7.5*D);
part3=max(0,-x(i));
part4=max(0,10-x(i));
result=part1+part2+part3+part4;

    运行结果不是很好,只能达到局部最优.下面加入一个变异算子有可能会好一些!

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -