2013-07-21 1 views
1

J'essaie de convertir mon modèle OPL en Python en utilisant l'API Gurobi Python. Je voulais savoir s'il y avait un équivalent de structure de tuple OPL en Python. Meilleur pour montrer un exemple:ILOG OPL vs. Python

tuple tup_Leg 
{ 
    key string Route; 
    key string Leg; 
    int Curr_Time; 
    int Max_Time; 
    int Min_Time; 
    float Cube; 
} 

{tup_Leg} set_Leg = DBRead(db,"Exec SPROC ?")(Param);' 

Route et Leg sont des ensembles dans mon modèle d'optimisation; Curr_Time, Min_Time, Max_Time et Cube sont des paramètres indexés sur les ensembles Route et Leg.

Dans OPL, étant donné que je définis les routes et les branches comme des clés, elles peuvent être traitées comme des ensembles et les paramètres peuvent être indexés par-dessus. Par exemple, pour répondre à Curr_Time, je peux faire:

i.Curr_Time : i in set_Leg 

J'ai essayé difficile de trouver un équivalent de ce en Python. Jusqu'à présent, je donne les résultats suivants en Python:

import pyodbc 
Param = 123 
con = pyodbc.connect('Trusted_Connection=yes', driver = '{SQL Server Native Client  10.0}', server = 'Server', database='db') 
cur = con.cursor() 
cur.execute("execute SPROC @Param =%d" %Param) 
result = cur.fetchall() 
tup_Leg = dict(((Route, Leg), [Curr_Time, Min_Time, Max_Time, Cube]) for Route, Leg, Curr_Time, Min_Time, Max_Time, Cube in result) 

Je ne sais pas comment je peux répondre Curr_Time ou Min_Time? Jusqu'à présent, j'ai:

for i,j in tup_Leg: 
    Curr_Time, Min_Time, Max_Time, Cube = tup_Leg[(i,j)] 

Existe-t-il une meilleure façon de le faire autre qu'un dict? Je me demande s'il existe d'autres options qui me permettent d'aborder les champs de la table comme le permet la BPO.

Répondre

1

named tuples ressemblent aux opl uplets.

from collections import namedtuple 
TupLeg = namedtuple('TupLeg', ['route', 'leg', 
           'curr_time', 'min_time', 'max_time' 'cube']) 

tup_legs = dict((result[0], result[1]), TupLeg(*result) for result in cur) 

Une dict est une bonne structure de données pour accéder aux objets TupLeg par route, segment. Vous pouvez accéder à curr_time par

tup_legs[(i,j)].curr_time 

Le module itertools contient beaucoup d'algorithmes qui vous permettront d'accéder à des dictionnaires et d'autres collections de façon similaire à ce que vous êtes habitué à avoir OPL.

+0

Réponse parfaite! –