三维装箱 程序

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

基于遗传模拟退火算法的三维装箱问题研究

从计算复杂性理论来讲,装箱问题是一个NP难题,很难精确求解。目前的求解方法主要是一些近似算法,如NF(NextFit)近似算法、FF(FirstFit)近似算法、FFD(FirstFitDecreasing)近似算法等。近似算法的求解结果与物品的体积数据有较大关系,有时在极端情况下的求解结果很不理想。

本文以三维离线装箱问题为研究对象,利用遗传算法和模拟退火算法集成的思路对该问题进行求解,并编写程序代码在Matlab 环境下进行实现。

1、问题描述

假设有一批待装货物,它们有多种货物种类,每种货物的尺寸重量是不同的,对一尺寸己知的集装箱进行装载。这里所面临的问题是在满足一定约束的条件下,需要找到一种装箱方案进行装载,能够得到一种最佳的装载效果,这里指的是空间容积率最高或者载重利用率达到最高。

2、优化模型

优化模型中的目标函数值可以评价装箱方案的优劣,本文考虑待装箱子的空间利用率最大以及所使用箱子数目最小,目标函数规定为:

其中:m 为所使用的箱子数目,Cmax为一个足够大的常数,在本文中取为1000,以保证Cmax/m为大于1 的正数,后一项为箱子的空间利用率,u为装箱方案违背约束条件时的处罚值。

注:帮人代写matlab程序,有问题请咨询qq:778961303

部分代码如下:

% Use: 遗传模拟退火算法主程序

% 输入变量(可修改量):Box:箱子的属性

% Cargo:货物的属性

% order:要求货物的装载次序%

%

% 输出:bestLoadOrder:具体装箱

% author:怡宝2号

clc;

clear;

close all;

tic

%% 数据录入

% Box=[2.33 1.78 2.197 5000]; % 货箱数据长,宽,高,限重

% Cargo=[0.94 0.68 0.39 0.249288 270.5 6;0.81 1.02 0.6 0.495720 896 2;...

% 0.81 1.02 0.70 0.578340 868 4;0.73 0.69 0.80 0.40296 240 2;...

% 1.20 0.72 0.72 0.622080 280 2;1.10 0.84 0.26 0.24024 80 1;...

% 0.80 0.74 0.72 0.426240 180 1;1.60 1.07 0.75 1.28400 774 12;...

% 1.19 1.11 1.08 1.426572 960 11;1.19 1.11 0.9 1.18810 800 10;...

% 1.40 1.16 1.20 1.948800 420 8;0.82 0.37 0.18 0.54612 40 5]; % 货物数据

%长度(m)宽度(m)高度(m)体积(m^3)重量(kg)数量order=[6,3,11,7,8,5,1,2,4,9,10,12;];

cmax=300; %所使用的箱子数参数

% save Box Box

% save Cargo Cargo

% toc

%% 模拟退火参数

tic

T=100; % 初始温度

Tend=1e-3; % 终止温度

L=5; % 各温度下的迭代次数(链长)

q=0.8; %降温速率

G=100;

%% 遗传参数

Pc=0.9; %交叉概率

Pm=0.05; %变异概率

popsize=20;

retain=10;

GGAP=0.9; %代沟

%% 加载数据

load Box

load Cargo

%%

N=size(Cargo,1); % 待装箱类别数

for i=1:popsize

chrom(i,:)=randperm(N); %随机产生一个装箱顺序

end

for i=1:popsize

tempchrom=chrom(i,:);

[RestSpace,LoadOrder]=IniOrder(tempchrom,Box,Cargo);

fitness(i)=FitFun(cmax,RestSpace,LoadOrder,Box,tempchrom,order);

end

fitness=fitness';

%% 计算迭代的次数Time

Time=ceil(double(solve(['1000*(0.8)^x=',num2str(Tend)]))); %solve('1000

*(0.8)^x=1e-3')这样也可以

count=0; %迭代计数

Obj=[]; %目标值矩阵初始化

track=[]; %每代的最优路线矩阵初始化

bestchrom=[];

%% 迭代

while T>Tend

count=count+1; %更新迭代次数

temp=[];

[temp index]=sort(fitness,'descend');

chrom=chrom(index,:);

chromone=chrom(1:retain,:);

fitnessone=temp(1:retain,:);

chromtwo=chrom(retain+1:end,:);

%% 交叉操作

SelCh=Recombin(chromtwo,Pc);

%% 变异

SelCh=Mutate(SelCh,Pm);

tempchrom=[];

for i=1:size(SelCh,1)

tempchrom=SelCh(i,:);

[RestSpace,LoadOrder]=IniOrder(tempchrom,Box,Cargo);

fitnesstwo(i,:)=FitFun(cmax,RestSpace,LoadOrder,Box,tempchrom,order);

end

for k=1:L

%% 产生新解

for j=1:(popsize-retain)

newchrom(j,:)=randperm(N);

相关文档
最新文档