这里的装箱问题和我们在算法意义上的装箱问题不是一个概念!也就是不同于下面这篇博客里的装箱问题。

【C++】2018华为软挑:模拟退火+贪心FF解决装箱问题_玛丽莲茼蒿的博客-CSDN博客本文的主要工作是补充这篇博客的缺失代码,使之能够运行。2018华为软挑--模拟退火+FF解决装箱问题【C++代码】_小马哥MAX的博客-CSDN博客算法简介:装箱问题是一个NP完全问题,求解全局最优解有很多种方法:遗传算法、禁忌搜索算法、蚁群算法、模拟退火算法等等,本次使用模拟退火,它的优点是在参数合适的情况下基本上可以100%得到全局最优解,缺点是相较于其他算法,其稳定速度较慢。如果你对退火的物理意义还是晕晕的,没关系我们还有更为简单的理解方式。想象一下如果我们现在有下...https://blog.csdn.net/qq_44886213/article/details/124209211?spm=1001.2014.3001.5502

一、二维装箱问题描述

只有一个固定长、宽的箱子。我们有多个不同长、宽的物体。求解是否有一个方案能把物体全部放进去,并且求解最省空间的方法。

二、完整代码

2.1 主程序调用及模拟退火部分

clear
clc    %%清空环境变量%
%            可以读取不同的母板尺寸数据以及待排样矩形件的尺寸数量
%
Yuanliao=[25,21];       %设定母板长度和宽度
BC=xlsread('pakagexls.xls','sheet2'); %读取数据
starttime=cputime; p=size(BC,1);%size(BC,1)返回矩阵BC的行数,size(BC,2)返回列数
cc=randperm(p);     %产生一个初始下料序列xx=[zeros(p,1)';-ones(p,1)']; %生成一个第一行全 0,第二行全-1 的矩阵后面交换所用
plot([0,Yuanliao(1),Yuanliao(1),0,0],[0;0;Yuanliao(2);Yuanliao(2);0],'--*b');   %绘制原料板tic;
hold on;
rate0=1;
c0=cc;
x0=xx(1,:);
best=1;
t0=1000;             %初始温度
tf=1;                %结束温度
dt=0.9;
nk=200;              %最大迭代次数 200 % for kk=1:5           %循环 5 次,为了使得到的解真是最优的
tk=t0;
while tk>tf %%%   进入内循环,内循环 200 次for k=1:nk c=cc; x=xx; jjj=floor(p*rand+1);     %  产生一个邻域是的解iii=floor(p*rand+1);     %%% kk=floor(p*rand+1); a=c(iii); c(iii)=c(jjj); c(jjj)=a; x(:,kk)=[x(2,kk);x(1,kk)];   %交换被选中的列的第一行和第二行,从而控制下料的横放竖放[rate,~]=LOW(BC,c,x(1,:),Yuanliao,0);%调用 LOW 函数进行下料的排序返回剩料率,调用函数中 0 是负责画图的选项0 表示不画图1 表示画图df=exp(-(rate-rate0)/tk); if rate>rate0 df=exp(-(rate-rate0)/tk); if df>rand cc=c; xx=x; rate0=rate; end else cc=c; xx=x; rate0=rate; end if rate0<best   %%   更新历史最优值best=rate0; c0=cc; x0=xx; end end tk=tk*dt;
end
disp('箱子总数p');
p
time=cputime-starttime
toc
% end
[rate,R]=LOW(BC,c0,x0(1,:),Yuanliao,1)   %利用求的最优解调用 LOW 函数,输出最优剩料率,R 为最后的水平线。并画图。

注意,箱子(母板)的长宽信息通过代码设置,物体的数据通过excel文件读取。在excel文件中有两列,第一列是长第二列是宽。如下图

2.2 核心函数部分

