解决基于烟花优化算法的线性规划问题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) % 第一烟花共产E_N(i)个火花 E_Spark(1,:,i)=x(i,:); % 将第一个烟花保存为第一个火花序列中的第一个,爆炸产生的火花从序列中的第二个开始(即三维数组每页的第一行) h=E_R(i)*(-1 2*rand(1,D)); % 位置偏移 E_Spark(j,:,i)=x(i,:) h; % 第一个烟花(三维数组的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*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-一是按轮盘赌原则选择) 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数组,第一行之和是第一一个火花到其他火花的距离之和 P = zeros(1,n); for i=1:n % 分别求各行之和 P(i)=sum(S(i,:)); end [P,Ix]=sort(P,'descend');% 按降序排列距离,选择前N-一是指个体密度高,也就是说,当个体周围有许多其他候选人时,选择个体的概率会降低 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算法迭代曲线; 。。。。。。。。略
5 完整程序链接: https://mp.weixin.qq.com/s?__biz=Mzg4MTc1MjE2Mg==&mid=2247484329&idx=1&sn=7704db9e479be00e8f84328677f5b873&chksm=cf6062a4f817ebb29dde31c46f59fcdc3d89d619779c3c166dbc6a4bc8431220fdc04bb10be5&token=1023455607&lang=zh_CN#rd