精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用 Python 開源庫 py3dbp 解決三維裝箱問題

開發
Python社區為我們提供了一個強大而簡潔的工具——py3dbp。本文將帶您深入了解這個庫,并通過一個實際案例,展示如何從零開始解決一個裝箱問題,并最終創建一個直觀的動態裝箱過程GIF。

本文介紹如何使用 py3dbp 解決三維裝箱問題。文章包含了從基本概念、實戰案例到最終生成動態GIF可視化的流程及代碼實現。

在物流、倉儲和制造業中,如何將不同尺寸的物品高效地裝入一個有限的容器(如卡車、集裝箱或箱子)是一個經典且極具挑戰性的問題。這就是著名的三維裝箱問題(3D Bin Packing Problem, 3D-BPP)。解決好這個問題能顯著節約運輸成本、提高空間利用率。

Python社區為我們提供了一個強大而簡潔的工具——py3dbp。本文將帶您深入了解這個庫,并通過一個實際案例,展示如何從零開始解決一個裝箱問題,并最終創建一個直觀的動態裝箱過程GIF。

一、py3dbp 核心概念

在使用之前,我們先了解 py3dbp 的三個核心組件:

  • Packer (裝箱器):這是執行裝箱算法的核心引擎。您可以把它想象成一個負責指揮的工人。
  • Bin (箱子/容器):代表您要裝入物品的容器。它有明確的屬性,如名稱、長、寬、高和最大承重。在我們的案例中,這就是一輛貨車。
  • Item (物品):代表需要被裝入箱子的物品。它同樣有名稱、長、寬、高和重量等屬性。

整個工作流程非常直觀:創建箱子和一系列物品 -> 將它們都交給裝箱器 -> 裝箱器執行算法 -> 檢視裝箱結果。

二、實戰案例:裝載一輛貨車

假設我們有一輛小型貨車和一批不同規格的貨物,我們的目標是盡可能多地將這些貨物裝入車廂。

  • 貨車車廂尺寸 (Bin): 587cm (長) x 235cm (寬) x 270cm (高)。
  • 貨物列表 (Items): 我們有多種不同尺寸和數量的箱子需要裝載。

第1步:安裝必要的庫

您需要安裝 py3dbp 用于核心計算,matplotlib 用于繪圖,以及 imageio 用于將圖片序列合成為GIF。

