在GEKKO中能否用变量乘以方程?MINLP约束报错求助
解决APMonitor中MINLP约束启用/禁用的语法错误问题
我在求解MINLP问题时,尝试通过带上下界的dummy_var定义变量间的约束,再用属于特殊有序集的binary_var乘以方程来启用或禁用这些约束,结果触发了以下语法错误:
---------------------------------------------------------------- APMonitor, Version 1.0.0 APMonitor Optimization Suite ---------------------------------------------------------------- --------- APM Model Size ------------ Each time step contains Objects : 7 Constants : 0 Variables : 81 Intermediates: 205 Connections : 57 Equations : 302 Residuals : 47 @error: Model Expression *** Error in syntax of function string: Invalid element: dummy_var=(function_1 Position: 23 ((binary_var)*(dummy_var=(function_1-function_2) ?
问题原因
APMonitor的表达式语法不允许在乘法操作内部嵌套赋值语句(比如(binary_var)*(dummy_var=(function_1-function_2))这种写法),赋值操作必须作为独立的方程存在,不能直接作为乘法的操作数。
正确实现方式
要实现用二进制变量启用/禁用约束,可按以下步骤调整:
单独定义dummy变量的等式
先把dummy_var和目标表达式的关系拆成独立方程:dummy_var = function_1 - function_2用二进制变量控制dummy变量的上下界
利用二进制变量binary_var来切换dummy_var的有效范围,实现约束的启用/禁用:- 当
binary_var=1时(启用约束):dummy_var >= lower_bound dummy_var <= upper_bound - 当
binary_var=0时(禁用约束):给dummy_var设置足够宽松的上下界(比如远大于实际问题中可能出现的数值范围),让约束失去作用。
- 当
备选方案:大M法
如果需要更严谨的逻辑控制,可使用大M法实现开关:dummy_var >= lower_bound - M*(1 - binary_var) dummy_var <= upper_bound + M*(1 - binary_var)这里的
M是一个足够大的常数,确保当binary_var=0时,约束的上下界会被放宽到不影响求解的程度。
内容的提问来源于stack exchange,提问作者R-dubs
相关产品推荐
相关产品推荐

