多重背包问题matlab,一个类似背包问题的遗传算法:价值和最小,重量有下限

clc

clear all

close all

% 容量低限值 w

w = 2000;

% 容量

unit_capacity =  [1000,1000,680,660,500,800];

% 费用

unit_shutdowncost = [3,4,1,2,3,1];

n = length(unit_capacity);

%% 随机产生数量为n的种群。生成n*n的0-1矩阵。

So = round(rand(n*10,n));

% So为随机产生的矩阵,值为0或1

So = hardlim(So);

[ZQ,Y] = size(So);

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

ds = 1000; pc = 0.99; pm = 0.05;

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

pu=1.5;

% syd =So*unit_shutdowncost' - pu*So*unit_shutdowncost'./(So*unit_capacity').*((So*unit_capacity'-w)>0).*(So*unit_capacity'-w);

syd = (So*unit_shutdowncost' - pu*(So*unit_shutdowncost').*((So*unit_capacity'-w)>=0));

%syd =So*unit_shutdowncost' - pu*So*unit_shutdowncost'.*((So*unit_capacity'-w)<=0);

figure(1);

hold on;

%% 用轮盘赌进行选择操作,用选择出的个体构成的种群替代旧的种群

better1=1;

ip = 1;

updatef=-10;

% better1 为当前算出的总价值,ip为代数

while ip<= ds

ip

for i=1:ZQ

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

end

for i=1:ZQ

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

end

for i=2:ZQ

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

end

for i=1:ZQ

p=rand(1);

sindex=1;

while p >sp(sindex)

sindex=sindex+1;

end

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

end

for i=1:ZQ

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

end

%% 设置的交叉概率pc为90%,产生要配对的父代的序号,经过50次顺序调

%% 换,将原有顺序打乱,使相邻两个个体作为交叉的父代

for i=1:ZQ

weiindex(i)=i;

end

for i=1:ZQ

point=unidrnd(ZQ-i+1);

temp=weiindex(i);

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

weiindex(i+point-1)=temp;

end

for i=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

%% 设置变异的概率为5%,产生n*n的0-1矩阵,对1的位置进行变异

M=rand(ZQ,Y)<=pm;

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

%% 产生精英染色体,you1是适应度最大的染色体,you2为适应度最小的染色

%% 体,最优解为不超过背包容量的适应度最大的syd2数组,better3即为每

%% 代的最优值,并用粉色星号画出来

%syd =So*unit_shutdowncost' - pu*So*unit_shutdowncost'./(So*unit_capacity').*((So*unit_capacity'-w)>0).*(So*unit_capacity'-w);

syd = (So*unit_shutdowncost' - pu*(So*unit_shutdowncost').*((So*unit_capacity'-w)>=0));

%syd =So*unit_shutdowncost' - pu*So*unit_shutdowncost'.*((So*unit_capacity'-w)<=0);

[better1,you1] = min(syd);

if updatef>=better1

better1=updatef;

So(you1,:)=updatec;

end

updatef=better1;

updatec=So(you1,:);

[better2,you2] = max(syd);

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

%syd =So*unit_shutdowncost' - pu*So*unit_shutdowncost'./(So*unit_capacity').*((So*unit_capacity'-w)>0).*(So*unit_capacity'-w);

syd = (So*unit_shutdowncost' - pu*(So*unit_shutdowncost').*((So*unit_capacity'-w)>=0));

%[(So*unit_shutdowncost') ((So*unit_capacity'-w)>=0) So*unit_capacity' (So*unit_shutdowncost').*((So*unit_capacity'-w)>=0)]

%syd =So*unit_shutdowncost' - pu*So*unit_shutdowncost'.*((So*unit_capacity'-w)<=0);

media = mean(syd);

ip = ip + 1;

%syd2 =So*unit_shutdowncost' - So*unit_shutdowncost'.*((So*unit_capacity'-w)>0);

syd2 =So*unit_shutdowncost';% - So*unit_shutdowncost'.*((So*unit_capacity'-w)>=0);

[better3,you3] = min(syd2);

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

end

%% 将最优值和参数显示出来

%syd2 =So*unit_shutdowncost' - So*unit_shutdowncost'.*((So*unit_capacity'-w)>0);

syd2 =So*unit_shutdowncost';% - So*unit_shutdowncost'.*((So*unit_capacity'-w)>=0);

[better3,you3] = min(syd2);

best = better3;

P = unique(So,'rows')

cs = P*unit_capacity';

sc = P*unit_shutdowncost';

[cs sc]

sc2 = (cs>=w).*sc;

minV = min(sc2(sc2~=0));

[I,J] = find(sc2==minV);

PP = P(I,:)

CC = PP*unit_capacity';

SS = PP*unit_shutdowncost';

[CC SS]

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值