基于烟花优化算法的线性规划问题求解matlab程序

基于烟花优化算法的线性规划问题求解matlab程序
1 烟花算法介绍
烟花算法 (Fireworks Algorithm),缩写为 FWA,是受到夜空中烟花爆炸的启发而提出的一群体智能算法。
在这里插入图片描述
1.1 烟花算法的起源与动机
通过模拟烟花爆炸的方式来进行多点同时爆炸式搜索,这也许是一种高效的搜索方式,是有别于现有其他方法的新型搜索方法,从而有了研究这种爆炸搜索方式的想法,当时为其取名烟花算法(fireworks algorithm,FWA)。
在这里插入图片描述
虽然烟花算法这个名称比较直观和简洁,但是由于它没有直接与优化等求解问题建立直接的联系,此后有些研究人员有时也用其他别称来称呼我们的烟花算法,如烟花优化算法、烟花爆炸算法、烟花爆炸优化算法、烟花爆炸搜索算法、爆炸搜索方法等。尽管有这些不同的别称,这里统一采用原始的名称烟花算法,以免混淆。

1.2 烟花算法的研究进展
自从烟花算法的开创性论文由谭营教授等人于2010年发表之后,业界对烟花算法的研究逐步深入和铺开。通过对原始烟花算法的细致、深入的分析,针对原始烟花算法(FWA)的不足,提出了大量的改进方法,并据此发展了各种改进算法,以及与其他方法的混合方法,大大提高的原始烟花算法的性能,同时研究了烟花算法在求解不同类型优化问题的能力,还有大量的研究人员进行了烟花算法的应用研究,给出了一些典型的成功应用案例。

2 线性规划算例
2.1算例
在这里插入图片描述
2.2答案
在这里插入图片描述
3 烟花算法求解结果

1)迭代曲线
在这里插入图片描述
2)求解答案
在这里插入图片描述
由求解结果可知,求解答案接近标准值,求解效果一般。

4 matlab程序
1)主函数

%% 烟花算法进行函数优化
%%求函数的最小值
%fitness适应度函数,N烟花数,D变量维数,M变异火花数,Er爆炸半径,En爆炸数目
%LB,UB分别为变量上下界,T为迭代次数,a,b为爆炸数目限制因子
clear;clc
N=100;   % N烟花数
D=3;     % D变量维数
M=5;     % M变异火花数
En=10;    % En爆炸数目
Er=5;    % Er爆炸半径
a=0.3;   % a,b为爆炸数目限制因子
b=0.6;
T=500;   % T为迭代次数

%求最大值变量上下界
LB=[0,0,0];
UB=[10,10,15];

%随机在解空间初始化N个烟花位置
x = zeros(N,D);
for i=1:N
    x(i,:)=LB+rand(1,D).*(UB-LB);
