J'ai le LP suivant:
/ * Fonction objectif * / min: 1 w + 2 x + 0,5 y + z; / * Limites variables * / w + x <= T1; w + y = U1; x + z = U2; T1 = 50; U1 = 70; U2 = 25;
Dans ce cas, U1 + U2> T1 et la solution optimale est y = 70 et z = 25. Je veux appliquer la condition d'attribution de valeurs aux variables w et x avant d'attribuer des valeurs à y et z. Si U1 + U2 <T1, alors je veux que seuls w et x aient des valeurs et y = z = 0. Existe-t-il un moyen d'appliquer une telle contrainte dans un LP ou un MILP?
Réponses:
Voici les réponses à vos deux questions. Les détails dépendront du solveur que vous utilisez:
Veiller à ce que et reçoivent des valeurs avant et peut souvent être fait par programme en exprimant l'ordre des variables utilisé par le solveur. Autrement dit, en spécifiant les variables pour lesquelles le solveur essaie de trouver des valeurs en premier. Cela est possible, par exemple, dans le solveur choco (qui est un solveur de problème de satisfaction de contrainte (CSP) pas un pour LP ou MILP), bien que je suis sûr que d'autres solveurs offrent également cette possibilité.x y zw X y z
Le kit de programmation linéaire GNU a en fait une
if-then-else
construction pour exprimer les conditions. Recherchez «conditionnel» dans le manuel . Vous pouvez envelopper les clauses qui vous intéressent dans une telle déclaration:if U1 + U2 < T2 then y = 0 and z = 0 else true
. (Notez que je n'ai pas vraiment essayé cela, donc la syntaxe peut être erronée.)Une réponse alternative à la deuxième question profite du fait que , et sont des constantes. Simplement, ayez deux variantes du problème LP, une pour quand et une pour quand .U 2 T 1 U 1 + U 2 < T 1 U 1 + U 2 ≥ T 1U1 U2 T1 U1+U2<T1 U1+U2≥T1
la source