粒子群优化算法(PSO)的matlab运行程序~~谢谢大家啦!

粒子群优化算法(PSO)的matlab运行程序~~谢谢大家啦!,第1张

%不知道你具体的问题是什么,下面是一个最基本的pso算法解决函数极值问题,如果是一些大型的问题,需要对速度、惯性常数、和自适应变异做进一步优化,希望对你有帮助

function y = fun(x)

y=-20exp(-02sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2pix(1))+cos(2pix(2)))/2)+20+271289;

%下面是主程序

%% 清空环境

clc

clear

%% 参数初始化

%粒子群算法中的两个参数

c1 = 149445;

c2 = 149445;

maxgen=200; % 进化次数

sizepop=20; %种群规模

Vmax=1;%速度限制

Vmin=-1;

popmax=5;%种群限制

popmin=-5;

%% 产生初始粒子和速度

for i=1:sizepop

%随机产生一个种群

pop(i,:)=5rands(1,2); %初始种群

V(i,:)=rands(1,2); %初始化速度

%计算适应度

fitness(i)=fun(pop(i,:)); %染色体的适应度

end

%找最好的染色体

[bestfitness bestindex]=min(fitness);

zbest=pop(bestindex,:); %全局最佳

gbest=pop; %个体最佳

fitnessgbest=fitness; %个体最佳适应度值

fitnesszbest=bestfitness; %全局最佳适应度值

%% 迭代寻优

for i=1:maxgen

for j=1:sizepop

%速度更新

V(j,:) = V(j,:) + c1rand(gbest(j,:) - pop(j,:)) + c2rand(zbest - pop(j,:));

V(j,find(V(j,:)>Vmax))=Vmax;

V(j,find(V(j,:)<Vmin))=Vmin;

%种群更新

pop(j,:)=pop(j,:)+05V(j,:);

pop(j,find(pop(j,:)>popmax))=popmax;

pop(j,find(pop(j,:)<popmin))=popmin;

%自适应变异(避免粒子群算法陷入局部最优)

if rand>08

k=ceil(2rand);%ceil朝正无穷大方向取整

pop(j,k)=rand;

end

%适应度值

fitness(j)=fun(pop(j,:));

%个体最优更新

if fitness(j) < fitnessgbest(j)

gbest(j,:) = pop(j,:);

fitnessgbest(j) = fitness(j);

end

%群体最优更新

if fitness(j) < fitnesszbest

zbest = pop(j,:);

fitnesszbest = fitness(j);

end

end

yy(i)=fitnesszbest;

end

%% 结果分析

plot(yy)

title(['适应度曲线 ' '终止代数=' num2str(maxgen)]);

xlabel('进化代数');ylabel('适应度');

美国Michigan 大学的 Holland 教授提出的遗传算法(GeneticAlgorithm, GA)是求解复杂的组合优化问题的有效方法 ,其思想来自于达尔文进化论和门德尔松遗传学说 ,它模拟生物进化过程来从庞大的搜索空间中筛选出较优秀的解,是一种高效而且具有强鲁棒性方法。所以,遗传算法在求解TSP和 MTSP问题中得到了广泛的应用。

matlab程序如下:

function[opt_rte,opt_brk,min_dist] =mtspf_ga(xy,dmat,salesmen,min_tour,pop_size,num_iter)

%%

%实例

%     n = 20;%城市个数

%     xy = 10rand(n,2);%城市坐标  随机产生,也可以自己设定

%     salesmen = 5;%旅行商个数

%     min_tour = 3;%每个旅行商最少访问的城市数

%     pop_size = 80;%种群个数

%     num_iter = 200;%迭代次数

%     a = meshgrid(1:n);

