遗传算法选址代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
%% GA
clc %清屏
clear %删除工作区间变量
%% 参数初始化
popsize=100;
lenchrom=2;
pc=0.8;
pm=0.03;
maxgen=100;
bound=[0 60;0 35];
%%a矩阵,各区重心点坐标
a=[13.964 6.390;11.265 14.095;9.755 17.925;9.750 22.868;
10.010 27.668;17.760 6.682;19.870 11.660;17.960 18.880;
17.395 23.000;18.192 29.131;23.312 5.203;22.114 12.617;
23.670 19.639;23.167 23.413;22.804 27.228;28.400 7.940;
28.870 12.820;28.866 18.521;28.290 23.690;28.304 27.915;
33.976 23.961;37.897 16.702;39.270 11.630;43.500 14.700;
39.854 7.780;52.930 9.170];
%%计算第一个超市到全区距离和
S1=0;
for m=1:26
S1=S1+sqrt((18.450-a(m,1))^2+(17.420-a(m,2))^2);
end
%%产生初始粒子和速度
for i =1:popsize
%随机产生一个种群
GApop(i,:)=Code(lenchrom,bound);
%计算适应度
fitness(i)=fun(GApop(i,:),a);
end
%找最好的染色体
[bestfitness bestindex]=min(fitness);
zbest= GApop(bestindex,:);
gbest= GApop;
fitnessgbest= fitness;
fitnesszbest=bestfitness;
%%迭代寻优
for i=1:maxgen
i;
%种群更新 GA
GApop=Select(GApop, fitness, popsize);
%交叉操作GA
GApop=Cross(pc,lenchrom,GApop,popsize,bound);
%% GA
clc %清屏
clear %删除workplace变量
%% 参数初始化
popsize=100; %种群规模
lenchrom=2; %变量字串长度
pc=0.8;
pm=0.03;
maxgen=100;
%种群
bound=[0 60;0 35];
%%a矩阵,各区重心点坐标
a=[13.964 6.390;11.265 14.095;9.755 17.925;9.750 22.868;
10.010 27.668;17.760 6.682;19.870 11.660;17.960 18.880;
17.395 23.000;18.192 29.131;23.312 5.203;22.114 12.617;
23.670 19.639;23.167 23.413;22.804 27.228;28.400 7.940;
28.870 12.820;28.866 18.521;28.290 23.690;28.304 27.915;
33.976 23.961;37.897 16.702;39.270 11.630;43.500 14.700;
39.854 7.780;52.930 9.170];
%%计算第一个超市到全区距离和
Pz2=0;
for m=1:26
Pz2=Pz2+55/((18.450-a(m,1))^2+(17.420-a(m,2))^2);
end
%%产生初始粒子和速度
for i =1:popsize
%随机产生一个种群
GApop(i,:)=Code(lenchrom,bound);
%计算适应度
fitness(i)=fun(GApop(i,:),a);
end
%找最好的染色体
[bestfitness bestindex]=max(fitness);
zbest= GApop(bestindex,:);
gbest= GApop;
fitnessgbest= fitness;
fitnesszbest=bestfitness;
%%迭代寻优
for i=1:maxgen
i;
%种群更新 GA
GApop=Select(GApop, fitness, popsize);
%交叉操作GA
GApop=Cross(pc,lenchrom,GApop,popsize,bound);
%变异操作GA
GApop=Mutation(pm, lenchrom, GApop, popsize,[i maxgen],bound);
pop= GApop;
for j=1:popsize
Pz1=fun(pop(j,:),a);
if Pz2
end
%个体最优更新
if fitness(j)
fitnessgbest(j) = fitness(j);
end
%群体最优更新
if fitness(j)
fitnesszb
est= fitness(j);
end
end
yy(i)= fitnesszbest;
end
%%结果
disp '*************best coordinate***********'
zbest
plot(yy,'linewidth',2);
title(['适应度曲线 ' '终止代数=' num2str(maxgen)]);
xlabel('进化代数');ylabel('适应度');
grid on
%%适应度函数
function Pz1=fun(x,a)
Pz1=0;
for m=1:26
Pz1=Pz1+33/((x(1)-a(m,1))^2+(x(2)-a(m,2))^2);
end
end
%染色体编码算法如下:
function ret=Code(lenchrom,bound)
%本函数将变量编码成染色体,用于随机初始化一个种群
% lenchrom input : 染色体长度
% bound input : 变量的取值范围
% ret output : 染色体的编码值
flag=0;
while flag==0
pick=rand(1,lenchrom);
ret=bound(:,1)'+(bound(:,2)-bound(:,1))' .*pick;
flag=test(lenchrom,bound,ret);
end
%选择算子程序如下:
function ret=Select(individuals,fitness,sizepop)
% 本函数对每一代种群中的染色体进行选择,以进行后面的交叉和变异
% individuals input : 种群信息
% fitness input : 适应度
% sizepop input : 种群规模
% opts input : 选择方法的选择
% ret output : 经过选择后的种群
fitness= 1 ./(fitness);
sumfitness= sum(fitness);
sumf= fitness ./sumfitness;
index=[ ];
for i= 1:sizepop
pick=rand;
while pick ==0
pick=rand;
end
for j = 1:sizepop
pick=pick-sumf(j);
if pick<0
index=[index j];
break;
end
end
end
individuals= individuals(index,:);
fitness=fitness(index);
ret= individuals;
%交叉算子MATLAB程序如下;
function ret =Cross(pcross, lenchrom, chrom, sizepop,bound)
%本函数完成交叉操作
% pcross 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(pick .*sizepop);
% 交叉概率决定是否进行交叉
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(pick .*sum(lenchrom));
pick=rand; %交叉开始
v1=chrom(index(1),pos)
v2=chrom(index(2),pos)
chrom(index(1),pos)=pick*v2+(1-pick)*v1;
chrom(index(2),pos)=pick*v1+(1-pick)*v2;
flag1=test(lenchrom,bound,chrom(index(1),:));
flag2=test(lenchrom,bound,chrom(index(2),:));
if flag1*flag2==0
flag=0;
else flag=1;
end
end
end
ret=chrom;
%检验染色体可行性程序如下:
function flag
=test(lenchrom,bound,code)
% lenchrom input : 染色体长度
% bound input : 变量的取值范围
% code output : 染色体的编码值
%初始变量
flag=1;
[n,m]=size(code);
for i=1:n
if code(i)
flag=0;
end
end
%变异算子程序如下:
function ret =Mutation(pmutation, lenchrom, chrom, sizepop, pop,bound)
%本函数完成变异操作
% pmutation input : 变异概率
% lenchrom input : 染色体的长度
% chrom input : 染色体群
% sizepop input : 种群规模
% pop input : 当前种群的进化代数和最大的进化代数信息
% ret output : 变异后的染色体
for i=1:sizepop
%随机选择一个染色体进行变异
pick=rand;
while pick==0
pick=rand;
end
index=ceil(pick*sizepop);
% 变异概率决定该轮循环是否进行变异
pick=rand;
if pick> pmutation
continue;
end
flag=0;
while flag==0
% 变异位置
pick=rand;
while pick==0
pick=rand;
end
pos=ceil(pick*sum(lenchrom));
v=chrom(i,pos);
v1=v-bound(pos,1);
v2=bound(pos,2)-v;
pick=rand;
if pick>0.5
delta=v2*(1-pick^((1-pop(1)/pop(2))^2));
chrom(i,pos)=v+delta;
else
delta=v1*(1-pick^((1-pop(1)/pop(2))^2));
chrom(i,pos)=v-delta;
end
flag=test(lenchrom,bound,chrom(i,:));
end
end
ret=chrom;