单亲遗传算法matlab,关于单亲遗传算法的matlab代码

这段代码是基于遗传算法解决车辆路径问题(VRP)的一个实例,现需要将其转换为单亲遗传算法。主要修改点在于交叉和变异操作。交叉操作应仅基于一个父代生成子代,而变异操作则应保持个体的部分特征。通过调整交叉概率和变异概率,可以实现单亲遗传算法的简化版本。
摘要由CSDN通过智能技术生成

我这里有一个关于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值