2017-09-14 6 views
0

J'ai utilisé le PuLP library pour un projet parallèle (sports fantastiques quotidiens) où j'optimise la valeur projetée d'un alignement en fonction d'une série de contraintes.Contraindre sur un minimum de valeurs distinctes avec PuLP

J'ai implémenté la plupart d'entre eux, mais une contrainte est que les joueurs doivent provenir d'au moins trois équipes distinctes.

Cette paper a une implémentation (page 18, 4.2), que je suis attaché comme une image:

enter image description here

Il semble que qu'ils tirent en quelque sorte une variable d'indicateur pour chaque équipe qui est un si L'équipe donnée a au moins un joueur dans l'alignement, puis elle contraint la somme de ces indicateurs à être supérieure ou égale à 3.

Quelqu'un sait-il comment cela serait implémenté dans PuLP?

Des exemples similaires seraient également utiles.

Toute aide serait super appréciée!

Répondre

0

Dans ce cas, vous devez définir une variable binaire t qui définit une limite supérieure des variables x. En python, je n'aime pas nommer les variables avec une seule lettre mais comme je n'ai rien d'autre à faire ici, c'est comment je le ferais en pâte.

supposer que les variables lineups, players, players_by_team et teams sont fixés ailleurs

x_index = [i,p for i in lineups for p in players] 
t_index = [i,t for i in lineups for t in teams] 
x = LpVariable.dicts("x", x_index, lowBound=0) 
t = LpVAriable.dicts("t", t_index, cat=LpBinary) 
for l in teams: 
    prob += t[i,l] <=lpSum([x[i,k] for k in players_by_team[l]]) 
prob += lpSum([t[i,l] for l in teams]) >= 3 
+0

Merci beaucoup. J'étais capable de le comprendre. – user3382172