从 for 循环和 if 条件更改为列表理解和使用 ortools 的问题
Problem changing from for loop and if condition to list comprehension and using ortools
我正在编写一个 python 程序,利用 ortools 来解决问题。我正在尝试使用列表推导式尽可能多地更改 for 循环。几乎一切顺利,但有一个我无法更改
原版效果不错:
L_Filas = [i for i in range(9)]
C_Columnas = [i for i in range(9)]
# tablaOrigD is a nested dictionary, imported from an Excel sheet
modname = 'Sudoku'
solver = pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING
#solver = pywraplp.Solver.GUROBI_MIXED_INTEGER_PROGRAMMING
s: Solver = pywraplp.Solver(modname, solver)
#############
# Variables #
#############
x = [[[s.IntVar(0, 1, 'X_%s_%s_%s' % (i, j, k)) for k in nValores] for j in nColumnas] for i in nFilas]
nula = s.NumVar(0, 10, 'Nula')
#################
# RESTRICCIONES #
#################
for f in L_Filas:
for c in L_Columnas:
if tablaOrigD[f + 1][c + 1] :
s.Add(x[f][c][tablaOrigD[f + 1][c + 1] - 1] == 1)
#[s.Add((x[f][c][tablaOrigD[f + 1][c + 1] - 1] for c in L_Columnas if tablaOrigD[f+1][c+1])==1)]
一步一步,首先我尝试更改最内部的循环 (c var):
for f in L_filas:
[s.Add((x[f][c][tablaOrigD[f + 1][c + 1] - 1] for c in L_Columnas if tablaOrigD[f+1][c+1])==1)]
这行不通。没有语法或其他错误。程序结束时给出了错误的结果。
我的错误在哪里?
正如克雷格所说,目前没有机会重现您的程序,因此我必须做出一些假设。我假设您的第一个代码示例中的 s.Add()
实际上使用的 \t
比您的代码段中显示的多。我认为至少列表理解中的括号设置不正确。
所以我的综合列表指的是原始代码,如下所示:
for f in L_Filas:
for c in L_Columnas:
if tablaOrigD[f+1][c+1]:
s.Add(x[f][c][tablaOrigD[f+1][c+1] - 1] == 1)
可以简化为:
[s.Add(x[f][c][tablaOrigD[f+1][c+1] - 1] == 1) for f in L_Filas for c in L_Columnas if tablaOrigD[f+1][c+1]]
如果这没有帮助,请提供有关您的问题和 s.Add()
的更多信息,以及您是否知道您正在将表达式 boolean
传递给 s.Add()
.
我正在编写一个 python 程序,利用 ortools 来解决问题。我正在尝试使用列表推导式尽可能多地更改 for 循环。几乎一切顺利,但有一个我无法更改
原版效果不错:
L_Filas = [i for i in range(9)]
C_Columnas = [i for i in range(9)]
# tablaOrigD is a nested dictionary, imported from an Excel sheet
modname = 'Sudoku'
solver = pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING
#solver = pywraplp.Solver.GUROBI_MIXED_INTEGER_PROGRAMMING
s: Solver = pywraplp.Solver(modname, solver)
#############
# Variables #
#############
x = [[[s.IntVar(0, 1, 'X_%s_%s_%s' % (i, j, k)) for k in nValores] for j in nColumnas] for i in nFilas]
nula = s.NumVar(0, 10, 'Nula')
#################
# RESTRICCIONES #
#################
for f in L_Filas:
for c in L_Columnas:
if tablaOrigD[f + 1][c + 1] :
s.Add(x[f][c][tablaOrigD[f + 1][c + 1] - 1] == 1)
#[s.Add((x[f][c][tablaOrigD[f + 1][c + 1] - 1] for c in L_Columnas if tablaOrigD[f+1][c+1])==1)]
一步一步,首先我尝试更改最内部的循环 (c var):
for f in L_filas:
[s.Add((x[f][c][tablaOrigD[f + 1][c + 1] - 1] for c in L_Columnas if tablaOrigD[f+1][c+1])==1)]
这行不通。没有语法或其他错误。程序结束时给出了错误的结果。
我的错误在哪里?
正如克雷格所说,目前没有机会重现您的程序,因此我必须做出一些假设。我假设您的第一个代码示例中的 s.Add()
实际上使用的 \t
比您的代码段中显示的多。我认为至少列表理解中的括号设置不正确。
所以我的综合列表指的是原始代码,如下所示:
for f in L_Filas:
for c in L_Columnas:
if tablaOrigD[f+1][c+1]:
s.Add(x[f][c][tablaOrigD[f+1][c+1] - 1] == 1)
可以简化为:
[s.Add(x[f][c][tablaOrigD[f+1][c+1] - 1] == 1) for f in L_Filas for c in L_Columnas if tablaOrigD[f+1][c+1]]
如果这没有帮助,请提供有关您的问题和 s.Add()
的更多信息,以及您是否知道您正在将表达式 boolean
传递给 s.Add()
.