【问题标题】:AMPL vs. Python - Importing tables (multi-dimensional dictionaries?)AMPL 与 Python - 导入表(多维字典?)
【发布时间】:2013-07-20 16:22:55
【问题描述】:

我是一名 AMPL 用户,尝试使用 Python(我的第一个 Python 代码)编写线性编程优化模型。我试图找到如何在复合集上声明索引参数。例如,在 AMPL 中,我会说: A组 B组 C组 参数 x{A, B, C} 参数 y{A, B, C} 参数 z{A, B, C} 上述集合和参数可以通过 AMPL 从数据库中轻松读取。

我从数据库中读取的表有六个字段,即 A、B、C、x、y、z。其中三个是主键(A、B、C),其余的(x,y,z)是在主键上索引的值。

Python 部分: 我正在使用 PYODBC 模块与 SQL Server 连接。我试过“dict”,但它只能索引一个键。 我不确定应该使用哪个 python 功能将前三个字段声明为复合集,并将 x、y 和 z 声明为复合集上的索引值。

import pyodbc    
con = pyodbc.connect('Trusted_Connection=yes', driver = '{SQL Server Native Client 10.0}', server = 'Server', database='db')
cur = con.cursor()
cur.execute("execute dbo.SP @Param =%d" %Param)
result = cur.fetchall()
Comp_Key, x, y, z= dict((A, B, C, [x,y,z]) for A, B, C, x, y, z in result)

当然这是不正确的。我想不出办法来做到这一点。

请帮帮我:) 提前致谢!

【问题讨论】:

    标签: python set mathematical-optimization ampl gurobi


    【解决方案1】:

    代替这个:

    Comp_Key, x, y, z= dict((A, B, C, [x,y,z]) for A, B, C, x, y, z in result)
    

    您可以这样做(如果 A、B、C != B、A、C,即 A B C 的顺序很重要):

    final_result = dict(((A, B, C), [x, y, z]) for A, B, C, x, y, z in result)
    

    final_result = {(A, B, C): [x, y, z] for A, B, C, x, y, z in result}  # more readable than first one
    

    或者你可以这样做(如果 A、B、C == B、A、C,即 A B C 的顺序无关紧要):

    final_result = dict((frozenset(A, B, C), [x, y, z]) for A, B, C, x, y, z in result)
    

    final_result = {frozenset(A, B, C): [x, y, z] for A, B, C, x, y, z in result}  # more readable than first one
    

    【讨论】:

    • 谢谢黛布!!非常感激!!我想知道的是,我应该在阅读表格之前声明这些集合和参数吗?如果是,如何?或者我应该这样做:'A、B、C、x、y、z = final_result'?我在这里得到的是在我读入集合和参数后如何分离它们?
    • 你不能在 python 中声明任何东西(它是动态类型的)。如果你的表有像[(A, B, C, x, y, z), (D, E, F, u, v, w)...] 这样的行,那么final_result 的值就是{(A, B, C): [x, y, z], (D, E, F): [u, v, w]...},那么你到底想问什么?
    • 让我从一个例子开始。在我从中读取数据的表中,A = 来源,B = 目的地,C = 产品,d = 成本,e = 体积,f = 数量。我希望能够在将数据作为字典读取后获得字段名称,以便我可以对集合(A、B、C)进行索引并检索参数值(x、y、z)以进行计算。跨度>
    • 好的,final_result dict 将有一个 tuple(A, B, C) [或 frozenset(A, B, C) 在第二种情况下] 作为键和 [x, y, z]list作为价值观。因此,对于任何 A、B、C,您都可以通过 x, y, z = final_result[(A, B, C)]x, y, z = final_result[frozenset(A, B, C)] [在第二种情况下].e 来检索 x、y、z
    • 完美!!非常感谢先生!
    猜你喜欢
    • 2018-07-24
    • 2012-11-19
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多