5

アップデート

この質問は、私がクロスポストしたOR交換で徹底的に議論され、更新されました。

元の質問

コマンドラインからCPLEX12.5.0.0を実行すると、次のようになります。

cplex -f my_instance.lp

最適な整数解は19056.99ティックにあります。

しかし、Python APIを介して、まったく同じインスタンスで:

import cplex
problem = cplex.Cplex("my_instance.lp")
problem.solve()

必要な時間は97407.10ティックになります(5倍以上遅くなります)。

どちらの場合も、モードは並列で決定論的で、最大2つのスレッドです。このパフォーマンスの低下がPythonスレッドのオーバーヘッドによるものかどうか疑問に思って、私は次のことを試しました。

problem = cplex.Cplex("my_instance.lp")
problem.parameters.threads.set(1)
problem.solve()

必要な46513.04ティック(つまり、1つのコアを使用する方が2つを使用するよりも2倍高速でした!)。

一般的にCPLEXとLPに慣れていないので、これらの結果は非常に紛らわしいと思います。Python APIのパフォーマンスを向上させる方法はありますか、それとももっと成熟したAPI(JavaまたはC ++など)に切り替える必要がありますか?

附属書

2スレッドの解決策の詳細は次のとおりです。最初は(一般的な)前文です。

Tried aggregator 3 times.
MIP Presolve eliminated 2648 rows and 612 columns.
MIP Presolve modified 62 coefficients.
Aggregator did 13 substitutions.
Reduced MIP has 4229 rows, 1078 columns, and 13150 nonzeros.
Reduced MIP has 1071 binaries, 0 generals, 0 SOSs, and 0 indicators.
Presolve time = 0.06 sec. (18.79 ticks)
Probing fixed 24 vars, tightened 0 bounds.
Probing time = 0.08 sec. (18.12 ticks)
Tried aggregator 1 time.
MIP Presolve eliminated 87 rows and 26 columns.
MIP Presolve modified 153 coefficients.
Reduced MIP has 4142 rows, 1052 columns, and 12916 nonzeros.
Reduced MIP has 1045 binaries, 7 generals, 0 SOSs, and 0 indicators.
Presolve time = 0.05 sec. (11.67 ticks)
Probing time = 0.01 sec. (1.06 ticks)
Clique table members: 4199.
MIP emphasis: balance optimality and feasibility.
MIP search method: dynamic search.
Parallel mode: deterministic, using up to 2 threads.
Root relaxation solution time = 0.20 sec. (91.45 ticks)

コマンドラインからの結果:

GUB cover cuts applied:  1
Clique cuts applied:  3
Cover cuts applied:  2
Implied bound cuts applied:  38
Zero-half cuts applied:  7
Gomory fractional cuts applied:  2

Root node processing (before b&c):
  Real time             =    5.27 sec. (2345.14 ticks)
Parallel b&c, 2 threads:
  Real time             =   35.15 sec. (16626.69 ticks)
  Sync time (average)   =    0.00 sec.
  Wait time (average)   =    0.00 sec.
                          ------------
Total (root+branch&cut) =   40.41 sec. (18971.82 ticks)

Python APIの結果:

Clique cuts applied:  33
Cover cuts applied:  1
Implied bound cuts applied:  4
Zero-half cuts applied:  10
Gomory fractional cuts applied:  4

Root node processing (before b&c):
  Real time             =    6.42 sec. (2345.36 ticks)
Parallel b&c, 2 threads:
  Real time             =  222.28 sec. (95061.73 ticks)
  Sync time (average)   =    0.01 sec.
  Wait time (average)   =    0.00 sec.
                          ------------
Total (root+branch&cut) =  228.70 sec. (97407.10 ticks)
4

2 に答える 2