2017-01-24 1 views
1

Les données que je gère ne sont pas aussi simples que celles de la documentation. Comme mes variables dépendent essentiellement du fichier d'entrée de données, j'utiliserai l'exemple simple suivant pour expliquer ce que j'essaie de réaliser. Je les contraintes suivantes:Ajout de contraintes API CPLEX Python

x1 + x2 + x3 = 1 
x4 + x5 + x6 + x7 =1 
x8 + x9 = 1 

Je pense à l'aide d'une boucle d'appeler à plusieurs reprises la fonction c.linear_constraints.add(). Y a-t-il une meilleure façon de faire cela?

Répondre

1

En général, vous obtiendrez de meilleures performances si vous créez des lots de contraintes linéaires plutôt que de les créer un à la fois. Par exemple (en utilisant votre exemple ci-dessus), il est préférable de faire ce qui suit:

import cplex 
c = cplex.Cplex() 
c.variables.add(names=["x{0}".format(i+1) for i in range(9)]) 
c.linear_constraints.add(lin_expr=[[[0, 1, 2], [1.0, 1.0, 1.0]], 
            [[3, 4, 5, 6], [1.0, 1.0, 1.0, 1.0]], 
            [[7, 8], [1.0, 1.0]]], 
         rhs=[1.0, 1.0, 1.0], 
         names=["c{0}".format(i+1) for i in range(3)]) 
c.write("example.lp") 

Ce produit le fichier LP suivant:

Minimize 
obj: 
Subject To 
c1: x1 + x2 + x3 = 1 
c2: x4 + x5 + x6 + x7 = 1 
c3: x8 + x9 = 1 
End 

Ainsi, il serait préférable de lire dans votre fichier d'entrée, enregistrer les informations de contrainte dans une structure de données (listes ou autre), puis appeler c.linear_constraints.add une fois à la fin (ou toutes les contraintes X si votre fichier d'entrée est très grand).

+0

Merci beaucoup! J'ai pré-généré les indices et je les ai intégrés dans une seule fonction 'c.linear_constraints.add()'. –