基于 三维装箱问题的算法研究-1 的基础上,对整个装箱过程发生的函数进行封装

# -*- coding: utf-8 -*-
from matplotlib import pyplot as plt
#设置图表刻度等格式
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
from mpl_toolkits.mplot3d import Axes3D
import numpy as np#make_pic内置函数
def box(ax,x, y, z, dx, dy, dz, color='red'):xx = [x, x, x+dx, x+dx, x]yy = [y, y+dy, y+dy, y, y]kwargs = {'alpha': 1, 'color': color}ax.plot3D(xx, yy, [z]*5, **kwargs)#下底ax.plot3D(xx, yy, [z+dz]*5, **kwargs)#上底ax.plot3D([x, x], [y, y], [z, z+dz], **kwargs)ax.plot3D([x, x], [y+dy, y+dy], [z, z+dz], **kwargs)ax.plot3D([x+dx, x+dx], [y+dy, y+dy], [z, z+dz], **kwargs)ax.plot3D([x+dx, x+dx], [y, y], [z, z+dz], **kwargs)return ax
#显示图形的函数:Items = [[num[0],num[1],num[2],num[3],num[4],num[5],num[6]],]
def make_pic(Items):fig = plt.figure()ax = Axes3D(fig)ax.xaxis.set_major_locator(MultipleLocator(50)) ax.yaxis.set_major_locator(MultipleLocator(50)) ax.zaxis.set_major_locator(MultipleLocator(50)) for num in Items:box(ax,num[0],num[1],num[2],num[3],num[4],num[5],num[6])plt.title('Cube')plt.show()
#把尺寸数据生成绘图数据
def make(O,C,color):data = [O[0],O[1],O[2],C[0],C[1],C[2],color]return data
#可用点的生成方法
def newsite(O,B_i):# 在X轴方向上生成O1 = (O[0]+B_i[0],O[1],O[2])# 在Y轴方向上生成O2 = (O[0],O[1]+B_i[1],O[2])# 在Z轴方向上生成O3 = (O[0],O[1],O[2]+B_i[2])return [O1,O2,O3]
#3.拟人化依次堆叠方体
def packing3D(show_num,color,O,Box_list):canput = 0O_items = [O]O_pop = []for i in range(0,len(Box_list)):#货物次序应小于等于可用点数量,如:第四个货物i=3,使用列表内的第4个放置点O_items[3],i+1即常见意义的第几个,len即总数,可用点总数要大于等于目前个数if i+1 <= len(O_items):#如果放置点放置货物后,三个方向都不会超过箱体限制,则认为可以堆放if O_items[i-1][0]+Box_list[i][0]<=C[0] and O_items[i-1][1]+Box_list[i][1]<=C[1] and O_items[i-1][2]+Box_list[i][2]<=C[2]:#使用放置点,添加一个图显信息new_show = make(O_items[i-1],Box_list[i],color)if new_show not in show_num:show_num.append(make(O_items[i-1],Box_list[i],color))#计数加1canput = len(show_num) - 1#把堆叠后产生的新的点,加入放置点列表for new_O in newsite(O_items[i-1],Box_list[i]):#保证放入的可用点是不重复的if new_O not in O_items:O_items.append(new_O)#如果轮到的这个放置点不可用else:#把这个可用点弹出弃用O_pop.append(O_items.pop(i-1))#弃用可用点后,货物次序应小于等于剩余可用点数量if i+1 <= len(O_items):# and len(O_items)-1>=0:#当可用点一直不可用时while O_items[i-1][0]+Box_list[i][0]>C[0] or O_items[i-1][1]+Box_list[i][1]>C[1] or O_items[i-1][2]+Box_list[i][2]>C[2]:#一直把可用点弹出弃用O_pop.append(O_items.pop(i-1))#如果弹出后货物次序超出剩余可用点,则认为无法继续放置if i-1 > len(O_items)-1:break#货物次序应小于等于剩余可用点数量if i+1 <= len(O_items):#如果不再超出限制,在这个可用点上堆叠new_show = make(O_items[i-1],Box_list[i],color)if new_show not in show_num:show_num.append(make(O_items[i-1],Box_list[i],color))#计数加1canput = len(show_num) - 1#把堆叠后产生的新的点,加入放置点列表for new_O in newsite(O_items[i-1],Box_list[i]):#保证放入的可用点是不重复的if new_O not in O_items:O_items.append(new_O)return canput,O_items,O_pop
#<<<---写一个函数专门用来调整方向和计算剩余货物
def surplus(num,Box_list,change):#change='ab','bc','ac',0有三组对调可能,共6种朝向new_Box_list = Box_list[num-1:-1]if num == 0:new_Box_list = Box_listif change == 'ab':for i in range(0,len(new_Box_list)):new_Box_list[i]=(new_Box_list[i][1],new_Box_list[i][0],new_Box_list[i][2])elif change == 'bc':for i in range(0,len(new_Box_list)):new_Box_list[i]=(new_Box_list[i][0],new_Box_list[i][2],new_Box_list[i][1])elif change == 'ac':for i in range(0,len(new_Box_list)):new_Box_list[i]=(new_Box_list[i][2],new_Box_list[i][1],new_Box_list[i][0])elif change == 0:return new_Box_listelse:return new_Box_listreturn new_Box_list
#残余点二次分配函数
def twice(show_num,color,O_pop,Box_list):for a2 in O_pop:if a2[0]==0 and a2[1]==0:Plan = packing3D(show_num,color,a2,Box_list)Box_list = surplus(Plan[0],Box_list,0)elif a2[1]==0 and a2[2]==0:Plan = packing3D(show_num,color,a2,Box_list)Box_list = surplus(Plan[0],Box_list,0)elif a2[0]==0 and a2[2]==0:Plan = packing3D(show_num,color,a2,Box_list)Box_list = surplus(Plan[0],Box_list,0)return Box_list

