CPLEX:在外部优化中使用二次项进行Benders分解

时间:2016-05-18 03:50:29

标签: mathematical-optimization cplex nonlinear-optimization quadratic-programming

问题发布在:IBM CPLEX Forum

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

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

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

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

The structure of the problem is

主要问题的代码是:

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()也会返回一条消息,说'&34;否解决方案存在"。

1 个答案:

答案 0 :(得分:0)

验证Beta值:

检查为beta设置的值。如果该值较小,那么0凸和CPLEX将无法处理它。