0

この問題は、次の場所に相互投稿されています: 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()「解が存在しません」というメッセージが返されることです。

4

1 に答える 1

0

ベータ値を確認します:

beta の設定値を確認してください。値が 0 より小さい場合、CPLEX はそれを処理できなくなります。

于 2016-06-03T17:30:44.887 に答える