この問題は、次の場所に相互投稿されています: IBM CPLEX フォーラム
ベンダー分解を使用して 2 段階の最適化問題を解こうとしています。基本的な問題は次のようになります。
min_x (f(x) + min_u(g(u)))
ここで、g(u) は外部決定変数 x の固定値について解くことができる線形計画です。f(x) は x に関して線形の関数です。CPLEX の Python API を使用して特定のコードを実装し、コールバックを使用し、コールバックを使用してオンザフライで制約を生成しました。結果は予想通りです。
ここで問題が少し修正され、f(x) は x に関して 2 次関数になります。ただし、解決策が存在しないと言って問題は終了し、コールバックは呼び出されません。ソリューションが存在しない理由が見つからないので、これは驚くべきことです。コードのデバッグを試みたところ、カット生成のコールバック関数は、目的関数が 2 次でない場合に "mipopt(env, lp)" 関数の後に呼び出されていましたが、現在は呼び出されていません。問題の基本構造を画像として添付します。2 つの問題 (1 つは線形、もう 1 つは 2 次) の唯一の違いは、目的関数に 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)
私が本当に驚いた問題の 1 つは、すべての 2 次項の係数が 0 に設定されている場合、本質的に問題が以前と同じになる場合でも、solve()
「解が存在しません」というメッセージが返されることです。