Pyscipopt 不处理目标函数中的 1/variable 和 variable^(negative number)

问题描述

我正在尝试解决一个大规模的非线性问题。下面是为 pyscipopt 编码的目标函数。我对列表 RouteTimeStop 中的元组 (r,p,s) 列表进行了一些循环,唯一的变量是 headway[pat]。当我遍历 RouteTimeStop 时,求解器停留在目标函数的创建上,并且在很长一段时间内没有产生任何进展。然后,我试着看看发生了什么,并考虑了列表的前 200 个元组

### BEGIN DECLARING THE MODEL ###
m = Model('CTA')
### END DECLARING THE MODEL ###

### BEGIN ADDING VARIABLES INTO THE MODEL m ###
headway = {}
for pat in Pattern:
    headway[pat] = m.addVar(vtype = "C",lb = 1,ub = 30,name = "headway (%s)"%(pat))
print("Added the variables.")
### END ADDING VARIABLES INTO THE MODEL m ###

### BEGIN INTRODUCING THE OBJECTIVE FUNCTION INTO m ###
m.setobjective(quicksum(b/2/(1-el[r,s])*con2[r,s]*(30**(1-el[r,s])
             -(quicksum(pattern_ratio[r,s,pat]*30*headway[pat] for pat in RTSPdict[r,s])/30)
             **(el[r,s]-1)) for (r,s) in RouteTimeStop[:200])
             + quicksum(con[r,s]*quicksum(pattern_ratio[r,pat]*30*headway[pat]
             for pat in RTSPdict[r,s])**el[r,s] for (r,s) in RouteTimeStop[:200]),'maximize')
print("Added the objective function.")
### END INTRODUCING THE OBJECTIVE FUNCTION ###

求解器产生以下错误

Added the variables.
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-40-164bed181b42> in <module>
     11 
     12 ### BEGIN INTRODUCING THE OBJECTIVE FUNCTION INTO m ###
---> 13 m.setobjective(quicksum(b/2/(1-el[r,s])
     14        -(quicksum(pattern_ratio[r,s])/30)
     15                 **(el[r,s) in RouteTimeStop[:200])

src/pyscipopt/scip.pyx in pyscipopt.scip.Model.setobjective()

AssertionError: given coefficients are neither Expr or number but SumExpr

在对目标函数进行了一些尝试后,我意识到目标函数中不接受数字/变量和变量^数字。我该如何处理这个问题?

解决方法

SCIP 不支持非线性目标函数。您可以通过引入另一个变量并将目标移动到约束中来重新表述问题:

max objvar subject to:
    objvar <= f

其中 f 是实际的非线性目标。