1

我不知道我的问题是否可能。我正在使用 ortools 来解决优化问题,并且我知道在部分条件中,参数应该以双精度类型定义,如下所示:

constraints[i] = solver.Constraint(0.0 , 10,0)

但我的问题是,我不想在创造条件时使用这种类型的论据。例如,我想要一个列表。

所以我在我的代码中写了这个:

constraints[i] = solver.Constraint([1,2,3,...])

我得到了这个错误:

return _pywraplp.Solver_Constraint(self, *args)
NotImplementedError: Wrong number or type of arguments for overloaded 
function 'Solver_Constraint'.
Possible C/C++ prototypes are:
operations_research::MPSolver::MakeRowConstraint(double,double)
operations_research::MPSolver::MakeRowConstraint()
operations_research::MPSolver::MakeRowConstraint(double,double,std::string 
const &)
operations_research::MPSolver::MakeRowConstraint(std::string const &)

有没有办法改变条件参数的类型?

4

1 回答 1

0

我的假设

  • 您的约束表达式是“一些列表的总和”,这意味着类似于NumPy 库所做的事情:例如,如果您有两个值列表,[1, 2, 3]并且[4, 5, 6],它们的总和将是element-wise, st [1, 2, 3] + [4, 5, 6]= [1+4, 2+5, 3+6]= [5, 7, 9]
  • 您的“列表约束”也是元素方面的;例如,[x1, x2, x3] <= [1, 2, 3]意味着和。x1 <= 1x2 <= 2x3 <= 3
  • 您正在使用GLOP 线性求解器。(我在下面所说的一切都适用于 ILP/CP/CP-SAT 求解器,但一些特定的方法名称/其他细节是不同的。)

我的答案

问题是,ortools只允许您将量值(如数字)设置为变量;可以这么说,您不能制作“列表变量”。

因此,您必须列出有效表示同一事物的标量变量。

例如,假设您希望您的“列表变量”是一个值列表,每个值都受到您存储在列表中的特定约束。假设您有一个上限列表:

upper_bounds = [1, 2, 3, ..., n]

你有几个求解器变量列表,如下所示:

vars1 = [
    # variable bounds here are chosen arbitrarily; set them to your purposes
    solver.NumVar(0, solver.infinity, 'x{0}'.format(i))
    for i in range(n)
]
vars2 = [...]  # you define any other variable lists in the same way

然后,您将创建一个约束对象列表,列表中的每个上限都有一个约束:

constraints = [
    solver.Constraint(0, ubound)
    for ubound in upper_bounds
]

并且您将变量插入到您的约束中,但是这取决于您的问题:

# Example expression: X1 - X2 + 0.5*X3 < UBOUND
for i in range(n):
    constraints[i].SetCoefficient(vars1[i], 1)
    constraints[i].SetCoefficient(vars2[i], -1)
    constraints[i].SetCoefficient(vars3[i], 0.5)

希望这可以帮助!我建议(另一个,如果你已经有的话)看看你的特定求解器的例子。可以在这里找到 GLOP 的那个。

于 2018-10-23T22:17:05.430 回答