あさた研メモ

主に私が気づいたこととか困った時のメモとか書き留めとく用。

0-1ナップザック問題解いた

この記事は PMOB Advent Calendar 2015 の 15 日目の記事です.

この前授業の課題で0-1ナップザック問題をソルバで解いてねって感じの問題が出たのでサッと書きました。

pythonpulpとかいうglpk使って解けるモジュール?(よくわからない)あったので、それを使ったらあっさりでした。
以下コード

#! /usr/bin/python
# encoding: utf-8

import pulp

# コンストラクタ
prob = pulp.LpProblem('knapsack', pulp.LpMaximize)

# 詰める荷物の数
print('num of obj: ', end='')
n = int(input())

a = [pulp.LpVariable('baggage{0}'.format(
    i), cat=pulp.LpBinary) for i in range(n)]
v = []
s = []
for i in range(n):
    print('[{0}]'.format(i))
    # 荷物の価値
    print('value: ', end='')
    v.append(int(input()))
    # 荷物のサイズ
    print('size: ', end='')
    s.append(int(input()))

# ナップザックの容量
print('knapsack capasity: ', end='')
b = int(input())

# 目的関数
prob += pulp.lpDot(v, a)
# 制約条件
prob += pulp.lpDot(s, a) <= b

# 問題も表示しておく
print()
print(prob)
prob.solve()

# 結果
print("Result:")
for i in range(n):
    print(a[i].getName(), int(a[i].value()))

lpDotとかいうリストの内積求めてくれる奴がめっちゃ便利でした。
ていうかソルバ神か