1次元Bin Packingアルゴリズムを活用した作業配分最適化_3.実装(2)
3.2。 Python Bin Packingパッケージの活用
3.2.1. Python Bin Packingパッケージの紹介とインストール
Pythonで利用可能なBin Packingパッケージは、Pypi(Python Package Index)Webページの https://pypi.python.org/pypi/bin-packing-problem/1.0.0 で提供する。このURLからBin Packing packageの簡単な説明とサンプルソースコードを参考にでき、packageファイルをダウンロードして実装されているソースコードを確認することができる。
このパッケージのFitモジュール内に、次のようなBin Packingを実装したメソッドを提供します。
アルゴリズム | method(並べ替えなし) | method(整列適用) |
Next Fit | nf | – (v1.0 には実装されていない) |
First Fit | ff | ffd |
ワーストフィット | wf | wfd |
ベストフィット | bf | bfd |
インストールは次のようにPythonパッケージマネージャであるpipを使用します。
pip install bin-packing-problem
3.2.2。 Bin Packingサンプルソースコード
以下は、上記でインストールしたBin Packing packageを活用したサンプルソースコードです。目次2では、Bin Packingアルゴリズムを説明する内容で使用した入力値を同様に使用しました。
ちなみに、Package開発者の意図なのかミスなのかはわかりませんが、nfd(next fit descending) methodは実装されておらず、コメントで処理しておいた
from binpackp import NumberBin, Fit def print_result(fit_name, fit_result): print(fit_name + " Result: ", fit_result) for bin in fit_result.bins: print(bin) print() bin_size = 80 fit_these = [26, 57, 18, 8, 45, 16, 22, 29, 5, 11, 8, 27, 54, 13, 17, 21, 63, 14, 16, 45, 6, 32, 57, 24, 18, 27, 54, 35, 12, 43, 36, 72, 14, 28, 3, 11, 46, 27, 42, 59, 26, 41, 15, 41, 68] next_fit_results = Fit.nf(NumberBin, bin_size, fit_these) first_fit_results = Fit.ff(NumberBin, bin_size, fit_these) worst_fit_result = Fit.wf(NumberBin, bin_size, fit_these) best_fit_result = Fit.bf(NumberBin, bin_size, fit_these) # sorted_next_fit_results = Fit.nfd(NumberBin, bin_size, fit_these) # not implemented sorted_first_fit_results = Fit.ffd(NumberBin, bin_size, fit_these) sorted_worst_fit_result = Fit.wfd(NumberBin, bin_size, fit_these) sorted_best_fit_result = Fit.bfd(NumberBin, bin_size, fit_these) print_result("Next Fit", next_fit_results) print_result("First Fit", first_fit_results) print_result("Worst Fit", worst_fit_result) print_result("Best Fit", best_fit_result) # print_result("Next Fit With Sort", next_fit_results) # not implemented print_result("First Fit With Sort", sorted_first_fit_results) print_result("Worst Fit With Sort", sorted_worst_fit_result) print_result("Best Fit With Sort", sorted_best_fit_result)
3.2.3。 Bin Packing サンプルソースコード出力
サンプルソースコードを実行した結果は次のとおりです。目次2で説明した各アルゴリズムの実行結果と出力される順序が異なるが、満たされた内容は同一であることが確認できる。
Next Fit Result: <BPResult (Total Bins: 23, Total Volume: 1840, Unused Volume: 488)> <NumberBin>(Volume: 26/80, Items: [26]) <NumberBin>(Volume: 75/80, Items: [57, 18]) <NumberBin>(Volume: 69/80, Items: [8, 45, 16]) <NumberBin>(Volume: 75/80, Items: [22, 29, 5, 11, 8]) <NumberBin>(Volume: 27/80, Items: [27]) <NumberBin>(Volume: 67/80, Items: [54, 13]) <NumberBin>(Volume: 38/80, Items: [17, 21]) <NumberBin>(Volume: 77/80, Items: [63, 14]) <NumberBin>(Volume: 67/80, Items: [16, 45, 6]) <NumberBin>(Volume: 32/80, Items: [32]) <NumberBin>(Volume: 57/80, Items: [57]) <NumberBin>(Volume: 69/80, Items: [24, 18, 27]) <NumberBin>(Volume: 54/80, Items: [54]) <NumberBin>(Volume: 47/80, Items: [35, 12]) <NumberBin>(Volume: 79/80, Items: [43, 36]) <NumberBin>(Volume: 72/80, Items: [72]) <NumberBin>(Volume: 56/80, Items: [14, 28, 3, 11]) <NumberBin>(Volume: 73/80, Items: [46, 27]) <NumberBin>(Volume: 42/80, Items: [42]) <NumberBin>(Volume: 59/80, Items: [59]) <NumberBin>(Volume: 67/80, Items: [26, 41]) <NumberBin>(Volume: 56/80, Items: [15, 41]) <NumberBin>(Volume: 68/80, Items: [68]) First Fit Result: <BPResult (Total Bins: 19, Total Volume: 1520, Unused Volume: 168)> <NumberBin>(Volume: 80/80, Items: [54, 26]) <NumberBin>(Volume: 79/80, Items: [26, 18, 8, 16, 5, 6]) <NumberBin>(Volume: 79/80, Items: [57, 22]) <NumberBin>(Volume: 77/80, Items: [45, 29, 3]) <NumberBin>(Volume: 76/80, Items: [11, 8, 27, 13, 17]) <NumberBin>(Volume: 75/80, Items: [54, 21]) <NumberBin>(Volume: 77/80, Items: [63, 14]) <NumberBin>(Volume: 79/80, Items: [16, 45, 18]) <NumberBin>(Volume: 79/80, Items: [32, 24, 12, 11]) <NumberBin>(Volume: 71/80, Items: [57, 14]) <NumberBin>(Volume: 77/80, Items: [27, 35, 15]) <NumberBin>(Volume: 79/80, Items: [43, 36]) <NumberBin>(Volume: 72/80, Items: [72]) <NumberBin>(Volume: 74/80, Items: [28, 46]) <NumberBin>(Volume: 69/80, Items: [27, 42]) <NumberBin>(Volume: 59/80, Items: [59]) <NumberBin>(Volume: 41/80, Items: [41]) <NumberBin>(Volume: 41/80, Items: [41]) <NumberBin>(Volume: 68/80, Items: [68]) Worst Fit Result: <BPResult (Total Bins: 21, Total Volume: 1680, Unused Volume: 328)> <NumberBin>(Volume: 80/80, Items: [29, 5, 11, 8, 27]) <NumberBin>(Volume: 41/80, Items: [41]) <NumberBin>(Volume: 46/80, Items: [46]) <NumberBin>(Volume: 54/80, Items: [54]) <NumberBin>(Volume: 56/80, Items: [41, 15]) <NumberBin>(Volume: 56/80, Items: [32, 24]) <NumberBin>(Volume: 57/80, Items: [57]) <NumberBin>(Volume: 59/80, Items: [59]) <NumberBin>(Volume: 61/80, Items: [35, 12, 14]) <NumberBin>(Volume: 61/80, Items: [45, 16]) <NumberBin>(Volume: 63/80, Items: [63]) <NumberBin>(Volume: 67/80, Items: [54, 13]) <NumberBin>(Volume: 68/80, Items: [42, 26]) <NumberBin>(Volume: 68/80, Items: [68]) <NumberBin>(Volume: 69/80, Items: [28, 3, 11, 27]) <NumberBin>(Volume: 69/80, Items: [45, 6, 18]) <NumberBin>(Volume: 72/80, Items: [72]) <NumberBin>(Volume: 74/80, Items: [57, 17]) <NumberBin>(Volume: 74/80, Items: [26, 18, 8, 22]) <NumberBin>(Volume: 78/80, Items: [21, 14, 16, 27]) <NumberBin>(Volume: 79/80, Items: [43, 36]) Best Fit Result: <BPResult (Total Bins: 19, Total Volume: 1520, Unused Volume: 168)> <NumberBin>(Volume: 80/80, Items: [57, 18, 5]) <NumberBin>(Volume: 80/80, Items: [63, 14, 3]) <NumberBin>(Volume: 80/80, Items: [54, 26]) <NumberBin>(Volume: 79/80, Items: [26, 8, 45]) <NumberBin>(Volume: 79/80, Items: [8, 27, 17, 21, 6]) <NumberBin>(Volume: 79/80, Items: [16, 45, 18]) <NumberBin>(Volume: 79/80, Items: [54, 13, 12]) <NumberBin>(Volume: 79/80, Items: [43, 36]) <NumberBin>(Volume: 78/80, Items: [16, 22, 29, 11]) <NumberBin>(Volume: 76/80, Items: [27, 35, 14]) <NumberBin>(Volume: 74/80, Items: [28, 46]) <NumberBin>(Volume: 74/80, Items: [59, 15]) <NumberBin>(Volume: 72/80, Items: [72]) <NumberBin>(Volume: 69/80, Items: [27, 42]) <NumberBin>(Volume: 68/80, Items: [57, 11]) <NumberBin>(Volume: 68/80, Items: [68]) <NumberBin>(Volume: 56/80, Items: [32, 24]) <NumberBin>(Volume: 41/80, Items: [41]) <NumberBin>(Volume: 41/80, Items: [41]) First Fit With Sort Result: <BPResult (Total Bins: 18, Total Volume: 1440, Unused Volume: 88)> <NumberBin>(Volume: 80/80, Items: [45, 35]) <NumberBin>(Volume: 80/80, Items: [54, 26]) <NumberBin>(Volume: 80/80, Items: [54, 26]) <NumberBin>(Volume: 80/80, Items: [59, 21]) <NumberBin>(Volume: 80/80, Items: [63, 17]) <NumberBin>(Volume: 80/80, Items: [68, 12]) <NumberBin>(Volume: 80/80, Items: [72, 8]) <NumberBin>(Volume: 80/80, Items: [45, 29, 6]) <NumberBin>(Volume: 80/80, Items: [57, 18, 5]) <NumberBin>(Volume: 79/80, Items: [57, 22]) <NumberBin>(Volume: 78/80, Items: [46, 32]) <NumberBin>(Volume: 79/80, Items: [43, 36]) <NumberBin>(Volume: 78/80, Items: [42, 28, 8]) <NumberBin>(Volume: 79/80, Items: [41, 27, 11]) <NumberBin>(Volume: 79/80, Items: [41, 27, 11]) <NumberBin>(Volume: 72/80, Items: [27, 24, 18, 3]) <NumberBin>(Volume: 75/80, Items: [16, 16, 15, 14, 14]) <NumberBin>(Volume: 13/80, Items: [13]) Worst Fit With Sort Result: <BPResult (Total Bins: 18, Total Volume: 1440, Unused Volume: 88)> <NumberBin>(Volume: 80/80, Items: [63, 17]) <NumberBin>(Volume: 72/80, Items: [13, 12, 11, 11, 8, 8, ...]) <NumberBin>(Volume: 72/80, Items: [45, 27]) <NumberBin>(Volume: 72/80, Items: [43, 29]) <NumberBin>(Volume: 72/80, Items: [72]) <NumberBin>(Volume: 73/80, Items: [68, 5]) <NumberBin>(Volume: 73/80, Items: [46, 27]) <NumberBin>(Volume: 73/80, Items: [45, 28]) <NumberBin>(Volume: 74/80, Items: [42, 32]) <NumberBin>(Volume: 75/80, Items: [16, 16, 15, 14, 14]) <NumberBin>(Volume: 75/80, Items: [57, 18]) <NumberBin>(Volume: 76/80, Items: [54, 22]) <NumberBin>(Volume: 76/80, Items: [41, 35]) <NumberBin>(Volume: 77/80, Items: [59, 18]) <NumberBin>(Volume: 77/80, Items: [41, 36]) <NumberBin>(Volume: 78/80, Items: [57, 21]) <NumberBin>(Volume: 78/80, Items: [54, 24]) <NumberBin>(Volume: 79/80, Items: [27, 26, 26]) Best Fit With Sort Result: <BPResult (Total Bins: 18, Total Volume: 1440, Unused Volume: 88)> <NumberBin>(Volume: 80/80, Items: [45, 35]) <NumberBin>(Volume: 80/80, Items: [54, 26]) <NumberBin>(Volume: 80/80, Items: [54, 26]) <NumberBin>(Volume: 80/80, Items: [59, 21]) <NumberBin>(Volume: 80/80, Items: [63, 17]) <NumberBin>(Volume: 80/80, Items: [68, 12]) <NumberBin>(Volume: 80/80, Items: [27, 24, 18, 11]) <NumberBin>(Volume: 80/80, Items: [72, 8]) <NumberBin>(Volume: 80/80, Items: [45, 29, 6]) <NumberBin>(Volume: 80/80, Items: [57, 18, 5]) <NumberBin>(Volume: 79/80, Items: [43, 36]) <NumberBin>(Volume: 79/80, Items: [57, 22]) <NumberBin>(Volume: 79/80, Items: [41, 27, 11]) <NumberBin>(Volume: 78/80, Items: [46, 32]) <NumberBin>(Volume: 78/80, Items: [42, 28, 8]) <NumberBin>(Volume: 78/80, Items: [16, 16, 15, 14, 14, 3]) <NumberBin>(Volume: 68/80, Items: [41, 27]) <NumberBin>(Volume: 13/80, Items: [13])
4. 今後の発展方向及び参考資料
これまで見てきたBin Packingアルゴリズムは、各Itemが互いに関連性がなく独立していることを前提に構成されている。言い換えれば、Item間に相互に先後関係があり、1つのBinに一緒に埋められる必要がある場合などの依存性を考慮していないアルゴリズムである。
現実的には依存関係がない場合よりも依存性がある場合がはるかに多いといえる。例えば、Job1、Job2、Job3がそれぞれ独立して実行されても無防備な場合ではなく、Job2とJob3がJob1が先に実行された後に実行しなければならない場合が実務ではより多く発生する。
これまで知られているBin Packingアルゴリズムに依存性を反映して発展させる必要がある。この記事では、依存関係を反映したBin Packingは見ていません。誰でも追加研究を通じて改善、発展させた内容を共有してくれればとても感謝する。
この記事の内容のフィードバックはコメントまたは https://github.com/DAToolset/1D-bin-packing github issue、私のEメールで送ってください。
<< 関連記事のリスト >>
- 1次元Bin Packingアルゴリズムを活用した作業配分の最適化_1.概要
- 1次元Bin Packingアルゴリズムを活用した作業配分最適化_2.アルゴリズム(1)
- 1次元Bin Packingアルゴリズムを活用した作業配分最適化_2.アルゴリズム(2)
- 1次元Bin Packingアルゴリズムを活用した作業配分最適化_3.実装(1)
- 1次元Bin Packingアルゴリズムを活用した作業配分最適化_3.実装(2)
- 1次元Bin Packingアルゴリズムを活用した作業配分の最適化_4。
- 1次元Bin Packingツール最近の変更(2021-03-21基準)
- 1次元Bin Packingアルゴリズムを活用した作業配分最適化ツール