clc
clear all
global box; global cargo; global lambda; global num_cargo;global num_box;global solution;
%-------------------------------控制参数---------------------------
lambda = 0.5; % 重量利用率权重
T0 = 100; % 初始温度
T_End = 1; % 终止温度
metropolis = 100; % 退火算法中 metropolis链长度
cooling = 0.98; % 降温系数
pop = 20; %遗传算法染色体数
maxite = 100; %遗传最大迭代次数
pm = 0.1; %遗传变异概率
%--------------------------------------------------------------------
%----------------------------初始化:读取货箱信息 ----------------------------
orginal_cargo=load('cargo');box=load('box');
count=1;
for i=1:size(orginal_cargo,1) %重构货物格式 cargo: 重 长 宽 高 体积 ;其中 长>宽>高
for j=1:orginal_cargo(i,2)
cargo(count,1:4) = orginal_cargo(i,3:6);
cargo(count,5) = prod(cargo(count,2:4),2);
cargo(count,2:4) = sort(cargo(count,2:4),'descend');
count=count+1;
end
end
for i=1:size(box,1) %重构箱子box: 重 长 宽 高 体积
box(i,5)=prod(box(i,2:4),2);
end
num_cargo=size(cargo,1); % 货物数
num_box=size(box,1); % 货箱数
solution= fix((num_box)*rand(1,num_cargo))+1; %随机生成初始解
Scheme=transform(solution); %解转化成“货箱:货物”对应的形式
[feas_solution,Scheme]= placement(Scheme); %装箱处理
[PG,PV,gbest ]= evaluate(feas_solution) ; %计算适应度
%--------------------------------------------------------------------
%----------------------------退火------------------------
begin=cputime; %开始计时
%遗传算法优化 GENE(染色体数/种群规模,最大迭代次数,染色体长度/维度,变异概率)
[final_solution,gbest]=GENE(pop,maxite,num_cargo,pm) ;
%遗传执行完毕后 模拟退火进一步优化
T = T0;
while T > T_End
for i=1:metropolis
%-----------随机交换两件货物生成新解
newsolution=final_solution;
R1=fix(rand*num_cargo)+1;
R2=fix(rand*num_cargo)+1;
inter=newsolution(R1);
newsolution(R1)=newsolution(R2);
newsolution(R2)=inter;
NewScheme=transform(newsolution); % 分配货箱
[feas_solution,NewScheme]= placement(NewScheme); % 装箱处理
[NPG,NPV,pbest ]= evaluate(feas_solution); % 评估新方案
if pbest>gbest
gbest = pbest;
final_solution = newsolution;
PG = NPG;
PV = NPV;
Scheme = NewScheme;
else
if rand < exp( (pbest-gbest)*100*T0/T)
gbest=pbest;
final_solution=newsolution;
PG = NPG;
PV = NPV;
Scheme = NewScheme;
end
end
end
T = T * cooling;
end
timecost = cputime-begin; %计时结束
%----------------------------输出结果------------------------
result(Scheme,15); %将装箱方案Scheme 按每行15个货物显示
fprintf('重量利用率:\t%5.3f %%\n',PG*100);
fprintf('空间利用率:\t%5.3f %%\n',PV*100);
fprintf('综合利用率:\t%5.3f %%\n',gbest*100);
fprintf('计算时间:\t\t%5.4f s\n',timecost);
disp('图像生成中...')
depict( Scheme, 1,'c' ) % ( 方案,画出编号为i箱子,颜色) 颜色:r\g\b\c\m\y\k\w
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.