0

问题交叉发布在:IBM CPLEX 论坛

我正在尝试使用弯曲器分解来解决两阶段优化问题。基本问题如下所示:

min_x (f(x) + min_u(g(u)))

其中 g(u) 是一个线性规划,可以求解外部决策变量 x 的固定值。f(x) 是关于 x 的线性函数。我使用 CPLEX 的 python API 实现了特定代码,方法是使用回调并使用回调动态生成约束。结果与预期一致。

现在问题稍作修改,f(x) 是关于 x 的二次函数。但是,问题退出说没有解决方案存在,并且永远不会调用回调。这令人惊讶,因为我找不到不应该存在解决方案的原因。当我尝试调试代码时,我发现当目标不是二次方时,虽然在“mipopt(env,lp)”函数之后调用了用于剪切生成的回调函数,但现在没有调用它。问题的基本结构以图像的形式附上。这两个问题(一个是线性的,另一个是二次的)的唯一区别是目标中存在 x0^2 项。

问题的结构是

主问题的代码是:

def createMasterProblem(x,u,budget,alpha,beta)
    cpx.objective.set_sense(cpx.objective.sense.minimize)

    for i in range(numNodes):
        varName = "x."+str(i)
        q.append(cpx.variables.get_num())
        cpx.variables.add(obj = [alpha[i]],
                          lb = [0.0], ub = [1], types = ["I"],
                          names = [varName])


    varName = "u"
    u.append(cpx.variables.get_num())
    cpx.variables.add(obj = [1],
                  lb = [-cplex.infinity],
                  ub = [cplex.infinity],
                  types = ["C"],
                  names = [varName])


    #add the budget constraint
    theVars = []
    theCoeffs = []
    for i in range(numNodes):
        theVars.append(x[i])
        theCoeffs.append(1)
    cpx.linear_constraints.add(lin_expr = [cplex.SparsePair(theVars,theCoeffs)],
                               senses = ["E"], rhs = [budget])

    #create the quadratic part of the objective function
    qmat = [[[0, 1, 2, 3], [beta, 0.0, 0.0, 0.0]],
       [[0, 1, 2, 3], [0.0, 0.0, 0.0, 0.0]],
       [[0, 1, 2, 3], [0.0, 0.0, 0.0, 0.0]],
       [[0, 1, 2, 3], [0.0, 0.0, 0.0, 0.0]]]
    cpx.objective.set_quadratic(qmat)

真正让我吃惊的问题之一是,如果所有二次项的系数都设置为 0,则基本上使问题与以前相同,即使这样solve()仍会返回一条消息“不存在解决方案”。

4

1 回答 1

0

验证 Beta 值:

检查为 beta 设置的值。如果该值小于 0 凸并且 CPLEX 将无法处理它。

于 2016-06-03T17:30:44.887 回答