遗传算法程序代码-- 背包问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
背包问题:
clear
clc
popsize=500; %种群大小
n=50;
CW=1000; %背包大小可容纳的总重量
w=[80 82 85 70 72 70 66 50 55 25 50 55 40 48 50 32 22 60 30 32 ...
40 38 35 32 25 28 30 22 50 30 45 30 60 50 20 65 20 25 30 10 ...
20 25 15 10 10 10 4 4 2 1]; %各个物品的重量,50个个体
v=[220 208 198 192 180 180 165 162 160 158 155 130 125 122 120 118 115 110 105 101 ...
100 100 98 96 95 90 88 82 80 77 75 73 72 70 69 66 65 63 60 58 ...
56 50 30 20 15 10 8 5 3 1]; %各个物品的价值,50个个体
t=100;%迭代次数
pc=0.9; %交叉率
pm=0.05; %变异率
pop=initpop(popsize,n); %产生初始种群
for i=1:500
[objvalue]=calobjvalue(pop,n,popsize,v,w,CW); %计算目标函数
[fitvalue]=calfitvalue(objvalue); %计算群体中每个个体的适应度
[newpop]=selection(pop,fitvalue); %进行选择计算
[newpop1]=crossover(newpop,pc); %进行交叉计算
[newpop2]=mutation(newpop1,pm); %进行变异计算
[newobjvalue]=newcalobjvalue(newpop2,n,popsize,v,w,CW); %计算最新代目标函数值,经过选择交叉变异后的下一代
[newfitvalue]=newcalfitvalue(newobjvalue); %计算最新代的个体适应度
[bestweight,bestvalue]=best(newpop2,newfitvalue,w); %计算最优个体重量,价值,和位置y(i)=max(bestvalue);%记录最大价值
g(i)=max(bestweight);%记录最大重量
n(i)=i;%记录位置
pop=newpop2;%迭代重复
end
i=1:500;
plot(y(i),'-b*')
xlabel('迭代次数')
ylabel('最大价值');
title('最优点变化趋势');
legend('最优点');
grid on
[z index]=max(y);
po=n(index)%最优代数位置
W=g(index)%最优重量
V=z%最优价值
%误差率计算
%文献中的结果:算法最大迭代次数总价值为总重量为
%传统的算法400 3077 999
%佳点集算法70 3103 1000
%遗传算法75 3103 1000
%本程序中的计算与文献结果的比较
p1=(3077-V)/3077 %与传统算法相比的误差率
p2=(3103-V)/3103 %与佳点集算法相比的误差率
p3=(3103-V)/3103 %与贪心算法遗传算法相比的误差率
function [bestweight,bestvalue]=best(newpop2,newfitvalue,w)
%寻找最优个体,包括其重量和价值。
[px,py]=size(newpop2);
bestvalue=newfitvalue(1);
for i=2:px
if newfitvalue(i)>bestvalue
bestvalue=newfitvalue(i);
end
end
[z index]=max(newfitvalue);%计算最优价值,和最优重量。
bestweight=0;
for i=index;
for j=1:py
bestweight=w(j)*newpop2(i,j)+bestweight;
end
end
function [fitvalue]=calfitvalue(objvalue)
% 计算个体的适应值
%遗传算法子程序
%Name:calfitvalue.m
fitvalue=objvalue;
function [objvalue]=calobjvalue(pop,n,popsize,v,w,CW) %利用罚函数法计算目标函数及其适应度
[px,py]=size(pop);
for i=1:px
sum(i)=0;
sum1(i)=0;
for j=1:py
sum(i)=sum(i)+v(j)*pop(i,j);
sum1(i)=sum1(i)+w(j)*pop(i,j);
end
if sum1(i)>CW
sum(i)=0;
else
sum(i)=sum(i);
end
objvalue(i)=sum(i);
end
function [newpop1]=crossover(newpop,pc)
%交叉
%遗传算法子程序
%Name: crossover.m
[px,py]=size(newpop);
newpop1=zeros(px,py);
for i=1:2:px-1
ps=rand;