如何创建来自解决方案 x[i,j] 的路由列表?

How to create an list of routes that come from a solution x[i,j]?

我正在尝试创建一种自动方法,通过在我的模型中获得的解决方案 x[i,j],设法生成所有路线的列表[列表],该列表收集每个解决方案 x , 在每次迭代中,但没有重复。

示例:

routes = []
    for i in range(N):
        for j in range(N):
                if x[i,j].x:
                    print(x[i,j])
                    routes.append([x[i,j]])

得到的解如下:

<gurobi.Var x[0,1] (value 1.0)>
<gurobi.Var x[1,3] (value 1.0)>
<gurobi.Var x[3,0] (value 1.0)>

这个解决方案是可以接受的,但我认为通过 routes.append([x[i,j]]) 数组以 routes=[[(0, 1), (1, 3), (3,0)]] 格式出现,这是我想要工作的格式,更简单。

相反,我得到了结果 [[<gurobi.Var x[0,1] (value 1.0)>], [<gurobi.Var x[1,3] (value 1.0)>], [<gurobi.Var x[3,0] (value 1.0)>]],这对我没有帮助。

我应该换一种格式吗? 顺便问一下,你能帮我创建一种方法,对于每次迭代和解决方案,首先检查 routes 并避免重复插入相同的路由吗?

您正在查找 x[i,j] 为 1 的索引。代码应如下所示:

routes = []
    for i in range(N):
        for j in range(N):
                if x[i,j].x:
                    print(x[i,j])
                    routes.append((i,j))

或者,使用 Python list comprehension 创建路由列表:

routes = [(i,j) for i in range(N) for j in range(N) if x[i,j].X > 0.5]

如果 x 是字典(或 Gurobi 元组字典),您可以将其简化为:

routes = [(i,j) for i,j in x.keys() if x[i,j].X > 0.5]