%
% @作者:随心390
% @微信公众号:优化算法交流地
%
clear
clc
%% 创建数据
% value=[3,4,9,15,2,4,6,8,10,2.5,5,7,10,12,3,3,5,10,10,2]; %20个物品的价值
% weight=[10,13,24,32,4,12,15,22,26,5.2,14,18,25,28,6.8,14,14,28,32,6.8]; %20个物品的重量
% cap=92; %每个背包的装载量为92
value=[200,208,198,192,180,180,168,176,182,168,187,138,184,154,168,175,198,...
184,158,148,174,135, 126,156,123,145,164,145,134,164,134,174,102,149,134,...
156,172,164,101,154,192,180,180,165,162,160,158,155, 130,125];
weight=[80,82,85,70,72,70,82,75,78,45,49,76,45,35,94,49,76,79,84,74,76,63,...
35,26,52,12,56,78,16,52, 16,42,18,46,39,80,41,41,16,35,70,72,70,66,50,55,25, 50,55,40];
cap=1000; %每个背包的装载量为92
N=length(value); %物品个数
%% 参数设置
NIND=500; %种群大小
MAXGEN=500; %迭代次数
Pc=0.8; %交叉概率
Pm=0.03; %变异概率
GGAP=0.9; %代沟(Generation gap)
%% 初始化种群
Chrom=InitPop(NIND,N,weight,cap);
%% 优化
gen=0;
figure;
hold on;box on
xlim([0,MAXGEN])
title('优化过程')
xlabel('代数')
ylabel('最优值')
ObjV=allValue(Chrom,value,weight); %计算每个染色体的物品总价值
preObjV=max(ObjV);
while gen<MAXGEN
%计算适应度
ObjV=allValue(Chrom,value,weight); %计算每个染色体的物品总价值
line([gen-1,gen],[preObjV,max(ObjV)]);pause(0.0001)
preObjV=max(ObjV);
FitnV=ObjV;
%选择
SelCh=Select(Chrom,FitnV,GGAP);
%交叉操作
SelCh=Recombin(SelCh,Pc);
%变异
SelCh=Mutate(SelCh,Pm);
%重插入子代的新种群
Chrom=Reins(Chrom,SelCh,ObjV);
%调整种群染色体,将不满足载重量约束的染色体进行调整
Chrom=adjustChrom(Chrom,weight,cap);
%更新迭代次数
gen=gen+1 ;
end
%% 找出最优解
ObjV=allValue(Chrom,value,weight); %计算每个染色体的物品总价值
[maxObjV,maxInd]=max(ObjV);
bestChrom=Chrom(maxInd,:);
[sumV,sumW]=chromVW(N,bestChrom,value,weight);
best=[0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,1,1,1,1,1,0,1];
[sumBV,sumBW]=chromVW(N,best,value,weight);
评论0
最新资源