Excelソルバーモデルをpythonパルプ構文に変換するのが難しいと思っています。 私のモデルでは、OT変数の合計を最小化する目的で、各部門のHCおよびOT変数を最適化しています。この制約により、HC変数の合計は92以下になり、総生産量(以下のスプレッドシートの=E2*C2*D2 + F2*C2
)は部門ごとの要件(以下のExcelスプレッドシートの「入力」列)を満たしている必要があります。以下に示すExcelソルバーの定式化は完全に機能します。ExcelソルバーソリューションをPythonパルプに変換
-
問題は、どのように私は(:F6)エクセルF7 = SUM(F2に)パルプで私の目的関数を書くことができますか?
- 制約E7 < = 92
- 制約G2:G6> = B2:B6
- Iは、2つの決定変数HCとOTを有します。以下のPythonコードでは、私は1つの変数しか作成しませんでした。
ソルバー
import pulp
import numpy as np
import pandas as pd
idx = [0, 1, 2, 3, 4]
d = {'Dept': pd.Series(['Receiving', 'Picking', 'PPicking', 'QC', 'Packing'], index=idx),
'Target': pd.Series([61,94,32,63,116], index=idx),
'Hrs/day': pd.Series([7.75, 7.75, 7.75, 7.75, 7.75], index=idx),
'Prod': pd.Series([11733, 13011, 2715, 13682, 14194], index=idx),
'HC': pd.Series([24,18,6,28,16], index=idx),
'OT': pd.Series([0,0,42,0,0], index=idx)}
df = pd.DataFrame(d)
# Create variables and model
x = pulp.LpVariable.dicts("x", df.index, lowBound=0)
mod = pulp.LpProblem("OTReduction", pulp.LpMinimize)
# Objective function
mod += sum(df['OT'])
# Lower and upper bounds:
for idx in df.index:
mod += x[idx] <= df['Input'][idx]
# Total HC value should be less than or equal to 92
mod += sum([x[idx] for idx in df.index]) <= 92
# Solve model
mod.solve()
# Output solution
for idx in df.index:
print idx, x[idx].value()
# Expected answer
# HC, OT
# 19, 35.795
# 18, 0
# 11, 0
# 28, 0
# ----------------
# 92, 35.795 -> **note:** SUM(HC), SUM(OT)