Получите время оптимизации, используя Pulp и Cplex - PullRequest
1 голос
/ 25 февраля 2020

Используя Python и Pulp, я хочу распечатать время оптимизации, необходимое Cplex.

Я использую

prob.solve(CPLEX_CMD(msg=1))

, поэтому я уже получаю сообщения от Cplex, но я не знаю, где найти общее время решения.

Вот что я получаю от Cplex:

Welcome to IBM(R) ILOG(R) CPLEX(R) Interactive Optimizer 12.8.0.0
  with Simplex, Mixed Integer & Barrier Optimizers
5725-A06 5725-A29 5724-Y48 5724-Y49 5724-Y54 5724-Y55 5655-Y21
Copyright IBM Corp. 1988, 2017.  All Rights Reserved.

Type 'help' for a list of available commands.
Type 'help' followed by a command name for more
information on commands.

CPLEX> Problem '/tmp/591faecbb00f459f8a6148ec85927a46-pulp.lp' read.
Read time = 0.00 sec. (0.08 ticks)
CPLEX> Tried aggregator 2 times.
MIP Presolve eliminated 8 rows and 7 columns.
MIP Presolve modified 175 coefficients.
Aggregator did 6 substitutions.
Reduced MIP has 679 rows, 361 columns, and 4140 nonzeros.
Reduced MIP has 288 binaries, 0 generals, 0 SOSs, and 0 indicators.
Presolve time = 0.00 sec. (3.00 ticks)
Probing fixed 6 vars, tightened 0 bounds.
Probing time = 0.00 sec. (3.58 ticks)
Tried aggregator 1 time.
MIP Presolve eliminated 0 rows and 6 columns.
Reduced MIP has 679 rows, 355 columns, and 4080 nonzeros.
Reduced MIP has 282 binaries, 0 generals, 0 SOSs, and 0 indicators.
Presolve time = 0.00 sec. (2.11 ticks)
Probing time = 0.00 sec. (2.76 ticks)
Clique table members: 2393.
MIP emphasis: balance optimality and feasibility.
MIP search method: dynamic search.
Parallel mode: deterministic, using up to 12 threads.
Root relaxation solution time = 0.00 sec. (2.20 ticks)

        Nodes                                         Cuts/
   Node  Left     Objective  IInf  Best Integer    Best Bound    ItCnt     Gap

      0     0     -412.3658    29                   -412.3658      107         
      0     0     -418.2065    28                    Cuts: 41      140         
      0     0     -418.6510    28                    Cuts: 27      157         
      0     0     -418.7747    28                     Cuts: 9      163         
*     0+    0                         -506.6606     -418.7747            17.35%
      0     2     -418.7747    28     -506.6606     -478.2859      163    5.60%
Elapsed time = 0.17 sec. (115.98 ticks, tree = 0.01 MB, solutions = 1)

Implied bound cuts applied:  27
Flow cuts applied:  9
Mixed integer rounding cuts applied:  10
Zero-half cuts applied:  2
Lift and project cuts applied:  7
Gomory fractional cuts applied:  6

Root node processing (before b&c):
  Real time             =    0.16 sec. (115.64 ticks)
Parallel b&c, 12 threads:
  Real time             =    0.08 sec. (45.29 ticks)
  Sync time (average)   =    0.03 sec.
  Wait time (average)   =    0.00 sec.
                          ------------
Total (root+branch&cut) =    0.23 sec. (160.94 ticks)

Solution pool: 1 solution saved.

MIP - Integer optimal solution:  Objective = -5.0666058400e+02
Solution time =    0.24 sec.  Iterations = 7802  Nodes = 554
Deterministic time = 160.94 ticks  (683.22 ticks/sec)

CPLEX> MILP problem relaxed to LP with fixed integer variables using
incumbent solution.
CPLEX> Tried aggregator 1 time.
LP Presolve eliminated 410 rows and 295 columns.
Aggregator did 10 substitutions.
Reduced LP has 273 rows, 69 columns, and 546 nonzeros.
Presolve time = 0.00 sec. (0.57 ticks)
Initializing dual steep norms . . .

Iteration log . . .
Iteration:     1   Dual objective     =          -467.571080

Dual simplex - Optimal:  Objective = -5.0666058400e+02
Solution time =    0.00 sec.  Iterations = 6 (0)
Deterministic time = 1.11 ticks  (1105.50 ticks/sec)

CPLEX> Solution written to file '/tmp/591faecbb00f459f8a6148ec85927a46-pulp.sol'.
CPLEX> Status:  Optimal

Где я могу найти / как получить общее время, необходимое Cplex для решения моей проблемы оптимизации?

1 Ответ

0 голосов
/ 25 февраля 2020

Использование файла журнала CPLEX

Судя по журналу, вы решаете дважды. Один раз, чтобы решить MILP, а затем вы измените проблему на «фиксированную MILP» и решите снова. Я не уверен, что вы делаете это специально или PuLP делает это для вас. В любом случае, время решения для каждого, соответственно, можно увидеть с помощью следующих строк из журнала:

Solution time =    0.24 sec.  Iterations = 7802  Nodes = 554

и

Solution time =    0.00 sec.  Iterations = 6 (0)

Итак, чтобы получить общее время в целом, вам нужно сложить их, например, так:

0.24 sec. + 0.00 sec. = 0.24 sec.

Общее время от Python кода

В качестве альтернативы, вы можете получить время до и после вызова solve метод в вашем Python коде. Это будет включать дополнительные накладные расходы на звонки через Python и PuLP. Например, используя time.perf_counter , вы можете сделать что-то вроде этого:

import time
...
start = time.perf_counter()
prob.solve(CPLEX_CMD(msg=1))
total = time.perf_counter() - start
print("Total time:", total)
...