Transition Pulp vers Pyomo de l'extrait conditionnel [duplicate]

Sep 12 2020

J'ai besoin de migrer un morceau de PULP vers pyomo. Mon extrait de code Pulp est ci-dessous. Il s'agit essentiellement de filtrer la combinaison possible et impossible avant de la convertir en variable.

feasible_set = [(a, b) for a in food_type for b in specimen_type if condition satisfied]                 
not_feasible_set= [(a, b) for a in food_type for b in specimen_type if (a,b) not in feasible_set]

allocate = pulp.LpVariable.dicts("allocate", feasible_set, 0, 1, pulp.LpInteger)        
allocate.update(pulp.LpVariable.dicts("allocate", not_feasible_set, 0, 0, pulp.LpInteger)) 

Comment puis-je écrire la même chose dans pyomo en utilisant pyomo.environ.Var?

Réponses

1 AirSquid Sep 13 2020 at 22:31

Sur le premier point concernant l'alimentation des variables triviales de contraintes ... ne le faites pas. :) Vous n'avez besoin de construire des contraintes que pour les instances actives (ou "légales") de vos variables, vous devez donc être assez adroit pour créer des sous-ensembles. Dans l'exemple ci-dessous, j'utilise certaines données pour créer un ensemble de valeurs "interdites" et les exclure de la construction de la contrainte. Il existe de nombreuses variantes de cela. J'aurais pu (au début) simplement créer un ensemble de combinaisons juridiques avec une construction similaire et l'utiliser si cela avait du sens. Si les valeurs "interdites" sont uniquement relatives à cette contrainte et non universelles, cette méthode fonctionne.

import pyomo.environ as pyo

prohib_combos = {('veggie', 3), ('dairy', 2)}

mdl = pyo.ConcreteModel()

mdl.food_type = pyo.Set(initialize={'veggie', 'meat', 'dairy'})
mdl.specimen_type = pyo.Set(initialize=[1,2,3])

mdl.allocate = pyo.Var(mdl.food_type, mdl.specimen_type, domain=pyo.NonNegativeIntegers)

mdl.prohibited = pyo.Set(within=mdl.food_type * mdl.specimen_type, 
    initialize=prohib_combos)


def c1(self, food, specimen):
    return mdl.allocate[food, specimen] <= 2
legal_combos = [ (f, s) for f in mdl.food_type for s in mdl.specimen_type
                    if (f, s) not in mdl.prohibited]
mdl.c1 = pyo.Constraint(legal_combos, rule=c1)

mdl.pprint()