pop=5;
n=10;
VN=[0.1 0.2 0.3 0.84 0.44 0.59 0.7 0.12 0.44 0.22];%节点脆弱性
[N,L]=size(VN);
a=zeros(N,L);%脆弱性满足选址限制
for i=1:N
for j=1:L
if VN(i,j)<=0.5
a(i,j)=1
else
a(i,j)=0
end
end
end
VR=[0 0.54 0.70 0.74 0.79 0.53 0.61 0.77 0.15 0.95
0.66 0 0.09 0.39 0.95 0.09 0.99 0.58 0.19 0.08
0.77 0.54 0 0.68 0.33 0.11 0.53 0.93 0.04 0.11
0.35 0.72 0.53 0 0.67 0.14 0.48 0.58 0.64 0.14
0.66 0.52 0.86 0.44 0 0.68 0.80 0.02 0.28 0.17
0.42 0.99 0.48 0.02 0.83 0 0.23 0.12 0.54 0.62
0.84 0.22 0.39 0.33 0.77 0.19 0 0.86 0.70 0.57
0.83 0.11 0.67 0.42 0.17 0.50 0.90 0 0.50 0.05
0.26 0.11 0.74 0.27 0.86 0.15 0.57 0.84 0 0.93
0.61 0.06 0.52 0.20 0.99 0.05 0.85 0.21 0.45 0];
[NN,LL]=size(VR);
b=zeros(NN,LL);%脆弱性满足边的限制
for i=1:NN
for j=1:LL
if VR(i,j)<=0.5
b(i,j)=1
else
b(i,j)=0
end
end
end
P=6; % 建库个数限制
PC=[1 1 2 5 3 4 4 1 2 1];%各节点需要服务的次数
for i = 1 : pop
%% 选址
while 0<1
for j=1:n
x(i,j)=round(rand(1));
end
xx(i,:)=x(i,:).*VN;
if(sum(x(i,:),2)>=1)&(sum(x(i,:),2)<=P)&(xx(:)<=0.5) %约束:选址个数的约束;节点脆弱性限制
break
end
end
xa(i,:)=x(i,:).*a;
%% 指派
while 0<1
for j=1:n
if x(i,j)==0
y(i,(10*(j-1)+1):(10*j))=0;
else if x(i,j)==1
y(i,(10*(j-1)+1):(10*j))=round(rand(1,10));
yvr(j,:)=y(i,10*(j-1)+1:(10*j)).*VR(j,:);%计算储备点与需求点之间的脆弱性
if (yvr(:)<=0.5)&(y(i,(10*(j-1)+1):(10*j))<=xa(i,j)*b(j,:))%当且仅当在i点选址,且i点的脆弱性符合标准,i点与j点之间的脆弱性符合标准,点i才能为点j服务
end
end
end
end
yy=reshape(reshape(y,[],10)',[],10);
yyy(i,:)=sum(yy((10*(i-1)+1):(10*i),:));
PPC=repmat(PC,pop,1);
for j=1:10
yPC(i,j)=yyy(i,j)-PPC(i,j);
end
if yPC(:)>=0%约束:每个需求点至少被设施覆盖最低次数
break
end
end
end