python 三维装箱可视化图代码

描述

问题背景,参数,模型和约束条件可以看我前一篇文章: C++调用CPLEX实现三位装箱.这里是只给出后面用python实现三维装箱可视化的代码。

基本思路

使用python中的matplotlib库中的Axe3D方法实现多个箱子的堆叠。

代码

以下是 代码.

// An highlighted block
# -*- coding: utf-8 -*-
# @Author: tobby

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
cartonnum=10;
# %matplotlib inline

class Cartons:

    def __init__(self, x, y, z, length, width, height, xl, zl, zh, yw):
        self.x = x
        self.y = y
        self.z = z
        self.length = length
        self.width = width
        self.height = height
        self.xl = xl
        self.zl = zl
        self.zh = zh
        self.yw = yw



    def ifxl(self):
        return bool(self.xl)

    def ifzl(self):
        return bool(self.zl)

    def ifzh(self):
        return bool(self.zh)

    def ifyw(self):
        return bool(self.yw)

a=[
 [0	,	22	,	0	,	36	,	36	,	36	,	0	,	0	,	0	,	0],
 [0	,	0	,	0	,	59	,	39	,	20	,	0	,	1	,	0	,	0],
 [40	,	37	,	14	,	54	,	40	,	21	,	0	,	1	,	0	,	0],
 [59	,	0	,	0	,	58	,	37	,	21	,	0	,	1	,	0	,	1],
 [39	,	0	,	16	,	52	,	33	,	20	,	0	,	1	,	0	,	1],
 [0	,	37	,	37	,	40	,	31	,	21	,	1	,	0	,	0	,	0],
 [0	,	20	,	37	,	31	,	31	,	17	,	1	,	0	,	0	,	0],
 [42	,	0	,	0	,	31	,	17	,	16	,	0	,	0	,	1	,	0],
[36	,	32	,	0	,	26	,	23	,	14	,	0	,	0	,	1	,	0],
 [59	,	4	,	64	,	33	,	21	,	4	,	0	,	0	,	1	,	0]
# [27	,	0	,	17	,	61	,	47	,	32	,	0	,	1	,	0	,	0],
# [0	,	3	,	0	,	54	,	40	,	21	,	0	,	0	,	0	,	0],
# [21	,	36	,	0	,	54	,	40	,	21	,	1	,	0	,	0	,	0],
# [47	,	36	,	40	,	40	,	31	,	21	,	0	,	1	,	0	,	0],
# [0	,	36	,	49	,	40	,	31	,	21	,	1	,	0	,	0	,	0],
# [0	,	0	,	40	,	40	,	31	,	21	,	0	,	1	,	0	,	1],
# [47	,	5	,	0	,	31	,	31	,	17	,	0	,	0	,	1	,	0],
# [74	,	0	,	59	,	33	,	21	,	4	,	0	,	0	,	0	,	0]


]


carton = [Cartons(a[i][0],a[i][1],a[i][2],a[i][3],a[i][4],a[i][5],a[i][6],a[i][7],a[i][8],a[i][9]) for i in range(cartonnum)]

if __name__ == "__main__":
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1, projection='3d')
for i in range(0,cartonnum):
    x=carton[i].x
    y=carton[i].y
    z=carton[i].z
    if  carton[i].ifyw() and  carton[i].ifzl() :#高 宽 长
        dx=carton[i].height
        dy=carton[i].width
        dz=carton[i].length


    elif(not carton[i].ifyw() )and (carton[i].ifzl()):#宽 高 长

        dx=carton[i].width
        dy=carton[i].height
        dz = carton[i].length
    elif (not carton[i].ifyw()) and (carton[i].ifxl()):#长 高 宽
        dx = carton[i].length
        dy = carton[i].height
        dz = carton[i].width

    elif (not carton[i].ifyw() )and  (carton[i].ifzh() ):#宽 长 高
        dx=carton[i].width
        dy=carton[i].length
        dz=carton[i].height

    elif (not carton[i].ifzh() ) and (not carton[i].ifxl()) and(not carton[i].ifzl()):#高 长 宽
        dx=carton[i].height
        dy=carton[i].length
        dz=carton[i].width
    else:#长 宽 高
        dx = carton[i].length
        dy = carton[i].width
        dz = carton[i].height


    ax.bar3d(x, y, z, dx, dy, dz, shade=True)


ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z(value)')
#plt.axis('scaled')
plt.show()