pip install py3dbp
pip install matplotlib
pip install imageio```

第2步:編寫代碼實現裝箱

我們將遵循以下步驟編寫代碼:

  • 導入庫。
  • 定義 Bin (貨車) 和 Item (貨物)。
  • 創建 Packer 并將箱子和物品添加進去。
  • 執行裝箱算法并打印結果。

第3步:生成動態GIF可視化

靜態的結果報告雖然清晰,但遠不如一個動態圖來得直觀。我們將編寫一個函數,它能一步步地展示每個箱子是如何被放入車廂的,并最終將這個過程保存為 GIF 文件。

這需要我們:

  • 編寫一個函數,能繪制出任意數量物品在箱子中的3D視圖。
  • 循環調用這個繪圖函數,從1個物品開始,每次增加1個,并將每一幀保存為圖片。
  • 使用 imageio 將所有圖片幀合成為一個GIF。

下面是包含完整代碼(計算+可視化)的腳本:

import os
import imageio
import numpy as np
from py3dbp import Packer, Bin, Item
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

# --- Matplotlib 全局設置 ---
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False# 用來正常顯示負號

def plot_packing_result(bin_obj, items_to_plot, title, save_path=None):
    """
    繪制指定物品在箱子中的3D視圖 (已修正數據類型問題)
    """
    fig = plt.figure(figsize=(12, 10))
    ax = fig.add_subplot(111, projection='3d')

    # 為不同物品分配顏色
    num_items = len(items_to_plot)
    cmap = plt.get_cmap('viridis')
    colors = [cmap(i) for i in np.linspace(0, 0.9, num_items)] if num_items > 0else []
    color_map = {item.name: colors[i] for i, item in enumerate(items_to_plot)}

    # 繪制每個已裝箱的物品
    for item in items_to_plot:
        item_d = float(item.depth)
        item_w = float(item.width)
        item_h = float(item.height)
        
        pos = item.position
        x, y, z = float(pos[0]), float(pos[1]), float(pos[2])
        
        vertices = [
            (x, y, z), (x + item_d, y, z), (x + item_d, y + item_w, z), (x, y + item_w, z),
            (x, y, z + item_h), (x + item_d, y, z + item_h), (x + item_d, y + item_w, z + item_h), (x, y + item_w, z + item_h)
        ]
        faces = [
            [vertices[0], vertices[1], vertices[2], vertices[3]], [vertices[4], vertices[5], vertices[6], vertices[7]],
            [vertices[0], vertices[1], vertices[5], vertices[4]], [vertices[2], vertices[3], vertices[7], vertices[6]],
            [vertices[1], vertices[2], vertices[6], vertices[5]], [vertices[0], vertices[3], vertices[7], vertices[4]]
        ]

        poly3d = Poly3DCollection(faces, facecolors=color_map.get(item.name), linewidths=1, edgecolors='k', alpha=0.85)
        ax.add_collection3d(poly3d)

    ax.set_xlim(0, float(bin_obj.depth))
    ax.set_ylim(0, float(bin_obj.width))
    ax.set_zlim(0, float(bin_obj.height))
    
    ax.set_xlabel('長度 (X軸 / depth)')
    ax.set_ylabel('寬度 (Y軸 / width)')
    ax.set_zlabel('高度 (Z軸 / height)')
    
    ax.view_init(elev=20, azim=-45)
    plt.title(title, fontsize=16)

    if save_path:
        plt.savefig(save_path)
        plt.close(fig)
    else:
        plt.show()

def create_animated_gif(bin_obj, output_filename='packing_animation.gif'):
    """
    創建并保存裝箱過程的GIF動畫
    """
    packed_items = bin_obj.items
    ifnot packed_items:
        print("分析:沒有成功裝入任何物品,無法創建GIF。請檢查物品尺寸是否相對于容器過大。")
        return

    frame_folder = "gif_frames"
    ifnot os.path.exists(frame_folder):
        os.makedirs(frame_folder)

    filenames = []
    print(f"步驟1:為GIF生成 {len(packed_items) + 1} 幀圖片...")
    
    for i in range(len(packed_items) + 1):
        frame_path = os.path.join(frame_folder, f"frame_{i:03d}.png")
        if i == 0:
            plot_packing_result(bin_obj, [], f"第 {i}/{len(packed_items)} 步: 空貨車", save_path=frame_path)
        else:
            item_being_packed = packed_items[i-1]
            plot_packing_result(bin_obj, packed_items[:i], f"第 {i}/{len(packed_items)} 步: 裝入 {item_being_packed.name}", save_path=frame_path)
        filenames.append(frame_path)

    print("步驟2:將所有圖片幀合成為GIF文件...")

    with imageio.get_writer(output_filename, mode='I', duration=3.5) as writer:
        for filename in filenames:
            image = imageio.imread(filename)
            writer.append_data(image)
    
    print(f"成功!GIF動畫已保存至: {output_filename}")
    
    for filename in filenames:
        os.remove(filename)
    os.rmdir(frame_folder)

# ================== 主程序入口 ==================
if __name__ == '__main__':
    packer = Packer()
    
    # 按照 (名稱, 寬, 高, 深, ...) 的順序創建 Bin
    truck = Bin('貨車', 235, 270, 587, 1000.0)
    packer.add_bin(truck)
    
    # 按照 (名稱, 寬, 高, 深, ...) 的順序創建 Item
    packer.add_item(Item('大號箱子-1', 100, 100, 100, 15.0))
    packer.add_item(Item('大號箱子-2', 100, 100, 100, 15.0))
    packer.add_item(Item('中號箱子-1', 70, 60, 80, 10.0))
    packer.add_item(Item('中號箱子-2', 70, 60, 80, 10.0))
    packer.add_item(Item('中號箱子-3', 70, 60, 80, 10.0))
    packer.add_item(Item('小號箱子-1', 40, 30, 50, 5.0))
    packer.add_item(Item('小號箱子-2', 40, 30, 50, 5.0))
    packer.add_item(Item('小號箱子-3', 40, 30, 50, 5.0))
    packer.add_item(Item('小號箱子-4', 40, 30, 50, 5.0))
    packer.add_item(Item('扁平箱子-1', 150, 10, 120, 8.0))
    packer.add_item(Item('扁平箱子-2', 150, 10, 120, 8.0))
    packer.add_item(Item('瘦高箱子-1', 40, 200, 40, 12.0))
    packer.add_item(Item('瘦高箱子-2', 40, 200, 40, 12.0))
    packer.add_item(Item('超大號箱子', 300, 300, 300, 100.0))

    print("開始執行裝箱算法...")
    packer.pack(bigger_first=True, distribute_items=False)

    packed_bin = packer.bins[0]
    print(f"\n計算完畢!")
    print(f"已裝入物品數量: {len(packed_bin.items)}")
    print(f"未裝入物品數量: {len(packed_bin.unfitted_items)}")
    
    create_animated_gif(packed_bin, 'packing_animation.gif')

三、運行與結果

將以上代碼保存為 .py 文件并運行。程序會首先在控制臺輸出裝箱結果,然后開始生成GIF的每一幀。完成后,您會在代碼文件所在的目錄下找到一個名為 packing_animation.gif 的文件。

這個GIF文件會像下面這樣,動態地展示每一個箱子被依次放入貨車的過程。

責任編輯:趙寧寧 來源: Python數智工坊
相關推薦

2023-06-13 08:00:00

Python開源Open3D庫

2025-03-24 09:41:22

2024-12-12 08:28:11

2014-04-01 12:54:53

2010-09-03 09:28:30

2009-11-10 12:55:26

VB.NET三維模型

2009-11-10 12:48:17

VB.NET三維模型

2013-04-17 16:22:53

2023-09-12 11:30:44

自動駕駛技術

2022-09-09 15:40:57

Blender開源三維圖形

2024-10-06 13:00:00

AI模型

2021-03-16 09:53:35

人工智能機器學習技術

2009-05-08 10:19:11

2014-08-26 16:04:30

2012-05-23 11:44:39

華勝天成

2025-01-26 14:13:28

2009-06-08 22:03:37

裝箱問題Java

2025-08-20 08:50:00

AI視頻模型
點贊
收藏

51CTO技術棧公眾號

亚洲激情视频小说| 逼特逼视频在线| 国产黄色小视频在线观看| 国产精品vip| 亚洲欧美另类人妖| 蜜臀一区二区三区精品免费视频| 国产在线一区二区视频| 国产精品亚洲一区二区三区妖精 | 97久久人人超碰caoprom| 91麻豆国产在线观看| 国产美女精品视频| 日韩av电影网| 99久久婷婷| 日韩成人小视频| 国产精品久久久久久9999| 97蜜桃久久| 最新热久久免费视频| 精选一区二区三区四区五区| 亚洲天堂自拍偷拍| 国产亚洲成人一区| 成年无码av片在线| 国产jk精品白丝av在线观看| av日韩精品| 欧美日韩国产免费一区二区| 91视频 -- 69xx| av免费在线免费| 国产亚洲欧美中文| 国产一区喷水| 国产后入清纯学生妹| 首页综合国产亚洲丝袜| 国内精品久久久久久影视8| 亚洲一级二级片| 国产一区二区欧美| 日韩av影片在线观看| 91欧美一区二区三区| 欧美精品资源| 欧美性猛交xxx| 国模无码视频一区二区三区| 污污的网站在线免费观看| 国产精品毛片大码女人| 免费亚洲一区二区| 亚洲av成人无码久久精品老人| 国产一区福利在线| 成人黄色免费网站在线观看| 性高潮视频在线观看| 久久久久久亚洲精品杨幂换脸| 国内精品免费午夜毛片| 久久久久免费看| 欧美激情自拍| 欧美美最猛性xxxxxx| 国产va在线播放| 综合激情视频| 欧美成人在线影院| 欧美日韩精品亚洲精品| 永久亚洲成a人片777777| 日韩视频一区在线| 激情五月深爱五月| 久久国产影院| 久久亚洲精品一区| 国产精品白嫩白嫩大学美女| 国产精品久久久久久久免费观看| 色悠悠久久久久| 成人无码精品1区2区3区免费看 | 久久五月情影视| 日本一二三区在线观看| 欧美一区视频| 久久久久久久香蕉网| 日本三级片在线观看| 亚洲精品字幕| 欧美野外猛男的大粗鳮| 亚洲不卡在线视频| 美女在线一区二区| 91亚洲人电影| 成人乱码一区二区三区| av成人免费在线| 欧美日韩一区综合| 97超碰国产一区二区三区| 亚洲欧洲www| 亚洲理论电影在线观看| 一根才成人网| 欧美日韩国产精品成人| 中文字幕人妻无码系列第三区| 538任你躁精品视频网免费| 亚洲国产精彩中文乱码av在线播放| 大乳护士喂奶hd| 国产99久久精品一区二区300| 在线视频免费一区二区| 麻豆天美蜜桃91| 亚洲精品123区| 国产精品久久久久久一区二区 | 精品综合久久久久久8888| 91免费综合在线| 天天色综合久久| 国产精品人妖ts系列视频| 三级在线免费观看| 黑人巨大精品| 日韩视频123| 三上悠亚影音先锋| 欧美不卡一区| 国产精品99久久久久久久久| a天堂中文在线观看| 99热这里都是精品| 伊人情人网综合| 涩涩涩在线视频| 欧美一区欧美二区| 久久久久久久久久久久久久久| 91精品国产91久久综合| 日韩av免费看| 狠狠综合久久av一区二区| 国产欧美精品一区| 妞干网在线视频观看| 久久av日韩| 日韩激情片免费| 黄色一级片在线| 免播放器亚洲一区| 六十路精品视频| 欧美v亚洲v| 这里是久久伊人| 亚洲精品国产91| 亚洲国产婷婷| 147欧美人体大胆444| av电影在线网| 精品久久久一区| 亚洲成年人av| 久久久久国产| 成人福利在线观看| 国产一级片在线播放| 午夜欧美大尺度福利影院在线看| 超碰91在线播放| 日韩久久精品| 国产精品91久久久久久| 天堂av网在线| 婷婷国产v国产偷v亚洲高清| 国产伦精品一区二区三区妓女下载 | 国产又粗又猛又爽又黄的视频小说| 狠狠色狠狠色综合日日tαg| 成人精品一区二区三区电影黑人| 国产在线观看免费| 色屁屁一区二区| 国产传媒第一页| 夜夜嗨一区二区| 国内成+人亚洲| 看黄在线观看| 日韩精品在线电影| 五月天综合激情| av不卡在线播放| 北条麻妃69av| 国产精品一区二区av交换| 69av在线视频| 亚洲 欧美 自拍偷拍| 欧美性xxxx极品高清hd直播| 精品无码一区二区三区| 国产午夜精品一区二区三区欧美| 国内精品二区| 日韩大片欧美大片| 一本色道久久88亚洲综合88| 中文字幕免费视频观看| 欧美激情一区在线| 中文字幕亚洲影院| 欧美暴力喷水在线| 国产伦精品一区二区三区在线| 2019中文字幕在线电影免费| 亚洲国产欧美久久| 久久黄色精品视频| 国产亚洲精品bt天堂精选| 精品少妇无遮挡毛片| 图片区亚洲欧美小说区| 国产精品国产精品国产专区不卡| 国产嫩草在线视频| 精品亚洲一区二区三区在线播放| 精品视频一二三区| 中文字幕一区二区三| 4438x全国最大成人| 国产日韩1区| 天天综合狠狠精品| 国产精品日本一区二区不卡视频 | 成人精品免费网站| 免费在线激情视频| 久久伦理在线| 成人xxxxx色| 综合久久2023| 久久精品视频在线观看| 欧性猛交ⅹxxx乱大交| 欧美性xxxx在线播放| 久久久久久久麻豆| 99视频热这里只有精品免费| 高清一区二区视频| 欧美激情麻豆| 欧美一区二区三区在线播放| 精品三级国产| 欧美在线性视频| 国产剧情在线| 亚洲区中文字幕| www.久久成人| 欧美在线观看你懂的| 538精品在线视频| 久久免费看少妇高潮| 亚洲色图欧美自拍| 石原莉奈在线亚洲二区| 超碰超碰超碰超碰超碰| 久久成人高清| 国产精品久久亚洲7777| 日韩深夜福利网站| 欧洲s码亚洲m码精品一区| av网站在线看| 一本色道久久88综合亚洲精品ⅰ| www.色亚洲| 欧美日韩三级视频| 日日噜噜噜噜人人爽亚洲精品| 中文字幕在线不卡一区| www.久久av| 成人免费的视频| 青青草原国产在线视频| 免费日韩av片| av日韩一区二区三区| 亚洲成人一区| 日韩精品无码一区二区三区| 精品国产午夜肉伦伦影院| 成人xvideos免费视频| 浪潮色综合久久天堂| 久久久在线视频| 中文国产字幕在线观看| 日韩中文字幕国产精品| 免费播放片a高清在线观看| 欧美变态tickling挠脚心| 91成年人视频| 精品视频在线免费观看| 亚洲欧美偷拍视频| 欧美色xxxx| 天堂网一区二区三区| 亚洲一区二区三区四区的 | 黄色免费在线播放| 亚洲国产一区二区三区在线观看 | 国产成人77亚洲精品www| 国产91精品高潮白浆喷水| 国产探花在线观看| 欧美激情精品久久久久久变态| 黄色一级大片在线免费看产| 中文字幕日本欧美| 思思99re6国产在线播放| 国产一区二区三区三区在线观看| 精品福利视频导航大全| 亚洲欧洲视频在线| 黄色大片在线免费观看| 亚洲天堂av综合网| 欧美老女人性开放| 亚洲欧美国产精品va在线观看| 日韩电影网址| 亚洲欧美一区二区三区四区| 日韩精品视频在线观看一区二区三区| 日韩av综合中文字幕| 污污网站在线免费观看| 精品亚洲男同gayvideo网站| 久久国产精品高清一区二区三区| 亚洲欧美精品一区| 95在线视频| 欧美xxxx18性欧美| 欧美1234区| 欧美在线观看日本一区| 日韩大尺度黄色| 成人av番号网| 白白在线精品| 久久视频在线观看中文字幕| 国产成人久久| a级黄色片网站| 国产精品jizz在线观看美国| 国产自产在线视频| 久久精品午夜| 在线观看免费的av| 国产成人综合自拍| 中文在线一区二区三区| 久久九九影视网| 天堂网中文在线观看| 伊人色综合久久天天人手人婷| 黄色小视频在线免费看| 欧美性xxxx极品hd满灌| 亚洲无码精品在线播放| 精品国产乱码久久久久久1区2区 | 亚洲国产高清aⅴ视频| 久草视频手机在线| 亚洲h精品动漫在线观看| 狠狠人妻久久久久久综合| 精品污污网站免费看| www.国产三级| 亚洲色图在线观看| 怡红院av在线| 国产精品99久久久久久www| 电影91久久久| 久久伊人一区| 中文在线日韩| 日本熟妇人妻xxxxx| 狠狠v欧美v日韩v亚洲ⅴ| 国产毛片毛片毛片毛片毛片毛片| 中文在线免费一区三区高中清不卡| 欧美日韩国产精品综合| 日本韩国一区二区三区| 国产福利资源在线| 亚洲天堂开心观看| 在线播放免费av| 国产精品av网站| 51亚洲精品| 中文字幕精品—区二区日日骚| 亚洲免费大片| 日本精品一区在线| 久久久综合九色合综国产精品| 男人操女人的视频网站| 色94色欧美sute亚洲线路一ni| 国产成人av免费看| 中文字幕9999| 亚洲最新无码中文字幕久久| 操人视频欧美| 婷婷另类小说| www.欧美日本| 99久久婷婷国产综合精品| 国产女片a归国片aa| 欧美亚洲综合久久| 天堂中文在线8| 久久久免费精品视频| av日韩一区| 亚洲欧美日韩国产yyy| 国产亚洲午夜| 国产精品成人99一区无码 | 视频亚洲一区二区| 一级日韩一区在线观看| 日韩在线一区二区| 免费观看av网站| 偷拍与自拍一区| 国产哺乳奶水91在线播放| 色久欧美在线视频观看| 欧美日韩成人影院| 蜜桃91精品入口| 一本久道久久久| 亚洲国产精品成人综合久久久| 一区二区三区四区精品在线视频| 在线免费av网| www.久久久久久.com| videos性欧美另类高清| 久久久久久久久久久久久久一区 | 中文国产在线观看| 国产精品福利一区| 中文字幕免费观看视频| 一本色道久久综合狠狠躁篇怎么玩| 国产精品伦理| 欧美日韩三区四区| 视频一区中文字幕国产| 国产精品天天干| 欧美伊人久久久久久午夜久久久久| 国产在线观看网站| 国产精品一区二区三区久久| 日韩大片在线| 天天做天天干天天操| 亚洲视频每日更新| 亚洲AV无码精品国产| 久久久久国产精品免费网站| 成人午夜三级| 啊啊啊一区二区| www久久精品| 中文字幕一区2区3区| 色噜噜久久综合伊人一本| 日韩一区二区三区四区五区| 天天综合中文字幕| 国产成人亚洲精品青草天美| 久久久久久久极品内射| 亚洲国产小视频在线观看| 欧美大片1688| 最新中文字幕久久| 成人性生交大片免费看视频在线| 日韩欧美大片在线观看| 亚洲天堂av图片| 24小时成人在线视频| 国产一区二区四区| 久久久电影一区二区三区| 中文字幕在线播放av| 欧美片一区二区三区| 日本中文字幕在线一区| 性chinese极品按摩| 一区二区三区不卡在线观看| 天天干视频在线观看| 国产精品极品尤物在线观看| 91精品啪在线观看国产81旧版| 亚洲日本久久久| 91福利在线播放| 亚洲制服国产| 欧美日韩精品免费在线观看视频| 捆绑调教一区二区三区| 欧美一级高潮片| 中文字幕精品www乱入免费视频| 亚洲精品v亚洲精品v日韩精品| 漂亮人妻被中出中文字幕| 国产精品久久99| 婷婷开心激情网| 91精品免费久久久久久久久| 国产亚洲亚洲| 三级av在线免费观看| 日韩电视剧免费观看网站| 日本欧美在线| 免费无码国产v片在线观看| 日韩一区在线看| 久久精品a一级国产免视看成人 | 一区二区在线观看av|