问题发布在: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项。
主要问题的代码是:
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;否解决方案存在"。
答案 0 :(得分:0)
验证Beta值:
检查为beta设置的值。如果该值较小,那么0凸和CPLEX将无法处理它。