具体结果

在这里插入图片描述

结尾

上一篇还是一年前写的文章,发现有很多小伙伴问可视化图的代码,小白代码写的并不好,大家多多谅解哈哈。

  • 6
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
【资源介绍】 基于DQN深度强化学习解决三维在线装箱问题python源码+项目说明.zip 问题描述 物流公司在流通过程中,需要将打包完毕的箱子装入到一个货车的车厢中,为了提高物流效率,需要将车厢尽量填满,显然,车厢如果能被100%填满是最优的,但通常认为,车厢能够填满85%,可认为装箱是比较优化的。 设车厢为长方形,其长宽高分别为L,W,H;共有n个箱子,箱子也为长方形,第i个箱子的长宽高为li,wi,hi(n个箱子的体积总和是要远远大于车厢的体积),做以下假设和要求: 1. 长方形的车厢共有8个角,并设靠近驾驶室并位于下端的一个角的坐标为(0,0,0),车厢共6个面,其中长的4个面,以及靠近驾驶室的面是封闭的,只有一个面是开着的,用于工人搬运箱子; 2. 需要计算出每个箱子在车厢中的坐标,即每个箱子摆放后,其和车厢坐标为(0,0,0)的角相对应的角在车厢中的坐标,并计算车厢的填充率。 运行环境 主机 |内存 | 显卡 | IDE | Python | torch -----|------|------|-----|--------|----- CPU:12th Gen Intel(R) Core (TM) i7-12700H 2.30 GHz | 6GB RAM | NVIDIA GEFORCE RTX 3050 | Pycharm2022.2.1 | python3.8 | 1.13.0 思路 (1)箱子到来后,根据车厢的实际空间情况,按照策略选择放置点; (2)当摆放箱子时,以6种姿态摆放,并对其进行评估,使用评估值最高的姿态将箱子摆放在选中的角点上; (3)重复以上步骤,直到摆放完毕。 建立模型 在车厢内部设置坐标系,靠近驾驶室并位于下端的一个角的坐标为(0,0,0),相交于原点的车厢长边、宽边和高边分别为x轴,y轴和z轴方向,L、W、H分别为车厢的长、宽、高。箱子具有六种摆放姿态,分别以箱子的长宽、长高、宽高平面为底,旋转90°可以得到另外三种摆放姿态。 核心 # 箱子放置策略 本算法将角点作为车厢内部空间中箱子的摆放位置,每次放入新箱子后搜索新生成的角点,当向车厢中放入第一个箱子时,假设车厢中只有原点一个角点,当一个箱子放入后,会产生新的角点,再放置箱子后,又会产生新的角点。 建立箱子可放置点列表,表示箱子i到来时,车厢内部所有可选的摆放位置,在放置新箱子后更新可放置点列表,并记录已放置箱子到车厢顶部距离,用于后续的奖励函数。 # DQN (1)设置一些超参数,包括ε-greedy使用的ε,折扣因子γ,目标网络更新频率,经验池容量等。 (2)由于给定的箱子数据较少,为了增加模型训练数据数量,将给定的箱子数据打乱,以随机的形式生成并保存,作为训练数据,训练网络模型。 (3)奖励函数 使用x-y平面中两个最大剩余矩形面积(如下)之和与箱子到车厢顶部的距离作为奖励值R,奖励函数表示如下 【说明】 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 欢迎下载交流,互相学习,共同进步!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值