Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python cplex.linear_constraints.add对于大型模型来说太慢_Python_Python 3.x_Linear Programming_Cplex - Fatal编程技术网

Python cplex.linear_constraints.add对于大型模型来说太慢

Python cplex.linear_constraints.add对于大型模型来说太慢,python,python-3.x,linear-programming,cplex,Python,Python 3.x,Linear Programming,Cplex,我一直在尝试使用cplex来解决一个最佳运输问题。问题模型通常非常大(在我下面的描述中,变量总数为1048576(=1024^2),约束数量为2048)。我的问题是,添加约束的过程太慢,不实用(不过,解决模型所花的时间还不错)。我在谷歌上搜索了这个问题,有一些建议,但仍然找不到可行的解决方案 问题如下:给定两个长度相同1024的非负向量a和b,以及一个1024×1024的非负矩阵C。假设a的所有元素之和与b的元素之和相同(np.sum(a)=np.sum(b))。我想找到一个1024乘1024的

我一直在尝试使用cplex来解决一个最佳运输问题。问题模型通常非常大(在我下面的描述中,变量总数为1048576(=1024^2),约束数量为2048)。我的问题是,添加约束的过程太慢,不实用(不过,解决模型所花的时间还不错)。我在谷歌上搜索了这个问题,有一些建议,但仍然找不到可行的解决方案

问题如下:给定两个长度相同1024的非负向量ab,以及一个1024×1024的非负矩阵C。假设a的所有元素之和与b的元素之和相同(np.sum(a)=np.sum(b))。我想找到一个1024乘1024的非负矩阵X,使得C[I,j]*X[I,j]的和最小化,受限于Xi-第行的所有元素之和等于ai-第元素之和,以及Xj-第列的所有元素之和等于bj-第元素之和,对于所有可能的ij,即

Minimize:
C[0,0] * X[0,0] + C[0,1] * X[0,1] + ...  + C[1023,1023] * X[1023,1023]
Subject to:
All X[i,j] >= 0
X[0,0] + X[0,1] + ... + X[0,1023] == a[0]
X[1,0] + X[1,1] + ... + X[1,1023] == a[1]
...
X[1023,0] + X[1023,1] + ... X[1023,1023] == a[1023]
X[0,0] + X[1,0] + ... + X[1023,0] == b[0]
X[0,1] + X[1,1] + ... + X[1023,1] == b[1]
...
X[0,1023] + X[1,1023] + ... X[1023,1023] == b[1023]
我的代码大致如下:(在下面的代码点是运输模型;a和b是长度为1024的列表,C是长度为1048576(=1024**2)的列表)

正如我在评论中所写,向模型添加约束的过程太慢了。有没有办法加快它


任何帮助都将不胜感激。提前感谢!

使用索引而不是名称,您将获得更好的性能。文档中将对此进行讨论

以下是示例(仅模型构建部分)的修改版本,它使用索引:

from __future__ import print_function
import cplex

DOT = cplex.Cplex()
DOT.objective.set_sense(DOT.objective.sense.minimize)

size = 1024
C = [1.0] * (size * size)  # dummy data
# set up names of variables
nms = ["x{0}".format(i) for i in range(size * size)]
# add variables to the model and store indices as a list
nmindices = list(DOT.variables.add(obj = C, names = nms))

constraints = list()
for i in range(size):
    constraints.append([nmindices[i * size : (i + 1) * size], [1.0] * size])

for i in range(size):
    constraints.append(cplex.SparsePair(nmindices[i : size * size : size], [1.0] * size))
rhs = [1.0] * (size * 2)  # dummy data
constraint_senses = ["E"] * (size * 2)
# the following line: adding constraints to model is faster now
DOT.linear_constraints.add(lin_expr = constraints, senses = constraint_senses, rhs = rhs)
# write out the model in LP format for debugging
DOT.write("test.lp")

使用索引而不是名称将获得更好的性能。文档中将对此进行讨论

以下是示例(仅模型构建部分)的修改版本,它使用索引:

from __future__ import print_function
import cplex

DOT = cplex.Cplex()
DOT.objective.set_sense(DOT.objective.sense.minimize)

size = 1024
C = [1.0] * (size * size)  # dummy data
# set up names of variables
nms = ["x{0}".format(i) for i in range(size * size)]
# add variables to the model and store indices as a list
nmindices = list(DOT.variables.add(obj = C, names = nms))

constraints = list()
for i in range(size):
    constraints.append([nmindices[i * size : (i + 1) * size], [1.0] * size])

for i in range(size):
    constraints.append(cplex.SparsePair(nmindices[i : size * size : size], [1.0] * size))
rhs = [1.0] * (size * 2)  # dummy data
constraint_senses = ["E"] * (size * 2)
# the following line: adding constraints to model is faster now
DOT.linear_constraints.add(lin_expr = constraints, senses = constraint_senses, rhs = rhs)
# write out the model in LP format for debugging
DOT.write("test.lp")