当前位置: 首页 > 知识库问答 >
问题:

如何使用DOcplex(python)向模型添加二次约束?

胡鸿羲
2023-03-14

以这个二次约束为例:

(-x1^2 + x2^2 + x3^2 <= 0) 

注意,在CPLEX Python API中,上述约束的形式如下:

m.quadratic_constraints.add(
    quad_expr=[["x1", "x2", "x3"], ["x1", "x2", "x3"], [-1,   1,    1]],
    sense='L', rhs=0, name="q1"
)

如何使用DOcplex而不是CPLEX Python API将上述二次约束添加到模型中?

共有2个答案

益英逸
2023-03-14

Docplex允许您使用标准“*”运算符乘以变量以构建二次表达式,如中所示:

x*y或x*x

还可以使用 '**' (幂)运算符求取变量的平方,如

m、 添加(x**2 y**2

闻人思聪
2023-03-14

让我稍微修改一下我在docplex中的cpleqp等效程序中共享的示例

from docplex.mp.model import Model  

mdl = Model(name='qpex1')

#decision variables
x = {b: mdl.continuous_var(0,40,name="x"+str(b)) for b in range(0,3)}


# Constraint
mdl.add_constraint( - x[0] +     x[1] + x[2] <= 20, 'ct1')
mdl.add_constraint(x[0] - 3 * x[1] + x[2] <= 30,'ct2')

mdl.add_constraint(x[0] * x[0] <= 30,'quad')


# Objective
mdl.maximize(x[0] + 2 * x[1] + 3 * x[2]-\
             0.5 * ( 33*x[0]*x[0] + 22*x[1]*x[1] + 11*x[2]*x[2] -\
                     12*x[0]*x[1] - 23*x[1]*x[2] ))

msol=mdl.solve()

# Dislay solution
for v in mdl.iter_continuous_vars():
   print(v," = ",v.solution_value)

print("objective : ",msol.get_objective_value() ) 

mdl.add_constraint(x[0] * x[0] <= 30,'quad')

是二次约束

 类似资料:
  • 我需要解决一个类似背包问题的最佳化问题。我在这篇文章中详细描述了最佳化问题:动态变量背包优化我实际上需要使用python而不是OPL,所以我安装了docplex和clpex包,以便使用cplex优化框架。 这是我想用docplex转换成python的OPL代码 这是我的第一次代码尝试: 我实际上不知道如何正确地建模OPL代码中的变量xg、xc和z? 关于如何正确建模的任何想法。先谢谢你 编辑:这是

  • 本文向大家介绍Java泛型变量如何添加约束,包括了Java泛型变量如何添加约束的使用技巧和注意事项,需要的朋友参考一下 有时,类或方法需要对类型变量加以约束。下面是一个典型的例子,我们要寻找数组中的最小元素: 上述代码中的限制了用于实例化类型参数T的类型,必须是实现Comparable接口(只含有compareTo方法的标准接口)的类。如果没有对T进行限制,那么无法确保实例化T的类型具有compa

  • 问题内容: 我已经使用python创建了一个txt文件,其中包含几行文本,这些文本将由一个简单的程序读取。但是,我在重新打开文件以及在程序的后续部分中在文件中写入其他行时遇到了一些麻烦。(这些行将从稍后获得的用户输入中写入。) 这是假设“ file.txt”已被打开并被写入。但是,使用我当前拥有的代码第二次打开该文件时,我必须擦除之前编写的所有内容并重写新行。有没有办法防止这种情况发生(并可能减少

  • 从实体映射时,我想向DTO/model对象添加一个派生列表。例如,我有一个名为Company的实体类,它有一个员工列表。我希望公司模型对象包含员工列表和经理员工列表。(这不是我真正的类名,但这是我正在尝试做的事情)。所以,我希望公司数据有一个员工列表和一个经理列表,其中经理是通过过滤员工列表而得到的员工子集。 我尝试使用映射表达式和默认方法。然而,我需要使用EmployeeMapper,而我似乎没

  • 问题内容: 我想向表中添加一列,然后添加检查约束以确保其大于0。我似乎无法使它在oracle sl开发人员中运行。 错误报告-SQL错误:ORA-00904 ::无效的标识符00904。00000-“%s:无效的标识符” 问题答案: 语法中没有子句。只是。 这是 SQLFiddle 演示

  • 假设我有以下代码: 我怎样才能使它对打字和计算都更有效?