function [rate,R]=LOW(BC,c,x,Yuanliao,ifplot)
downloaded_pakage_num=0; %统计放了多少个箱子
p=size(BC,1);
R=[0,0,Yuanliao(1),0];
for i=1:p if i==1 if x(c(i))==-1 BC(c(i),:)=[BC(c(i),2),BC(c(i),1)]; end R=[R(1),BC(c(i),2),BC(c(i),1),BC(c(i),2);... BC(c(i),1),R(2),R(3),R(2)]; S(i,:)=BC(c(i),:); if ifplot==1 plot([0,S(i,1),S(i,1),0,0],[0,0,S(i,2),S(i,2),0]) hold on; downloaded_pakage_num=downloaded_pakage_num+1; %!!!!!!!end end if i~=1 if x(i)==-1 BC(c(i),:)=[BC(c(i),2),BC(c(i),1)]; end k=find(R(:,2)==min(R(:,2))); [~,k]=sort(R(:,2)); n=size(R,1); S(i,:)=BC(c(i),:); for ii=1:size(k,1) if  ((R(k(ii),3)-R(k(ii),1))==BC(c(i),1))&&((Yuanliao(2)- R(k(ii),2))>BC(c(i),2)||(Yuanliao(2)-R(k(ii),2))==BC(c(i),2)) %------------------R(k(ii),:)=[R(k(ii),1),BC(c(i),2)+R(k(ii),2),BC(c(i),1)+R(k(ii),1),BC(c(i),2)+R(k(ii),2)]; if ifplot==1 plot([R(k(ii),1),R(k(ii),3),R(k(ii),3),R(k(ii),1),R(k(ii),1)],... [R(k(ii),2)-S(i,2),R(k(ii),2)- S(i,2),R(k(ii),4),R(k(ii),4),R(k(ii),2)-S(i,2)]) hold on; downloaded_pakage_num=downloaded_pakage_num+1; %!!!!!!!end break; elseif  ((R(k(ii),3)-R(k(ii),1))>BC(c(i),1))&&((Yuanliao(2)- R(k(ii),2))>BC(c(i),2)||(Yuanliao(2)-R(k(ii),2))==BC(c(i),2)) R(n+1,:)=[BC(c(i),1)+R(k(ii),1),R(k(ii),2),R(k(ii),3),R(k(ii),4)] ; R(k(ii),:)=[R(k(ii),1),BC(c(i),2)+R(k(ii),2),BC(c(i),1)+R(k(ii),1),BC(c(i),2)+R(k(ii),2)]; if ifplot==1 plot([R(k(ii),1),R(k(ii),3),R(k(ii),3),R(k(ii),1),R(k(ii),1)],... [R(k(ii),2)-S(i,2),R(k(ii),2)-S(i,2),R(k(ii),4),R(k(ii),4),R(k(ii),2)-S(i,2)]) hold on; downloaded_pakage_num=downloaded_pakage_num+1; %!!!!!!!end break; end if  ((R(k(ii),3)-R(k(ii),1))==BC(c(i),2))&&((Yuanliao(2)-R(k(ii),2))>BC(c(i),1)||(Yuanliao(2)-R(k(ii),2))==BC(c(i),1)) %------------------R(k(ii),:)=[R(k(ii),1),BC(c(i),1)+R(k(ii),2),BC(c(i),2)+R(k(ii),1),BC(c(i),1)+R(k(ii),2)]; if ifplot==1 plot([R(k(ii),1),R(k(ii),3),R(k(ii),3),R(k(ii),1),R(k(ii),1)],... [R(k(ii),2)-S(i,1),R(k(ii),2)-S(i,1),R(k(ii),4),R(k(ii),4),R(k(ii),2)-S(i,1)]) hold on; downloaded_pakage_num=downloaded_pakage_num+1; %!!!!!!!end break; elseif  ((R(k(ii),3)-R(k(ii),1))>BC(c(i),2))&&((Yuanliao(2)-R(k(ii),2))>BC(c(i),1)||(Yuanliao(2)-R(k(ii),2))==BC(c(i),1)) R(n+1,:)=[BC(c(i),2)+R(k(ii),1),R(k(ii),2),R(k(ii),3),R(k(ii),4)] ; R(k(ii),:)=[R(k(ii),1),BC(c(i),1)+R(k(ii),2),BC(c(i),2)+R(k(ii),1),BC(c(i),1)+R(k(ii),2)]; if ifplot==1 plot([R(k(ii),1),R(k(ii),3),R(k(ii),3),R(k(ii),1),R(k(ii),1)],... [R(k(ii),2)-S(i,1),R(k(ii),2)-S(i,1),R(k(ii),4),R(k(ii),4),R(k(ii),2)-S(i,1)]) hold on; downloaded_pakage_num=downloaded_pakage_num+1; %!!!!!!!end break; end end b=unique(R(:,2)); if size(b,1)~=size(R(:,2),1) for i=1:size(b,1) t=find(R(:,2)==b(i)); if size(t,1)~=1 for ii=1:size(t,1)-1 if (R(t(ii),3)==R(t(ii+1),1))||(R(t(ii),1)==R(t(ii+1),3)) SS=[min(R(t(ii),1),R(t(ii+1),1)),R(t(ii),2),... max(R(t(ii),3),R(t(ii+1),3)),R(t(ii),2)]; R(t(ii+1),:)=SS; R(t(ii),:)=0; end end end end end R(all(R==0,2),:)=[]; end
end
Area=0;
for i=1:size(R,1) Area=Area+(R(i,3)-R(i,1))*(Yuanliao(2)-R(i,4));
end
rate=Area/(Yuanliao(1)*Yuanliao(2));
downloaded_pakage_num %输出一共放好了多少箱子

2.3 运行结果解析

为了方便看懂,对其中某些结果进行解释:

1. 最低水平线

我们用虚线画出了最低水平线。

输出的结果R应该是离最低水平线最近的物体的坐标,图中我写的“最低水平线的坐标”是不对的,不想改了。这个R应该一行一行的看,每一行由:x1,y1;x2,y2组成,把(x1,y1)和(x2,y2)连起来便是一条线。

2. 剩余率

