KeyError: (1, 1) when trying to use python list comprehension and google- ortools
KeyError: (1, 1) when trying to use python list comprehension and google- ortools
我在这里使用了这个例子if/else in a list comprehension
使用 if-else 进行列表理解以创建总和约束。
这是触发错误的代码
for j in range(1, m+1):
solver.Add(solver.Sum([0 if c[i][j]==0 else x[i, j] for i in range(1, n+1)]) <= 1)
x 是之前定义的字典,c[i][j] 是一个布尔值,当 (i,j) 在允许范围内时为 1。但是当 (i,j) 被允许时 x[i,j] 在 ortools 中持有一个变量。所以我要说的是,我希望这个特定的 j 对 x[i,j]'s 求和,如果 x[i,j] 存在则可以,如果不存在则只需添加 0 .
c = [[0]*(m+1)]*(n+1)
for (i,j) in permitted:
c[i][j]=1
x = {}
for (i,j) in permittted:
x[i, j] = solver.IntVar(0, 1, '')
您的布尔列表的定义方式存在问题。考虑一下:
In [1]: c = [[0] * 2] * 3
In [2]: c
Out[2]: [[0, 0], [0, 0], [0, 0]]
In [3]: c[1][1] = 1
In [4]: c
Out[4]: [[0, 1], [0, 1], [0, 1]]
在c
中,您实际上重复了相同的内部列表,因此分配单个值会反映在每个副本中。因此,您对 c[i][j] == 0
的检查可能不会产生您预期的结果。
尝试将 c
的定义更改为:
c = [[0] * (m + 1) for _ in range(n + 1)]
我在这里使用了这个例子if/else in a list comprehension 使用 if-else 进行列表理解以创建总和约束。
这是触发错误的代码
for j in range(1, m+1):
solver.Add(solver.Sum([0 if c[i][j]==0 else x[i, j] for i in range(1, n+1)]) <= 1)
x 是之前定义的字典,c[i][j] 是一个布尔值,当 (i,j) 在允许范围内时为 1。但是当 (i,j) 被允许时 x[i,j] 在 ortools 中持有一个变量。所以我要说的是,我希望这个特定的 j 对 x[i,j]'s 求和,如果 x[i,j] 存在则可以,如果不存在则只需添加 0 .
c = [[0]*(m+1)]*(n+1)
for (i,j) in permitted:
c[i][j]=1
x = {}
for (i,j) in permittted:
x[i, j] = solver.IntVar(0, 1, '')
您的布尔列表的定义方式存在问题。考虑一下:
In [1]: c = [[0] * 2] * 3
In [2]: c
Out[2]: [[0, 0], [0, 0], [0, 0]]
In [3]: c[1][1] = 1
In [4]: c
Out[4]: [[0, 1], [0, 1], [0, 1]]
在c
中,您实际上重复了相同的内部列表,因此分配单个值会反映在每个副本中。因此,您对 c[i][j] == 0
的检查可能不会产生您预期的结果。
尝试将 c
的定义更改为:
c = [[0] * (m + 1) for _ in range(n + 1)]