# アイテムをビンに入れるかどうかを示すノードを作成(バイナリ変数) x = [[LpVariable("x(%s,%s)" % (i, j), cat="Binary") for j inrange(item_count)] for i inrange(bin_count)]
# 目的関数: 使用するビンの数を最小化する prob += lpSum(x[i][j] for i inrange(bin_count) for j inrange(item_count))
# 制約条件: 各アイテムは1つのビンにしか入らない for j inrange(item_count): prob += lpSum(x[i][j] for i inrange(bin_count)) == 1
# 制約条件: 各ビンの容量を超えてアイテムを入れられない for i inrange(bin_count): prob += lpSum(item_weight[j] * x[i][j] for j inrange(item_count)) <= bin_capacity[i]
# 最適化計算 prob.solve()
# 結果表示 for i inrange(bin_count): print("*****Bin", i, "*****") total_weight = 0 for j inrange(item_count): if value(x[i][j])==1: print("Item", j) total_weight+=item_weight[j] print("Total weight:", total_weight)
x = [[LpVariable("x(%s,%s)" % (i, j), cat="Binary") for j inrange(item_count)] for i inrange(bin_count)]
ビンにアイテムを入れるかどうかを示す変数 x をバイナリ変数として定義しています。
5. 目的関数の設定
1
prob += lpSum(x[i][j] for i inrange(bin_count) for j inrange(item_count))
使用するビンの数を最小化する目的関数を定義しています。
6. 制約条件の設定
1 2 3 4 5
for j inrange(item_count): prob += lpSum(x[i][j] for i inrange(bin_count)) == 1
for i inrange(bin_count): prob += lpSum(item_weight[j] * x[i][j] for j inrange(item_count)) <= bin_capacity[i]
各アイテムが1つのビンにしか入らない制約条件と、各ビンの容量を超えない制約条件を設定しています。
7. 最適化計算
1
prob.solve()
PuLPを使って最適化問題を解いています。
8. 結果表示
1 2 3 4 5 6 7 8
for i inrange(bin_count): print("*****Bin", i, "*****") total_weight = 0 for j inrange(item_count): if value(x[i][j])==1: print("Item", j) total_weight+=item_weight[j] print("Total weight:", total_weight)
# 可視化 plt.figure(figsize=(8, 6)) for i, country inenumerate(countries): indices = range(i * num_products, (i + 1) * num_products) plt.scatter(transformed_data[:, 0][indices], transformed_data[:, 1][indices], label=country)
plt.figure(figsize=(8, 6)) for i, country inenumerate(countries): indices = range(i * num_products, (i + 1) * num_products) plt.scatter(transformed_data[:, 0][indices], transformed_data[:, 1][indices], label=country)