Je trouve difficile de convertir un modèle Excel Solver en syntaxe python pulp. Dans mon modèle, j'optimise les variables HC et OT pour chaque département, avec un objectif de minimisation de la somme des variables OT. Les contraintes exigent que les variables HC ne totalisent pas plus de 92 et que la production totale (=E2*C2*D2 + F2*C2
dans la feuille de calcul ci-dessous) réponde à une exigence par département (la colonne «Entrée» de la feuille de calcul Excel ci-dessous). La formulation du solveur Excel présentée ci-dessous fonctionne parfaitement.Conversion d'une solution de solveur Excel en pâte Python
Problème
- Comment puis-je écrire ma fonction objective dans la pâte (dans Excel F7 = SOMME (F2: F6))?
- contraintes E7 < = 92
- contraintes G2: G6> = B2: B6
- j'ai deux variables de décision HC et OT. Dans le code python ci-dessous, je n'ai créé qu'une seule variable.
Avant
Après Solver
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)