调用这些函数进行一次初步装箱和二次转向装箱

#1.给定空间容器C      4.2*1.9*1.8
O = (0,0,0)           #原点坐标
C = (420,190,180)    #箱体长宽高
color = 'red'         #箱体颜色
#显示箱体
show_num = [make(O,C,color)]#2.给定有限量个方体 500个(60,40,50)的方体,当方体大小存在差异时,我们将按照体积大小降序排列,优先摆放大体积的
B=[(40,50,60) for num in range(0,1200)]#把货物第一次装箱
Plan1 = packing3D(show_num,'blue',(0,0,0),B)
#print(len(show_num))#把剩下的货物分出来
B2 = surplus(Plan1[0],B,'ab')#把剩下的货物再次尝试装箱,针对三个在轴线上的点为新的原点
twice(show_num,'orange',Plan1[2],B2)
print(len(show_num))make_pic(show_num)

最终显示效果


可以看到在第二次发生简单转向后,箱体的利用率再一次得到提升,这个时候装载率达到114/箱,那么如果全部货物1200件,1200/114向上舍入,11车能够装完

python:关于三维装箱问题的算法研究-2相关推荐

  1. python:关于三维装箱问题的算法研究-3

    基于 三维装箱问题的算法研究-2 的基础,对整个过程进行了优化 因为后面研究的视图依赖于Three.js进行成像,需要写一些简单的vue页面,所以把整个算法包括数据格式的调用做成了django后端系统 ...

  2. python:关于三维装箱问题的算法研究-1

    先准备一个用来图显的函数 # -*- coding: utf-8 -*- from matplotlib import pyplot as plt #设置图表刻度等格式 from matplotlib ...

  3. 目标检测YOLO实战应用案例100讲-基于激光雷达点云的三维目标检测算法研究

    目录 基于激光雷达点云的三维目标检测算法研究 基于投影图的方法 基于点云的多模态融合方法

  4. 平行轮廓线三维矿体重建算法研究

    平行轮廓线三维矿体重建算法研究   摘要: 从平行轮廓线重建三维表面是具有普遍意义的研究问题.根据一组平行轮廓线联接三角网构成三维实体必须解决三个基本问题:对应性问题(Correspondence), ...

  5. 关于装箱问题的算法研究

    装箱问题的算法研究 山东大学 赵一帆 问题描述 在箱子装载问题中,有若干个容量为c的箱子和n个待装载入箱子中的物品.物品i需占s[i]个单元(0<s[i]≤c).所谓成功装载(feasible ...

  6. 对python乱序字符串检查算法研究

    显示不同量级的算法的一个很好的例子是字符串的乱序检查.乱序字符串是指一个字符串只是另一个字符串的重新排列.例如,'heart' 和 'earth' 就是乱序字符串.'python' 和 'typhon ...

  7. 【三维装箱】基于粒子群算法求解三维装箱问题matlab源码

    1 简介 针对约束条件下三维装箱问题复杂性,为提高装箱利用率,本文提出 了混合粒子群算法,该算法采用BF启发式算法配合改进的自适应权重粒子群算法实现.通过仿真试验,结果表明该混合粒子群算法对解决部分约 ...

  8. python生成一笔画_Python系列—一笔画问题的算法研究

    原标题:Python系列-一笔画问题的算法研究 鸣谢 VSRC感谢业界小伙伴--奶权,投稿精品原创类文章.VSRC欢迎精品原创类文章投稿,优秀文章一旦采纳发布,将有好礼相送,我们已为您准备好了丰富的奖 ...

  9. 目标检测YOLO实战应用案例100讲-基于点云的三维多目标检测算法研究

    目录 基于点云的三维多目标追踪与目标检测算法研究 三维多目标追踪技术

最新文章

  1. 重复数据删除(De-duplication)技术研究
  2. Random随机数相关工具类
  3. 解决Xcode升级,导致以前安装的插件失效的办法
  4. c++数据结构中 顺序队列的队首队尾_数据结构与算法—队列详解
  5. 使用ADMT3.2迁移域用户
  6. 6818 开发板 配置 ubuntu 桌面环境 与 ROS
  7. python群发邮件 不进垃圾箱_实战邮箱群发2000封邮件不进垃圾箱
  8. 按钮下载Eclipse Color Theme
  9. 华为鸿蒙os升级怎么升,华为鸿蒙OS2.0系统怎么升级
  10. 个性化音乐推荐系统 协同过滤推荐算法在在线音乐播放系统中的应用 基于用户/项目的协同过滤推荐算法 混合协同过滤推荐算法 协同过滤混合推荐算法 代码实现开发 程序实现开发
  11. 读《白话统计》笔记——第七章
  12. 计算机cpu的字母,笔记本计算机CPU型号后缀字母HQ,U,Y的详细说明
  13. Oracle中的SQL函数(全)
  14. Python字符串内建函数
  15. Blockstack: A Global Naming and Storage System Secured by Blockchains
  16. opencv | A02 播放本地视频 调用摄像头
  17. C++每日一练:打家劫室(详解动态规划法)
  18. div+css静态网页设计web网页设计实例作业 ——中国风的茶文化(4页) web课程设计-HTML网页制作代码
  19. Python类型转换——数据类型转换函数大全
  20. canvas对象arc函数的使用-遁地龙卷风

热门文章

  1. 谷歌浏览器扩展插件不显示怎么办?
  2. jquery阻止事件冒泡的两种方法
  3. CoreMark跑分测试
  4. Unity对象和序列化原理介绍
  5. Java可以hook微信吗,【第一篇】【安卓微信】HOOK微信发消息,当HOOK遇上HOOK。
  6. html字突然变大怎么办,html中手机打开页面刷新一下闪一下字变大了是怎么回事?...
  7. Vue项目全面解析vuecil3/vuecil4的vue.config.js等常用配置
  8. 用Python制作可视化GUI界面,顺便实现自动分类整理文件
  9. vue-vue2和vue3的diff算法
  10. 【RT-ThreadART-PI】采用DMA2D加速来提高ART-PI使用LVGL的帧率