我这里有一个关于VRP问题的基础遗传算法的代码,可是我想要单亲遗传算法,在这基础上要怎么去修该啊。求助大家,很急,不用很复杂,只要基础一点的单亲遗传算法。谢谢大家了,拜托
function main()
clear all;
clc;
%计算实例数据
coor=[30 37 49 52 20 40 21 17 31 52 51 42 31 5 12 36 52 27 17 13 57 62 42 16 8 7 27 30 43 58 58
40 52 49 64 26 30 47 63 62 33 21 41 32 25 42 16 41 23 33 13 58 42 57 57 52 38 68 48 67 48 27]';%配送中心与零售商坐标
dealer_total=30;%零售商数量
quantity=[0 1 4 2 1 2 3 4 1 1 2 3 2 1 2 3 4 3 4 2 3 1 4 3 2 4 2 1 4 3 2];%零售商需求量
priority=[0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 2 2 2 2];%零售商配送优先级
vehicle_num=5;%可用配送车辆数量
vehicle_capacity=20;%配送车辆容量
qidong=30;%启动成本
pop_size=50;%种群大小
iteration_max=300;%迭代次数上限
%计算两点间距离
dist=pdist(coor,'euclidean');
dist=squareform(dist);
%初始化种群
tmp=ones(1,dealer_total);
tmp=cumsum(tmp)+1;
pop=zeros(pop_size,dealer_total);
%随机生成初始种群
tmp=ones(1,dealer_total);
tmp=cumsum(tmp)+1;
for i=1:pop_size
ind=randperm(dealer_total);
pop(i,:)=tmp(ind);
end
%基本遗传算法迭代循环
for step=1:iteration_max
%计算适应度
for i=1:pop_size
[Fit(i)]=fitness(pop(i,:),vehicle_num,vehicle_capacity,dist,quantity,priority,qidong);
end
%保留最优解
[c,ind]=max(Fit);
plot_data2(step)=1/c;
sofar_best=pop(ind,:);
%轮盘赌选择
csf=cumsum(Fit);
ind=zeros(1,pop_size);
rd=rand(1,pop_size)*csf(end);
for i=1:pop_size
ind(i)=find(csf>rd(i),1,'first');
end
pop=pop(ind,:);
pop(1,:)=sofar_best;
pop_=zeros(size(pop));
%交叉操作
for i=1:2:pop_size
if rand>0.8
pop_([i,i+1],:)=pop([i,i+1],:);
else
p1=pop(ceil(rand*pop_size),:);
p2=pop(ceil(rand*pop_size),:);
swpt=ceil(dealer_total*rand);
order=p1(1:swpt);
[p,ind]=sort(p2);
p2(ind(order-1))=[];
pnew =[p1(1:swpt) p2];
pop_(i,:)=pnew;
pop_(i+1,:)=p1;
end
end
pop=pop_;
%变异操作
for i=1:pop_size
if rand>0.07
continue;
end
swpt1=ceil(dealer_total*rand);
swpt2=ceil(dealer_total*rand);
swptlo=min(swpt1,swpt2);
swpthi=max(swpt1,swpt2);
order=1:dealer_total;
order(swptlo:swpthi)=order(swpthi:-1:swptlo);
pnew = pop(i,order);
pop(i,:)=pnew;
end
pop(1,:)=sofar_best;
end