-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
72 lines (59 loc) · 1.94 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
from pulp import LpProblem, LpVariable, LpMinimize, lpSum, LpStatus, value
import pandas as pd
import pprint
# 問題のパラメータ
bin_count = 5
bin_capacity = 10
items = [
{"item": "A", "size": 12},
{"item": "B", "size": 8},
{"item": "C", "size": 7},
{"item": "D", "size": 6},
{"item": "E", "size": 5},
{"item": "F", "size": 3},
]
# ビンデータ
bins = list(range(bin_count))
# 問題定義
problem = LpProblem("Min_FIBP", LpMinimize)
# 変数定義
x = LpVariable.dicts("x", ((i["item"], b) for i in items for b in bins), lowBound=0, cat="Continuous")
y = LpVariable.dicts("y", ((i["item"], b) for i in items for b in bins), cat="Binary")
# 目的関数: 分割数を最小化
problem += lpSum(y[i["item"], b] for i in items for b in bins)
# 制約: 各アイテムの合計サイズは元のサイズに等しい
for i in items:
problem += lpSum(x[i["item"], b] for b in bins) == i["size"]
# 制約: 各ビンの容量制限
for b in bins:
problem += lpSum(x[i["item"], b] for i in items) <= bin_capacity
# 制約: x_ij > 0 のとき y_ij = 1
for i in items:
for b in bins:
problem += x[i["item"], b] <= i["size"] * y[i["item"], b]
# 問題を解く
problem.solve()
# 結果の出力
status = LpStatus[problem.status]
used_bins = [b for b in bins if sum(value(x[i["item"], b]) for i in items) > 0]
packed_items = {
b: {i["item"]: value(x[i["item"], b]) for i in items if value(x[i["item"], b]) > 0}
for b in used_bins
}
results = {
"status": status,
"number_of_fragments": problem.objective.value(),
"packed_items": packed_items,
}
# Packed items をCSVに保存
packed_items_df = pd.DataFrame(
[
{"bin": b, "item": i, "packed_size": packed_items[b][i]}
for b in packed_items
for i in packed_items[b]
]
)
packed_items_csv_path = "./data/min_fibp_packed_items.csv"
packed_items_df.to_csv(packed_items_csv_path, index=False)
pprint.pprint(results)
print(packed_items_df)