%     dmat =reshape(sqrt(sum((xy(a,:)-xy(a',:))^2,2)),n,n);

%     [opt_rte,opt_brk,min_dist] = mtspf_ga(xy,dmat,salesmen,min_tour,

%         pop_size,num_iter);%函数

%%

[N,dims]= size(xy); %城市矩阵大小

[nr,nc]= size(dmat); %城市距离矩阵大小

n = N -1;% 除去起始的城市后剩余的城市的数

% 初始化路线、断点的选择

num_brks= salesmen-1;

dof = n- min_toursalesmen;       %初始化路线、断点的选择

addto =ones(1,dof+1);

for k =2:num_brks

addto = cumsum(addto);

end

cum_prob= cumsum(addto)/sum(addto);

%% 初始化种群

pop_rte= zeros(pop_size,n);          %   种群路径

pop_brk= zeros(pop_size,num_brks);    % 断点集合的种群

for k =1:pop_size

pop_rte(k,:) = randperm(n)+1;

pop_brk(k,:) = randbreaks();

end

%  画图路径曲线颜色

clr =[1 0 0; 0 0 1; 067 0 1; 0 1 0; 1 05 0];

ifsalesmen > 5

clr = hsv(salesmen);

end

%%

% 基于遗传算法的MTSP

global_min= Inf;        %初始化最短路径

total_dist= zeros(1,pop_size);

dist_history= zeros(1,num_iter);

tmp_pop_rte= zeros(8,n);%当前的路径设置

tmp_pop_brk= zeros(8,num_brks); %当前的断点设置

new_pop_rte= zeros(pop_size,n);%更新的路径设置

new_pop_brk= zeros(pop_size,num_brks);%更新的断点设置

foriter = 1:num_iter

% 计算适应值

for p = 1:pop_size

d = 0;

p_rte = pop_rte(p,:);

p_brk = pop_brk(p,:);

rng = [[1 p_brk+1];[p_brk n]]';

for s = 1:salesmen

d = d + dmat(1,p_rte(rng(s,1)));% 添加开始的路径

for k = rng(s,1):rng(s,2)-1

d = d + dmat(p_rte(k),p_rte(k+1));

end

d = d + dmat(p_rte(rng(s,2)),1); % 添加结束的的路径

end

total_dist(p) = d;

end

% 找到种群中最优路径

[min_dist,index] = min(total_dist);

dist_history(iter) = min_dist;

if min_dist < global_min

global_min = min_dist;

opt_rte = pop_rte(index,:); %最优的最短路径

opt_brk = pop_brk(index,:);%最优的断点设置

rng = [[1 opt_brk+1];[opt_brk n]]';%设置记录断点的方法

figure(1);

for s = 1:salesmen

rte = [1 opt_rte(rng(s,1):rng(s,2))1];

plot(xy(rte,1),xy(rte,2),'-','Color',clr(s,:));

title(sprintf('城市数目为 = %d,旅行商数目为 = %d,总路程 = %14f, 迭代次数 =%d',n+1,salesmen,min_dist,iter));

hold on

grid on

end

plot(xy(1,1),xy(1,2),'ko');

hold off

end

% 遗传 *** 作

rand_grouping = randperm(pop_size);

for p = 8:8:pop_size

rtes = pop_rte(rand_grouping(p-7:p),:);

brks = pop_brk(rand_grouping(p-7:p),:);

dists =total_dist(rand_grouping(p-7:p));

[ignore,idx] = min(dists);

best_of_8_rte = rtes(idx,:);

best_of_8_brk = brks(idx,:);

rte_ins_pts = sort(ceil(nrand(1,2)));

I = rte_ins_pts(1);

J = rte_ins_pts(2);

for k = 1:8 %产生新种群

tmp_pop_rte(k,:) = best_of_8_rte;

tmp_pop_brk(k,:) = best_of_8_brk;

switch k

case 2% 倒置 *** 作

tmp_pop_rte(k,I:J) =fliplr(tmp_pop_rte(k,I:J));

case 3  % 互换 *** 作

tmp_pop_rte(k,[I J]) =tmp_pop_rte(k,[J I]);

case 4 % 滑动平移 *** 作

tmp_pop_rte(k,I:J) =tmp_pop_rte(k,[I+1:J I]);

case 5% 更新断点

 tmp_pop_brk(k,:) = randbreaks();

case 6  % 倒置并更新断点

tmp_pop_rte(k,I:J) =fliplr(tmp_pop_rte(k,I:J));

tmp_pop_brk(k,:) =randbreaks();

case 7 % 互换并更新断点

tmp_pop_rte(k,[I J]) =tmp_pop_rte(k,[J I]);

tmp_pop_brk(k,:) =randbreaks();

case 8 % 评议并更新断点

tmp_pop_rte(k,I:J) =tmp_pop_rte(k,[I+1:J I]);

tmp_pop_brk(k,:) =randbreaks();

otherwise

end

end

new_pop_rte(p-7:p,:) = tmp_pop_rte;

new_pop_brk(p-7:p,:) = tmp_pop_brk;

end

pop_rte = new_pop_rte;

pop_brk = new_pop_brk;

end

figure(2)

plot(dist_history,'b','LineWidth',2);

title('历史最优解');

xlabel('迭代次数')

ylabel('最优路程')

% 随机产生一套断点 的集合

function breaks = randbreaks()

if min_tour == 1 % 一个旅行商时,没有断点的设置

tmp_brks = randperm(n-1);

breaks =sort(tmp_brks(1:num_brks));

else % 强制断点至少找到最短的履行长度

num_adjust = find(rand <cum_prob,1)-1;

spaces =ceil(num_brksrand(1,num_adjust));

adjust = zeros(1,num_brks);

for kk = 1:num_brks

adjust(kk) = sum(spaces == kk);

end

breaks = min_tour(1:num_brks) +cumsum(adjust);

end

end

disp('最优路径为:/n')

disp(opt_rte);

disp('其中断点为为:/n')

disp(opt_brk);

end

反向种群是一种常用的遗传算法策略,可以通过反转标准遗传算法中优胜劣汰的选择机制,使得算法能够更快地收敛。在MATLAB中,您可以按照以下步骤建立一个反向种群:

1 初始化种群:首先,您需要初始化一个种群,并为每个个体分配一组初始基因。您可以使用 MATLAB 的随机数函数来生成初始基因并构造初始种群。

2 计算适应度函数:接下来,您需要为每个个体计算适应度函数值,并将其放入适应度矩阵中。适应度函数通常与问题域和目标有关,例如在求解优化问题时,适应度函数可以是目标函数的计算结果。

3 选择劣质个体:与标准遗传算法不同的是,在反向种群中,您需要选择劣质的个体进行交叉和变异 *** 作。您可以使用 MATLAB 中现有的选择函数或编写自己的函数来实现这一步骤。

4 进行交叉和变异:在选择完劣质个体后,您需要对它们进行交叉和变异 *** 作,以便产生新的后代个体。您可以根据具体问题的特点,在 MATLAB 中使用现有的交叉和变异函数或编写自己的函数来实现这一步骤。

5 更新种群:在完成交叉和变异 *** 作后,您需要将新产生的后代个体加入到原有的种群中,并更新适应度矩阵。您可以使用 MATLAB 中的数组 *** 作和矩阵运算来实现这一步骤。

6 判断收敛:反向遗传算法通常需要进行多次迭代才能达到最优解,因此您需要设置一个收敛条件来判断算法是否收敛。例如,您可以设置最大迭代次数、目标适应度值等条件来判断收敛。

总之,在MATLAB中,您可以按照以上步骤建立一个反向种群,用于求解优化问题和其他相关应用。在具体实现过程中,您需要根据问题的特点和要求进行具体调整和优化。

function ret=Code(lenchrom,bound)

%本函数将变量编码成染色体,用于随机初始化一个种群

% lenchrom input : 染色体长度

% bound input : 变量的取值范围

% ret output: 染色体的编码值

flag=0;

while flag==0

pick=rand(1,length(lenchrom));

ret=bound(:,1)'+(bound(:,2)-bound(:,1))'pick; %线性插值

flag=test(lenchrom,bound,ret); %检验染色体的可行性

end

function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)

%本函数完成交叉 *** 作

% pcorss input : 交叉概率

% lenchrom input : 染色体的长度

% chrom input : 染色体群

% sizepop input : 种群规模

% ret output : 交叉后的染色体

for i=1:sizepop

% 随机选择两个染色体进行交叉

pick=rand(1,2);

while prod(pick)==0

pick=rand(1,2);

end

index=ceil(picksizepop);

% 交叉概率决定是否进行交叉

pick=rand;

while pick==0

pick=rand;

end

if pick>pcross

continue;

end

flag=0;

while flag==0

% 随机选择交叉位置

pick=rand;

while pick==0

pick=rand;

end

pos=ceil(picksum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同

pick=rand; %交叉开始

v1=chrom(index(1),pos);

v2=chrom(index(2),pos);

chrom(index(1),pos)=pickv2+(1-pick)v1;

chrom(index(2),pos)=pickv1+(1-pick)v2; %交叉结束

flag1=test(lenchrom,bound,chrom(index(1),:)); %检验染色体1的可行性

flag2=test(lenchrom,bound,chrom(index(2),:)); %检验染色体2的可行性

if flag1flag2==0

flag=0;

else flag=1;

end %如果两个染色体不是都可行,则重新交叉

end

end

ret=chrom;

clc

clear all

% warning off

%% 遗传算法参数

maxgen=50; %进化代数

sizepop=100; %种群规模

pcross=[06]; %交叉概率

pmutation=[01]; %变异概率

lenchrom=[1 1]; %变量字串长度

bound=[-5 5;-5 5]; %变量范围

%% 个体初始化

individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]); %种群结构体

avgfitness=[]; %种群平均适应度

bestfitness=[]; %种群最佳适应度

bestchrom=[]; %适应度最好染色体

% 初始化种群

for i=1:sizepop

individualschrom(i,:)=Code(lenchrom,bound); %随机产生个体

x=individualschrom(i,:);

individualsfitness(i)= (x(1)exp(-(x(1)^2 + x(2)^2)));

%-20exp(-02sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2pix(1))+cos(2pix(2)))/2)+20+271289

% 这个是我的测试函数

% 如果有这个函数的话,可以得到最优值

end

%找最好的染色体

[bestfitness bestindex]=min(individualsfitness);

bestchrom=individualschrom(bestindex,:); %最好的染色体

avgfitness=sum(individualsfitness)/sizepop; %染色体的平均适应度

% 记录每一代进化中最好的适应度和平均适应度

trace=[];

%% 进化开始

for i=1:maxgen

% 选择 *** 作

individuals=Select(individuals,sizepop);

avgfitness=sum(individualsfitness)/sizepop;

% 交叉 *** 作

individualschrom=Cross(pcross,lenchrom,individualschrom,sizepop,bound);

% 变异 *** 作

individualschrom=Mutation(pmutation,lenchrom,individualschrom,sizepop,[i maxgen],bound);

% 计算适应度

for j=1:sizepop

x=individualschrom(j,:);

individualsfitness(j)=(x(1)exp(-(x(1)^2 + x(2)^2)));

%-20exp(-02sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2pix(1))+cos(2pix(2)))/2)+20+271289

