问题交叉发布在: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()
仍会返回一条消息“不存在解决方案”。