Optimization 非凸约束:CPLEX不能';我受不了

Optimization 非凸约束:CPLEX不能';我受不了,optimization,cplex,pyomo,non-convex,Optimization,Cplex,Pyomo,Non Convex,下面所示的数学模型给解算器CPLEX带来了麻烦。我理解问题的产生是由于约束的非凸性 min { (b)*(d*m) + (1-b)*(d*n) } st. Cons0: d = p-g, Cons1: b*d => 0, Cons2: (1-b)*(-d) => 0 模型寻求p的最优值。这个想法是;目标函数应考虑M值(即DM)大于P的P值,反之亦然(即DN)。b是一个二进制变量,m、n和g是假定给定的参数 我使用Pyomo(基于Python的优化建模语言)和解算器CPLEX。运行代

下面所示的数学模型给解算器CPLEX带来了麻烦。我理解问题的产生是由于约束的非凸性

min { (b)*(d*m) + (1-b)*(d*n) }
st.
Cons0: d = p-g,
Cons1: b*d => 0,
Cons2: (1-b)*(-d) => 0
模型寻求p的最优值。这个想法是;目标函数应考虑M值(即DM)大于P的P值,反之亦然(即DN)。b是一个二进制变量,m、n和g是假定给定的参数

我使用Pyomo(基于Python的优化建模语言)和解算器CPLEX。运行代码最终会出现以下错误消息:

"CPLEX Error  5002: 'c_Cons1_' is not convex."
请咨询我如何通过修改约束或其他方式绕过此非凸性问题


谢谢。

1)CPLEX无法处理非凸约束2)您可以尝试一些支持此功能的解算器(NLP;MINLP解算器,如Knitro、Baron、Couenne等)3)如果两个变量均为非负/
=0
->只需添加指标约束/变量(b_pos、d_pos),则约束是可行的并添加一个附加约束
b_pos+d_pos>=2
(逻辑and)。这些指标变量非常常见,谷歌搜索将向您展示一些方法。在凸环境中,通常使用二进制变量(这会导致一个混合整数问题),这反映在逻辑表达式中!我一定会尝试其他解决方案。然而,关于你的建议,恐怕我们束手无策,因为d并不总是非负的(即p和g是非负的;
如果g>p,那么d<0
)。你说过如果b和d都是非负的,可以使用这种方法,对吗?那么,我们还能做什么呢?二进制和连续变量的乘法可以线性化。如果
b*d>=0
是一个约束条件,那么您的问题只有在b>=0和d>=0时才可行(编辑:我忘记了负*负;这也可以添加)。只有这样,乘法才会产生一个>=0的值(或相反的观点:只有符号不同=xor时才不可行;忽略特殊情况0)。借助指示器约束和如上所示的逻辑约束,可以很容易地将其线性化。编辑确定,我关注的是错误提到的约束1。约束2是另一个问题,不像C1那么容易处理post@sascha谢谢。1)CPLEX无法处理非凸约束2)您可以尝试一些支持此功能的解算器(NLP;MINLP解算器,如Knitro、Baron、Couenne…)3)如果两个变量均为非负/
=0
->只需添加指标约束/变量(b_pos,d_pos)并添加额外约束
b_pos+d_pos>=2
(逻辑与)。这些指标变量非常常见,谷歌搜索将向您展示一些方法。在凸环境中,通常使用二进制变量(这会导致一个混合整数问题),这反映在逻辑表达式中!我一定会尝试其他解决方案。然而,关于你的建议,恐怕我们束手无策,因为d并不总是非负的(即p和g是非负的;
如果g>p,那么d<0
)。你说过如果b和d都是非负的,可以使用这种方法,对吗?那么,我们还能做什么呢?二进制和连续变量的乘法可以线性化。如果
b*d>=0
是一个约束条件,那么您的问题只有在b>=0和d>=0时才可行(编辑:我忘记了负*负;这也可以添加)。只有这样,乘法才会产生一个>=0的值(或相反的观点:只有符号不同=xor时才不可行;忽略特殊情况0)。借助指示器约束和如上所示的逻辑约束,可以很容易地将其线性化。编辑确定,我关注的是错误提到的约束1。约束2是另一个问题,不像C1那么容易处理post@sascha谢谢