end
%循环迭代
E_Spark=zeros(T,D,N);
Fit = zeros(1,N);
F = zeros(1,T);
for t=1:T
    %计算每个烟花适应度值
    for i=1:N
        Fit(i)=fitness(x(i,:));
    end
    [F(t),~]=min(Fit);
    Fmin=min(Fit);
    Fmax=max(Fit);
    %计算每个烟花的爆炸半径E_R和爆炸数目E_N以及产生的爆炸火花
    E_R = zeros(1,N);
    E_N = zeros(1,N);
    for i=1:N
        E_R(i)=Er*((Fit(i)-Fmin+eps)/(sum(Fit)-N*Fmin+eps));  %爆炸半径
        E_N(i)=En*((Fmax-Fit(i)+eps)/(N*Fmax-sum(Fit)+eps));  %爆炸数目
        if E_N(i)<a*En    % 爆炸数目限制
            E_N(i)=round(a*En);
        elseif E_N(i)>b*En
            E_N(i)=round(b*En);
        else
            E_N(i)=round(E_N(i));
        end
        %产生爆炸火花 E_Spark
        for j=2:(E_N(i)+1)              % 第i个烟花共产生E_N(i)个火花
            E_Spark(1,:,i)=x(i,:);      % 将第i个烟花保存为第i个火花序列中的第一个,爆炸产生的火花从序列中的第二个开始存储(即烟花为三维数组每一页的第一行)
            h=E_R(i)*(-1+2*rand(1,D));  % 位置偏移
            E_Spark(j,:,i)=x(i,:)+h;    % 第i个烟花(三维数组的i页)产生的第j(三维数组的j行)个火花
            for k=1:D   %越界检测
                if E_Spark(j,k,i)>UB(k)||E_Spark(j,k,i)<LB(k)  %第i个烟花(三维数组的i页)产生的第j个火花(三维数组的j行)的第k个变量(三维数组的k列)
                    E_Spark(j,k,i)=LB(k)+rand*(UB(k)-LB(k));   %映射规则
                end
            end
        end
    end
    %产生高斯变异火花Mut_Spark,随机选择M个烟花进行变异
    Mut=randperm(N);          % 随机产生1-N内的N个数
    for m1=1:M                % M个变异烟花
        m=Mut(m1);            % 随机选取烟花
        for n=1:E_N(m)
            e=1+sqrt(1)*randn(1,D); %高斯变异参数,方差为1,均值也为1的1*D随机矩阵
            E_Spark(n,:,m)=E_Spark(n,:,m).*e;
            for k=1:D   %越界检测
                if E_Spark(n,k,m)>UB(k)||E_Spark(n,k,m)<LB(k)  %第i个烟花(三维数组的i页)产生的第j个火花(三维数组的j行)的第k个变量(三维数组的k列)
                    E_Spark(n,k,m)=LB(k)+rand*(UB(k)-LB(k));   %映射规则
                end
            end
        end
    end
    
    %选择操作,从烟花、爆炸火花、变异火花里(都包含在三维数组中)选取N个优良个体作为下一代(先将最优个体留下,然后剩下的N-1个按轮盘赌原则选取)
    n=sum(E_N)+N; %烟花、火花总个数
    q=1;
    Fitness = zeros(1,1);
    E_Sum = zeros(1,D);
    for i=1:N  % 三维转二维
        for j=1:(E_N(i)+1)  % 三维数组每一页的行数(即每个烟花及其产生的火花数之和)
            E_Sum(q,:)=E_Spark(j,:,i); % 烟花与火花总量
            Fitness(q)=fitness(E_Sum(q,:)); % 计算所有烟花、火花的适应度,用于选取最优个体
            q=q+1;
        end
    end
    [Fitness,X]=sort(Fitness);  % 适应度升序排列
    x(1,:)=E_Sum(X(1),:);    % 最优个体
    dist=pdist(E_Sum);       % 求解各火花两两间的欧式距离
    S=squareform(dist);      % 将距离向量重排成n*n数组,第i行之和即为第i个火花到其他火花的距离之和
    P = zeros(1,n);
    for i=1:n                % 分别求各行之和
        P(i)=sum(S(i,:));
    end
    [P,Ix]=sort(P,'descend');% 将距离按降序排列,选取前N-1个,指的是如果个体密度较高,即该个体周围有很多其他候选者个体时,该个体被选择的概率会降低
    for i=1:(N-1)
        x(i+1,:)=E_Sum(Ix(i),:);
    end
end

for i=1:N
    Fit(i)=fitness(x(i,:));
end


%求最小值输出
[F(T),Y]=min(Fit);
fmin=min(F);
xm=x(Y,:);
fprintf('xm=%f  %f\n',xm(1),xm(2));
fprintf('fmin=%f\n',fmin);
figure(1);
t=1:T;
plot(t,F)
xlabel('迭代次数')
ylabel('目标函数值')
title('FWA算法迭代曲线');
。。。。。。。略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

电磁MATLAB

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

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

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

打赏作者

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

抵扣说明:

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

余额充值