% -20exp(-02sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2pix(1))+cos(2pix(2)))/2)+20+271289;

end

%找到最小和最大适应度的染色体及它们在种群中的位置

[newbestfitness,newbestindex]=min(individualsfitness);

[worestfitness,worestindex]=max(individualsfitness);

% 代替上一次进化中最好的染色体

if bestfitness>newbestfitness

bestfitness=newbestfitness;

bestchrom=individualschrom(newbestindex,:);

end

individualschrom(worestindex,:)=bestchrom;

individualsfitness(worestindex)=bestfitness;

avgfitness=sum(individualsfitness)/sizepop;

trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度

end

%进化结束

%% 结果显示

[r c]=size(trace);

figure

plot([1:r]',trace(:,1),'r-',[1:r]',trace(:,2),'b--');

title(['函数值曲线 ' '终止代数=' num2str(maxgen)],'fontsize',12);

xlabel('进化代数','fontsize',12);ylabel('函数值','fontsize',12);

legend('各代平均值','各代最佳值','fontsize',12);

ylim([-05 5])

disp('函数值 变量');

% 窗口显示

disp([bestfitness x]);

以上就是关于粒子群优化算法(PSO)的matlab运行程序~~谢谢大家啦!全部的内容,包括:粒子群优化算法(PSO)的matlab运行程序~~谢谢大家啦!、MATLAB线性神经网络的程序,跪求。。、matlab反向种群怎么建立等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10104708.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存