-1

NL / ASL インターフェイスで Pyomo を使用して、cplex ソルバーから変数の .rc または .urc サフィックスを取得したいと考えています。このインターフェースは通常、モデルのデフォルトの cplex インターフェースよりも高速です。ただし、これらのサフィックスを返すように NL インターフェイスを取得できないようです。デフォルトのオプションで cplex ソルバーを使用すると、rc サフィックスの値が得られます。ただし、solver_io='nl' を使用するか、ソルバーを 'cplexamp' に設定すると (これは同じことをすると思います)、rc 値が得られません。(デュアルは取得できますが、rc は取得できません。)

コード例を次に示します。

from pyomo.environ import *
from pyomo.opt import SolverFactory

def show_rc(m, *args, **kwargs):
    opt = SolverFactory(*args, **kwargs)
    results = opt.solve(m, suffixes=['rc'])
    m.solutions.load_from(results)
    m.rc.pprint()

m = ConcreteModel()
m.X = Var(bounds=(0, 1))
m.obj = Objective(rule=lambda m: 3.14 * m.X, sense=maximize)
m.rc = Suffix(direction=Suffix.IMPORT, datatype=Suffix.FLOAT)

show_rc(m, "cplex")                  # has value 3.14
show_rc(m, "cplex", solver_io="nl")  # no value returned
show_rc(m, "cplexamp")               # no value returned

ドキュメントでは、サフィックスを介してコストを削減することが具体的に言及されており、AMPL では .rc サフィックスがこれの標準的な場所のようですが、Pyomo の NL インターフェースを介してこれを読むことはできません。誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

1

残念ながら、cplexamp 実行可能ファイルは、ソリューション ファイルで削減されたコストを返しません (確認したところです)。AMPL は、返された双対解を使用してこれらを計算しているに違いないと思います。GitHub でチケットを開きます。おそらく、その機能を ASL インターフェイスに追加できます。

速度に関しては、Cplex への Pyomo の Python ベースのインターフェース (solver_io="python") を試してください。これは、ファイル I/O を必要としないため、通常ははるかに高速です。Pyomo を介してそのインターフェースを使用する前に、Cplex-Python バインディングをインストールする必要があります。「cplexをインポート」できる場合は、問題ありません。

編集: Solver_io="python"Cplex のコスト削減を返すことを忘れていました。

于 2016-10-07T21:06:36.153 に答える