遗传算法求解0-1背包问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实例一:

1.问题描述

假设:背包最大重量为300,物品的数量为10,

物品的价值:[95 75 23 73 50 22 6 57 89 98],

物品的重量:[89 59 19 43 100 72 44 16 7 64]

2.Matlab代码

(1)参数初始化,导入本问题的物品的价值和重量数据,并设定背包最大重量。

wei=[9575 23 73 50 22 6 57 89 98];

val=[89 59 19 43 100 72 44 16 7 64];

w=300; %总重量约束值

(2)随机产生数量为30的种群。生成30*10的0-1矩阵。

So =round(rand(30,10));

So=hardlim(So); %So为随机产生的矩阵,值为0或1

[ZQ,Y] = size(So);

(3)迭代次数为50代,交叉概率为90%,变异概率为5%.

ds = 50; pc = 0.9; pm = 0.05;

(4)设置适应度函数,利用惩罚函数降低不合格解的适应度,惩罚因子设为1.5.

pu=1.5;

syd =So*val'-pu*So*val'./(So*wei').*((So*wei'-w)>0).*(So*wei'-w);

figure(1);

hold on;

(5)用轮盘赌进行选择操作,用选择出的个体构成的种群替代旧的种群better1=1; ip = 1; updatef=-10; %betterl为当前算出的总价值,ip为代数

whileip<= ds

fori=1:ZQ

fi(i)=syd(i)-min(syd)+1;

end

fori=1:ZQ

sp(i)=fi(i)/sum(fi);

end

fori=2:ZQ

sp(i)=sp(i-1)+sp(i);

end

fori=1:ZQ

p=rand(1); sindex=1;

while p >sp(sindex)

sindex=sindex+1;

end

newSo(i,:)=So(sindex,:);

end

fori=1:ZQ

So(i,:)=newSo(i,:);

end

(6)设置的交叉概率pc为90%,产生要配对的父代的序号,经过50次顺序调换,将原有顺序打乱,使相邻两个个体作为交叉的父代

fori=1:ZQ

weiindex(i)=i;

end

fori=1:ZQ

point=unidrnd(ZQ-i+1);

temp=weiindex(i);

weiindex(i)=weiindex(i+point-1);

weiindex(i+point-1)=temp;

end

fori=1:2:ZQ

p=rand(1);

if(p

point=unidrnd(Y-1)+1;

for j=point:(Y-1)

ch=So(weiindex(i),j);

So(weiindex(i),j)=So(weiindex(i+1),j);So(weiindex(i+1),j)=ch;

end

end

end

(7)设置变异的概率为5%,产生50*10的0-1矩阵,对1的位置进行变异M=rand(ZQ,Y)<=pm;

So=So-2.*(So.*M)+M;

(8)产生精英染色体,you1是适应度最大的染色体,you2为适应度最小的染色体,最优解为不超过背包容量的适应度最大的syd2数组,better3即为每代的最优值,并用粉色星号画出来。

syd =So*val'-pu*So*val'./(So*wei').*((So*wei'-w)>0).*(So*wei'-w);

[better1,you1] = max(syd);

ifupdatef>=better1

better1=updatef;

So(you1,:)=updatec;

end

updatef=better1;

updatec=So(you1,:);

[better2,you2] = min(syd);

So(you2,:) = So(you1,:);

syd =So*val'-pu*So*val'./(So*wei').*((So*wei'-w)>0).*(So*wei'-w);

media = mean(syd);

ip = ip + 1;

syd2 =So*val'-So*val'.*((So*wei'-w)>0);

[better3,you3] = max(syd2);

plot(ip,better3,'-*m');

end;

(9)将最优值和参数显示出来。

syd2 =So*val'-So*val'.*((So*wei'-w)>0);

[better3,you3] = max(syd2);

best = better3; P = So;

disp(sprintf('代数: %d',ds));

disp(sprintf('种群大小: %d',ZQ));

disp(sprintf('交叉概率: %.3f',pc));

disp(sprintf('变异概率: %.3f',pm));

disp(sprintf('最优解: [%.2f]',best)); 3.结果

相关文档
最新文档