有许多替代方法可以创建约束。例如,您可以使用函数sum
或scal_prod
. 您可以批量创建或不批量创建。这是一个小测试代码,说明了不同的变体:
from docplex.mp.model import Model
import time
n = 1000
l = n
B = { (i, j) : i * n + j for i in range(l) for j in range(n) }
with Model() as m:
x = m.binary_var_dict(range(n),name="x");
xv = [ax for i,ax in x.items()];
start = time.time()
for i in range(l):
Bx = {xv[j]:B[i,j] for j in range(n)};
Bx = m.linear_expr(Bx);
m.add_constraint(Bx == 1);
elapsed1 = time.time() - start
print('Original: %.2f' % elapsed1)
with Model() as m:
x = m.binary_var_dict(range(n),name="x");
xv = [ax for i,ax in x.items()];
start = time.time()
m.add_constraints(m.linear_expr({xv[j]:B[i,j] for j in range(n)}) == 1 for i in range(l))
elapsed2 = time.time() - start
print('Original batched: %.2f' % elapsed2)
with Model() as m:
x = m.binary_var_dict(range(n),name="x");
xv = [ax for i,ax in x.items()];
start = time.time()
for i in range(l):
m.add_constraint(m.sum(B[i,j] * xv[j] for j in range(n)) == 1)
elapsed3 = time.time() - start
print('Sum: %.2f' % elapsed3)
with Model() as m:
x = m.binary_var_dict(range(n),name="x");
xv = [ax for i,ax in x.items()];
start = time.time()
Bx = m.linear_expr(Bx);
m.add_constraints(m.sum(B[i,j] * xv[j] for j in range(n)) == 1 for i in range(l))
elapsed4 = time.time() - start
print('Sum batched: %.2f' % elapsed4)
with Model() as m:
x = m.binary_var_dict(range(n),name="x");
xv = [ax for i,ax in x.items()];
start = time.time()
for i in range(l):
m.add_constraint(m.scal_prod([xv[j] for j in range(n)],
[B[i,j] for j in range(n)]) == 1)
elapsed5 = time.time() - start
print('scal_prod: %.2f' % elapsed5)
with Model() as m:
x = m.binary_var_dict(range(n),name="x");
xv = [ax for i,ax in x.items()];
start = time.time()
Bx = m.linear_expr(Bx);
m.add_constraints(m.scal_prod([xv[j] for j in range(n)],
[B[i,j]for j in range(n)]) == 1 for i in range(l))
elapsed6 = time.time() - start
print('scal_prod batched: %.2f' % elapsed6)
在我的盒子上,这给了
Original: 1.86
Original batched: 1.82
Sum: 2.84
Sum batched: 2.81
scal_prod: 1.55
scal_prod batched: 1.50
所以批处理不会买太多但scal_prod
比linear_expr