精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

caoporn成人| 欧美做受xxxxxⅹ性视频| 欧美日韩xxxxx| 成人激情在线| 久久精品欧美日韩精品| 国产一区二区三区丝袜| www.九色.com| 91美女精品网站| www.久久东京| 一本大道久久a久久综合| 91夜夜未满十八勿入爽爽影院 | 国产视频第一页在线观看| 欧美影视资讯| av不卡在线播放| 欧美日韩成人精品| 魔女鞋交玉足榨精调教| 人狥杂交一区欧美二区| 国产 日韩 欧美大片| 久久精品国产久精国产思思| 日韩av手机版| 无遮挡的视频在线观看| 日韩黄色免费电影| 国产小视频91| 亚洲成a人片在线www| 在线观看小视频| 国产精品自在欧美一区| 久久亚洲国产精品成人av秋霞| 中文字幕第21页| 国产极品人妖在线观看| 成a人片亚洲日本久久| 久久男人的天堂| 北岛玲一区二区| 亚洲精品日产| 国产亚洲婷婷免费| 国产伦精品一区二区三区照片91| 日韩黄色三级视频| 亚洲精品456| 在线免费不卡电影| 正在播放国产精品| 性中国古装videossex| 亚洲激情亚洲| 国产香蕉一区二区三区在线视频| 大乳护士喂奶hd| 国产精品扒开腿做爽爽爽视频软件| 国产日产欧美一区| 欧美一区二区三区成人久久片| 中文在线字幕av| 综合激情一区| 精品在线欧美视频| 奇米影视四色在线| 五月花成人网| 久久综合狠狠综合久久激情| 国产精品视频xxxx| 欧美精品色哟哟| 四虎影视精品| 欧美一级高清片| 欧美 日韩 激情| 香蕉视频在线播放| 国产欧美一区视频| 97超级碰碰| 亚洲欧美一区二区三区在线观看| 欧美成人自拍| 亚洲激情电影中文字幕| www.欧美日本| 中文字幕在线观看播放| 亚洲欧美偷拍三级| 欧美日韩成人一区二区三区 | 在线看日本不卡| 免费看污污网站| 五月婷婷激情视频| 日韩中文字幕亚洲一区二区va在线 | 日韩欧美在线看| 亚洲高清资源综合久久精品| 国产一区二区在线视频观看| 国产一区亚洲一区| 国产精品第一第二| 国产无套粉嫩白浆内谢| 久久神马影院| 久久精品国产综合| 亚洲成人生活片| 日本一区二区高清不卡| 亚洲精品久久视频| 91香蕉视频污版| 欧美成人家庭影院| 日韩欧美亚洲国产一区| 午夜精品在线免费观看| 国产成年精品| 欧美日韩国产精选| 日韩免费高清在线| 9.1麻豆精品| 欧美日韩五月天| 日韩在线xxx| 欧洲一区精品| 在线播放视频一区| 亚洲一区日韩精品| 亚洲欧美日本国产| 欧美一二区视频| aaaaaav| 欧美性生活一级片| 精品久久久久久久人人人人传媒| 五月天视频在线观看| 精品亚洲a∨| 亚洲精品一区二区三区四区高清 | 久久av秘一区二区三区| 成人欧美亚洲| 久久精品人人做人人爽人人| 中文字幕一区二区三区乱码| 女厕盗摄一区二区三区| 欧美精品123区| 日日干夜夜操s8| 久久影视三级福利片| 亚洲国产精品99| 日韩av手机在线播放| 欧美xxxxx视频| 欧洲中文字幕国产精品| 精品久久久久久久久久久久久久久久| 国产亚洲精品自拍| 欧美性在线观看| 探花视频在线观看| 日日夜夜精品视频免费| 成人在线观看网址| 天堂av在线免费| 久久日一线二线三线suv| 日本三日本三级少妇三级66| 四虎影视成人| 欧美日韩国产小视频在线观看| 日本黄色动态图| 亚洲欧美一级二级三级| 欧美黄色成人网| 国产成人亚洲欧洲在线| 亚洲综合二区| 国产精品人成电影| 欧美巨乳在线| 综合在线观看色| wwwjizzjizzcom| 久草免费在线视频| 日韩欧美国产1| 欧美 日本 国产| 激情视频一区二区三区| 欧美孕妇与黑人孕交| 欧美一级做性受免费大片免费| 久久免费的精品国产v∧| 成年女人18级毛片毛片免费| 成人日韩在线| 亚洲毛片一区二区| 精品无码一区二区三区蜜臀| 激情综合在线| 动漫一区二区在线| 日本aa在线| 色噜噜狠狠成人网p站| 少妇一级淫免费播放| 成人在线免费观看视频| 国产精品啪视频| 嫩草香蕉在线91一二三区| 一区二区三区精品视频| 日韩欧美在线播放视频| 国产亚洲高清在线观看| 精品国产一区二区三区久久狼5月| 久青草视频在线观看| 日韩电影一区二区三区| 日本在线一区| 欧美韩日亚洲| 亚洲国产成人爱av在线播放| 国产情侣在线视频| 久久综合九色综合欧美98| 国产女女做受ⅹxx高潮| 国产麻豆一区二区三区精品视频| 欧美国产视频一区二区| 国产91绿帽单男绿奴| 国产亚洲自拍一区| 一道本视频在线观看| 亚洲欧洲中文字幕| 国产精品国产三级欧美二区| 国内精彩免费自拍视频在线观看网址 | 天堂精品一区二区三区| 麻豆福利在线观看| 精品免费99久久| 国产成人在线视频观看| 国产精品入口麻豆九色| 成人av一级片| 高清日韩欧美| 欧美日韩国产91| 亚洲人妻一区二区| 亚洲黄一区二区三区| 国产一二三区av| 欧美一区视频| 久久久久久亚洲精品不卡4k岛国 | 亚洲一区二区三区四区在线| 九九热99视频| 精品一区电影| 日本亚洲欧洲色| 亚洲欧洲国产综合| 精品视频123区在线观看| 欧美成人片在线观看| 国产精品一区二区你懂的| www.av片| 久久99精品久久久久久欧洲站| 日本一区二区三区在线播放| 国产日产一区二区| 777午夜精品视频在线播放| 国产一级特黄毛片| 国产精品理伦片| 朝桐光av一区二区三区| 韩国理伦片一区二区三区在线播放| 亚洲一区二区三区精品在线观看| 日韩在线免费| 国内精品一区二区三区| 美女羞羞视频在线观看| 精品国产91乱码一区二区三区| 在线视频 91| 亚洲视频小说图片| 一本色道久久综合亚洲精品图片| 国产精品一色哟哟哟| www.日本xxxx| 一区在线免费| 久久久久久久久影视| 第九色区aⅴ天堂久久香| 精品国产免费久久久久久尖叫| 国内激情视频在线观看| 欧美精品一区在线播放| 亚洲AV午夜精品| 欧美酷刑日本凌虐凌虐| 精品视频一二三区| 中文字幕乱码一区二区免费| 蜜臀av免费观看| 老鸭窝91久久精品色噜噜导演| 日本成人黄色| 美女福利一区| 精品久久久久久中文字幕动漫 | 日本aⅴ精品一区二区三区| 色综合电影网| 自拍自偷一区二区三区| 久久99精品久久久久久青青日本 | 成人激情小说网站| 日韩不卡的av| 国产欧美高清| 免费一级特黄毛片| 国产一区激情| 日韩av一区二区三区美女毛片| 欧美在线关看| 极品日韩久久| 妖精视频一区二区三区| 免费av一区二区三区| 亚洲狼人在线| 国产日韩欧美在线看| 爱情岛论坛亚洲品质自拍视频网站 | 久久人妻一区二区| 成人福利在线看| a天堂视频在线观看| 99视频有精品| 黄色a一级视频| 久久美女艺术照精彩视频福利播放 | 久青草国产97香蕉在线视频| 免费观看在线黄色网| 日韩视频免费在线观看| av网址在线播放| 欧美肥婆姓交大片| 川上优av中文字幕一区二区| 国产91精品久久久久| 欧美性xxx| 欧美成在线观看| 青春草视频在线观看| 97久久久免费福利网址| 欧美jizzhd69巨大| 不卡中文字幕av| 蜜臀av在线| 欧美中文字幕视频| 国产电影一区二区三区爱妃记| 国产精品视频午夜| 粉嫩一区二区三区在线观看| 成人av片网址| 精品一区二区三区免费看| 人妖精品videosex性欧美| 深夜视频一区二区| 91免费视频国产| 欧美电影在线观看免费| 日韩精品av一区二区三区| 日韩1区在线| 加勒比海盗1在线观看免费国语版| 欧美天堂亚洲电影院在线观看| 亚洲欧美久久久久一区二区三区| 99精品视频在线观看播放| 色狠狠久久av五月综合| 香蕉久久网站| 亚洲韩国在线| 黑人一区二区三区四区五区| 久久婷婷五月综合色国产香蕉| 蜜桃av噜噜一区二区三区小说| 凹凸日日摸日日碰夜夜爽1| 日韩 欧美一区二区三区| 久久久久无码精品| 国产一区二三区| 国产网站无遮挡| 亚洲少妇30p| 日本高清不卡码| 日韩欧美一区在线| 国产在线超碰| 亚洲视频在线播放| 欧美性孕妇孕交| 亚洲男人天堂2024| aa在线视频| 国产精品色婷婷视频| 国产一区二区在线视频你懂的| 亚洲国产一区二区三区在线播| 亚洲经典自拍| 91精品国产三级| 国产日韩欧美综合在线| 日本亚洲色大成网站www久久| 精品视频999| 蜜芽tv福利在线视频| 久久久久久91香蕉国产| 久草在线资源站手机版| 成人精品在线视频| 日本免费一区二区三区等视频| 国产日韩在线看| 精品影片在线观看的网站| 欧美日韩亚洲一区二区三区四区| 牛夜精品久久久久久久99黑人| www.xxx亚洲| 91网页版在线| 99久久精品免费视频| 亚洲国产精品ⅴa在线观看| 亚洲国产成人精品激情在线| 欧美成人一级视频| www在线免费观看视频| 欧美黄色小视频| 国产精品99久久免费| 亚洲国产精品毛片| 快she精品国产999| 亚洲精品成人在线播放| 欧美—级在线免费片| 色老头在线视频| 亚洲品质视频自拍网| 亚洲淫成人影院| 成人h视频在线观看播放| 久久av超碰| 成年人免费大片| 国产亚洲综合在线| 波多野结衣一区二区在线| 亚洲欧美精品伊人久久| 亚洲深夜视频| 精品国产一区二区三区久久久久久| 国内自拍视频一区二区三区| 丰满人妻一区二区三区大胸| 一区二区三区在线免费观看| 国产成人精品亚洲精品色欲| 日韩高清av在线| 嗯啊主人调教在线播放视频 | 免费精品国产| 国产精品wwwww| 国产女人18毛片水真多成人如厕 | 亚洲精品mp4| 三级中文字幕在线观看| 免费日韩av电影| 日本午夜一区二区| 福利视频第一页| 亚洲电影第三页| 艳妇乳肉豪妇荡乳av| 日韩色av导航| 都市激情久久| 丰满爆乳一区二区三区| 久久午夜老司机| a片在线免费观看| 亚洲国产精品99久久| 一区二区乱码| 亚洲精品8mav| 国产精品1区2区| 992在线观看| 欧美一区二区网站| 成人午夜电影在线观看| 成人网欧美在线视频| 国产尤物精品| 在线免费观看麻豆| 欧美美女一区二区在线观看| 污污在线观看| 麻豆精品蜜桃一区二区三区| 美女一区二区久久| 国产在线成人精品午夜| 亚洲精品中文字幕有码专区| 国产福利91精品一区二区| 欧美xxxx黑人又粗又长密月| 日本欧美一区二区三区乱码| 99久久婷婷国产综合| 日韩av影片在线观看| 青青国产精品| 日日摸日日碰夜夜爽无码| 国产精品综合av一区二区国产馆| 亚洲国产成人精品激情在线| 最近更新的2019中文字幕| 日本欧美不卡| 国产精品一二三在线观看| 26uuu国产一区二区三区| 91九色蝌蚪91por成人| 午夜精品一区二区三区在线视频 | 免费在线观看视频a| 日本一区二区高清| 性色av蜜臀av| 欧美片一区二区三区| 激情五月色综合国产精品| www.欧美com|