Chapter 03無料公開

【rej:02】PuLPのHello,World【Python】

fz5050
fz5050
2022.02.16に更新

【はじめに】

PuLPの基本的な使い方について。

【問題】

「材料A」・「材料B」とその2つを組み合わせて作ることができる「製品X」・「製品Y」がある。

「各製品の販売価格」、「各材料の在庫量」、「各製品を作るときの製造式」は次のとおりである

【販売価格】
・製品X:100円/kg
・製品Y:100円/kg

【在庫量】
・材料A:16kg
・材料B:18kg

【製造式】
・材料A(1kg)+材料B(3kg)→ 製品X(1kg)
・材料A(2kg)+材料B(1kg)→ 製品Y(1kg)

【目的】

「材料の在庫量の範囲」で「製品X」と「製品Y」を製造し、できるだけ「販売価格の合計」を大きくしたい。


【解答例】

■考え方

「x」:製品Xの生産量、「y」:製品Yの生産量とする。

内容 数式 備考
変数 x, y \geq 0
目的関数 100x + 100y 最大化
制約条件1 x + 2y \leq 16 材料Aは(X、Yの製造に使用しても16kgを超えないこと)
制約条件2 3x + y \leq 18 料Bは(X、Yの製造に使用しても18kgを超えないこと)

以下プログラムを作っていく。
実行環境は「Google Colab

【1】PuLPのインストール(Google Colab上)

!pip install pulp

【2】PuLPのソルバーへの対応状況を確認する

import pulp

# 対応ソルバー一覧を出力
pulp.list_solvers(onlyAvailable=False)

▲PuLPが対応しているソルバーが出力される(実行環境で利用可能かは別)

# 利用可能なソルバー
pulp.list_solvers(onlyAvailable=True)

▲実行環境で利用可能なソルバーはデフォルト付属のもののみなのがわかる。

■GLPK(Gnu Linear Programming Kit)を追加してみる場合

!apt-get install -y -qq glpk-utils
# バージョン確認でGLPKにパスが通っているかチェック
!glpsol --version

あらためて使用可能なソルバーを確認してみる

# 利用可能なソルバー
pulp.list_solvers(onlyAvailable=True)

▲使用可能なソルバーが増えているのがわかる

【3】全体コード

from pulp import LpProblem, LpVariable, LpStatus,value
from pulp import LpMaximize

# LpProblemオブジェクト作成
prob = LpProblem(sense=LpMaximize)

# 変数の用意
# デフォルトの値の範囲は[-∞, ∞]の連続値(free Continuous)
x = LpVariable("x")
y = LpVariable("y")

# 目的関数の作成
prob += 100*x + 100*y, "total value"

# 制約条件の作成
prob += x + 2*y <= 16
prob += 3*x + y <= 18

# 目的関数や制約条件を出力する
#print(prob) 

# ソルバーを指定して問題を解く
# デフォルトならそのまま「solve()」コールでOK
result = prob.solve()

# 追加したソルバを使う場合はsolverオブジェクトを生成して渡して計算させる
#solver = pulp.GLPK_CMD(msg=True)
#result = prob.solve(solver)


# 結果の確認
#print(result)

# “Not Solved”, “Infeasible”, “Unbounded”, “Undefined” , “Optimal”どれかがでる
print(LpStatus[prob.status])

# 答えを取り出す
for answer in prob.variables():
  print(answer.name, answer.varValue)

# 目的関数の計算結果を出力
print( value(prob.objective) )

▲ 製品Xを4kg,製品Yを6kg作れば、価格の合計値1000になる見込み。という計算となった。

コメント

noteに掲載している量子アニーリングの記事には、Python-MIPやPuLPではこんな感じに書ける、と付属させたかった。

そのため前準備として用意していたPuLPのハロワ用コードだった。PuLPはPuLPで使い方の説明が長くなりそうで、本編記事自体が進まなくなる可能性があったので、没とした。