先说容积率,箱子的容积率所有物体的面积除以箱子最低水平线下的面积。用1减去容积率便是剩余率,越小越好。

3.CPU运行时间

用两种方法给出了CPU运行时间,一般以第二种为准。

【Matlab】模拟退火+最低水平线解决物流上的二维装箱问题相关推荐

  1. MATLAB模拟退火算法求解超市物流配送选址问题实例

    模拟退火算法编程问题实例: MATLAB模拟退火算法求解超市物流配送选址问题实例 在范围为(0,0)到(100,100)的矩形区域内,散布着40个连锁超市,各个连锁超市的坐标及需求量见表1.要求在该矩 ...

  2. 二维码上传失败如何处理?怎么解决无法解析的二维码?

    有些小伙伴可能会遇到过想要对二维码美化处理,但是上传二维码之后出现解析失败的提示,那么遇到这个问题该如何处理呢?今天小编给大家分享一下二维码生成器处理这个问题的方法,而且还可以同步对二维码图片做美化处 ...

  3. matlab如何读取二维数组,Matlab从csv文件中读取多个二维数组

    我有一个csv文件,它包含2列4列数组,但行数不等.例如:Matlab从csv文件中读取多个二维数组 2, 354, 23, 101 3, 1023, 43, 454 1, 5463, 45, 765 ...

  4. QReader:Chrome 浏览器上的二维码阅读器

    在 Chrome 上利用扩展生成二维码不稀奇, QR Code Generator 这个扩展就可以实现,并且这样的扩展在 Chrome Web Store 随便一搜都能出现一大堆.但是,直接在 Chr ...

  5. 利用matlab实现POD分解(在一维信号或二维流场矢量中的应用)

    利用matlab实现POD分解(在一维信号或二维流场矢量中的应用) 0 前言 0.1 matlab中特征值计算 0.2 matlab中SVD分解计算 0.3 信号的正交性 1 一维信号POD分解 1. ...

  6. 如何批量在图片上加二维码?

    二维码可以包含很多的信息,比如联系方式,个人简介等信息,所以很多小伙伴都想推广自己的二维码,所以有不少人将二维码加在图片上以达到更好的推广效果. 在图片上加二维码其实和在图片上加logo水印的方式是一 ...

  7. java在底图上生成二维码以及文字

    java在底图上生成二维码以及文字 1.添加依赖 <dependency><groupId>cn.hutool</groupId><artifactId> ...

  8. MATLAB笔记之复数以及基本复数函数二维视角(2d)图形绘制

    MATLAB笔记之复数以及基本复数函数二维视角(2d)图形绘制 QQ:3020889729 小蔡 一般复数的2d图形绘制 一般复数的平移图形~(即一个复数加另一个复数实现在复平面的平移) 补充几个复数 ...

  9. vue二维码解码器(增加上传二维码之后弹窗预览)

    对之前的二维码解码器做的功能扩展, 增加上传成功时弹框显示二维码图片预览,弹框使用vant ui 实现 vanr ui 文档地址 https://youzan.github.io/vant/#/zh- ...

最新文章

  1. 准确性 敏感性 特异性_如何掌握类型特异性的艺术
  2. Bootstrap全局CSS样式之表单
  3. python3.7是什么_Python 3.7 有什么新变化
  4. java toolkit invoker_关于invokeInitFramework 方法未实现的问题
  5. 如何关联php5与apche,PHP5在Apache下的两种模式的安装_php
  6. 多线程 NSThread 的使用
  7. open gapps各版本详细介绍
  8. 苹果系统“加载图片时提示“无法置入jpg,因为暂存盘已满”怎么解决?
  9. 程序员的必备装备——为健康加油
  10. 销售的几种层次-销售笔记
  11. 基于SVM的猫咪图片识别器
  12. python 生成pdf 文字和图片_Python系列—PDF文本与图片抽取
  13. C/C++ 如何构造出强悍的宏
  14. 番茄工作法总结-第三章:方法
  15. smartupload工具上传文件
  16. 什么是职业规划?如何进行职业规划?
  17. 想精通 Python 数据挖掘?清华博士带你入门!
  18. pinia 介绍与安装
  19. 济南广电无线路由PPoE拨号连接不上解决
  20. 【diannaoxitong】支付宝余额宝是什么?阿里巴巴余额宝功能介绍

热门文章

  1. 微软oneDrive网站打不开
  2. PHP防SQL注入代码,PHP 预防CSRF、XSS、SQL注入攻击
  3. React Native小菜鸡的踩坑排雷记录(1)
  4. ZIP文件格式-笔记
  5. 小功率静电保护器与TVS管选型,看完醍醐灌顶
  6. virtual和override作用和使用场景及理解
  7. iphone相册储存空间已满_苹果手机存储空间满了怎么办?
  8. 搭建eth开发环境_1_centos 环境搭建笔记
  9. 做加推的超级IP名片店铺原来这么赚钱!
  10. 【软考:网工】华为配置篇——ACL、DHCP和NAT