2013-07-21 3 views
1

Я пытаюсь преобразовать мою модель OPL в Python с помощью API-интерфейса Gurobi Python. Я хотел знать, существует ли эквивалент структуры кортежей OPL в Python. Лучше всего показать пример: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);' 

Маршрут и нога - это наборы в моей модели оптимизации; Curr_Time, Min_Time, Max_Time и Cube - это параметры, индексированные над наборами Route and Leg.

В OPL, так как я определяю Route и Leg как ключи, их можно рассматривать как наборы, и параметры могут быть проиндексированы над ними. Например, для решения Curr_Time, я могу сделать:

i.Curr_Time : i in set_Leg 

Я пытался трудно найти эквивалент этого в Python. До сих пор я следующий в 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) 

Я не знаю, как я могу обратиться Curr_Time или Min_Time? До сих пор у меня есть:

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

Есть ли лучший способ сделать это, кроме диктата? Мне интересно, есть ли другие опции, которые позволяют мне обращаться к полям таблицы, как позволяет OPL.

ответ

1

named tuples похоже на кортежи opl.

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) 

A dict - хорошая структура данных для доступа к объектам TupLeg по маршруту, ноге. Вы можете получить доступ к curr_time по

tup_legs[(i,j)].curr_time 

Модуля itertools содержит много алгоритмов, которые позволят вам получить доступ словарей и другие коллекции, таким образом, подобно тому, что вы привыкли к ССО.

+0

Отличный ответ! –