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));