User Tools

Site Tools


solver:terminate_the_optimization_after_gams_cplex_reaches_a_certain_value_of_the_objective

Terminate the optimization after GAMS/CPLEX reaches a certain value of the objective

The example model below shows how to interact with CPLEX that it stops pretty much after CPLEX found the solution value 21 (or larger). This is done in using the same mechanism as described in “The GAMS Branch-and-Cut-and-Heuristic Facility”.

First we have userincbicall which is called every time we find a new incumbent. We are also in ”interactive” mode, meaning that we accept new options on the fly. The trigger for reading in new options is a trigger file called readop2. This is created by the incumbent checking routine only if we reached 21 or higher. The Cplex option sets a very large optca (Cplex name for it is epagap), so we should terminate immediately. The iatriggertime is set to 1 meaning that Cplex checks every second if there is a triggerfile. This should be set to larger values (60 seconds or so) for real models. This can be used effieciently, for example, in the case when a model is decomposed into sub-models. When a sub-model is solved then the solution can be used in the other sub-models to create a integer cut, hence the solution speed is improved.

Note: This approach requires distribution 22.6 ++.

Option description:

iatriggertime (double) The time interval in seconds when the solver checks for existence of the trigger file. This is comparable to the situation that ctrl+c is pressed if the trigger file exist. The options iatriggertime, iatriggerfile and iafile enables an automated way to handle the interactive communication with the solver.

iatriggerfile (string) The name of the trigger file. When the solver checks and finds the trigger file a secondary option file (iafile) is processed and the trigger file is removed. Note that the trigger file works as an indicator and only the existence of the file is checked.

iafile (string) The secondary option file consists of CPLEX options to be used during the remaining part of the solution procedure. Hence, the secondary option file, iafile, is dedicated to be used during the interactive communication with the solver. Processing of the iafile is triggered by existence of the iatriggerfile.

Example Model

$title Non-transitive Dice Design (DICE,SEQ=176)
$Ontext
 Probabilistic dice - an example of a non-transitive relation.
 We want to design a set of dice with an integer number on each face
 such that on average dice1 beats dice2, and dice2 on average beats
 dice3 etc, but diceN has to beat dice1.

 MIP codes behave very erratic on such a problem and slight
 reformulations can result in dramatic changes in performance. Also
 note the face value will be integers automatically.


 Gardner, M, Scientific American.

 Robert A Bosh, Mindsharpener, Optima, MP Society Newsletter, Vol 70,
 June 2003, page 8-9

 Robert A Bosh, Monochromatic Squares, Optima, MP Society Newsletter, 
 Vol 71, March 2004, page 6-7

$Offtext

sets    f    faces on a dice  / face1*face6 /
        dice number of dice   / dice1*dice3 / ;

scalars flo  lowest face value  / 1 /
        fup  highest face value
        wn   wins needed - possible bound ;

fup = card(dice) * card(f);

wn = floor(0.5 * sqr(card(f))) + 1;

alias(f,fp);
alias(dice,dicep);

variables  wnx               number of wins
           fval(dice,f)      value of dice - will be integer
           comp(dice,f,fp)   one if f beats fp ;
binary variable comp;

fval.lo(dice,f) = flo;
fval.up(dice,f) = fup;

fval.fx("dice1","face1") = flo;

equation eq1(dice)       count the wins
         eq3(dice,f,fp)  definition of non-transitive relation
         eq4(dice,f)     different face values for a single dice;

eq1(dice).. sum((f,fp), comp(dice,f,fp)) =e= wnx;

eq3(dice,f,fp) .. fval(dice,f) + (fup-flo)*(1-comp(dice,f,fp)) =g= fval(dice++1,fp) + 1;

eq4(dice,f-1) .. fval(dice,f-1) + 1 =l= fval(dice,f);

model xdice /all /;

$if set nosolve $exit

xdice.optfile=1; option mip=cplex; option optcr=0;

* Delete trigger file which might be around from a previous run
$call rm -rf readop2

* Set dummy upper bound
* Note: This is actually not necessary, it is just done because of a bug in older versions
wnx.up=1000;

solve xdice using mip max wnx;

$onecho > cplex.opt
userincbicall checkincb.gms
interactive yes
iafile cplex.op2
iatriggerfile readop2
iatriggertime 1
$offecho 

$echo epagap 1e20 > cplex.op2

$onecho > checkincb.gms
variable wnx;
$gdxin bchout_i.gdx
$load wnx
file fx /readop2/;
if (round(wnx.l) >= 21, put fx 'read cplex.op2');
$offecho

Log File

--- Job dice Start 02/01/08 12:56:42
GAMS Rev 149  Copyright (C) 1987-2007 GAMS Development. All rights reserved
...
--- Starting compilation
--- dice.gms(82) 3 Mb
--- Starting execution: elapsed 0:00:00.037
--- dice.gms(62) 4 Mb
--- Generating MIP model xdice
--- dice.gms(64) 4 Mb
---   126 rows  127 columns  465 non-zeroes
---   108 discrete-columns
--- dice.gms(64) 4 Mb
--- Executing CPLEX: elapsed 0:00:00.071

ILOG CPLEX    Dec 24, 2007 WEX.CP.CP 22.6 035.037.041.wei For Cplex 11.0
Cplex 11.0.0, GAMS Link 34 
Cplex licensed for 1 use of lp, qp, mip and barrier, with 2 parallel threads.

Reading parameter(s) from "C:\temp\cplex.opt"
>>  userincbicall checkincb.gms
>>  interactive yes
>>  iafile cplex.op2
>>  iatriggerfile readop2
>>  iatriggertime 1
Finished reading from "C:\temp\cplex.opt"
Reading data...
Starting Cplex...
Tried aggregator 1 time.
MIP Presolve eliminated 12 rows and 11 columns.
MIP Presolve modified 460 coefficients.
Reduced MIP has 114 rows, 116 columns, and 419 nonzeros.
Presolve time =    0.00 sec.
MIP emphasis: balance optimality and feasibility.
MIP search method: dynamic search.
Parallel mode: none, using 1 thread.
Tried aggregator 1 time.
No LP presolve or aggregator reductions.
Presolve time =    0.00 sec.
Initializing dual steep norms . . .

Iteration log . . .
Iteration:     1   Dual objective     =            30.000000
Perturbation started.
Iteration:    52   Dual objective     =            30.000000
Iteration:   114   Dual objective     =            29.999967
Removing perturbation.
Root relaxation solution time =    0.00 sec.

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

*     0+    0                            0.0000       29.6862      139     --- 
*** Reporting incumbent with objective 0.
      0     0       29.0000    59        0.0000      Cuts: 63      177     --- 
      0     0       28.4000    69        0.0000      Cuts: 36      216     --- 
      0     0       27.7572    64        0.0000      Cuts: 23      256     --- 
      0     0       26.7039    71        0.0000  Flowcuts: 17      317     --- 
*     0+    0                           12.0000       26.7039      317  122.53%
*** Reporting incumbent with objective 12.
      0     0       26.6207    72       12.0000      Cuts: 81      341  121.84%
      0     0       26.4449    74       12.0000  Flowcuts: 11      368  120.37%
      0     0       26.1618    76       12.0000      Cuts: 13      390  118.02%
      0     0       26.0578    73       12.0000      Cuts: 59      406  117.15%
      0     0       25.7993    74       12.0000   Flowcuts: 4      417  114.99%
      0     0       25.7065    73       12.0000       Cuts: 9      431  114.22%
      0     0       25.6514    73       12.0000   Impl Bds: 5      437  113.76%
      0     0       25.6510    73       12.0000   Flowcuts: 1      438  113.76%
*     0+    0                           16.0000       25.6510      438   60.32%
*** Reporting incumbent with objective 16.
      0     2       25.0000    70       16.0000       25.6510      438   60.32%
*    10+    7                           18.0000       25.0000      686   38.89%
*** Reporting incumbent with objective 18.
    100    59       24.0000    73       18.0000       24.3467     3322   35.26%
                                                     Cuts: 50                  
*   110+   59                           19.0000       24.3467     3674   28.14%
*** Reporting incumbent with objective 19.
    200   123       20.0000    14       19.0000       24.0000     7359   26.32%
                                                      Cuts: 8                  
*   240+  123                           20.0000       24.0000     8515   20.00%
                                                     Cuts: 13                  
*** Reporting incumbent with objective 20.
*   290+  108                           21.0000       24.0000    10576   14.29%
                                                      Cuts: 6                  
*** Reporting incumbent with objective 21.
    300   117    infeasible             21.0000       24.0000    11000   14.29%
    400   171       23.0000    41       21.0000       24.0000    15702   14.29%
                                                     Cuts: 26                  

Implied bound cuts applied:  1
Flow cuts applied:  67
Mixed integer rounding cuts applied:  6
Zero-half cuts applied:  1
Gomory fractional cuts applied:  2
>>  epagap 1e20

Implied bound cuts applied:  1
Flow cuts applied:  67
Mixed integer rounding cuts applied:  6
Zero-half cuts applied:  1
Gomory fractional cuts applied:  2
Fixing integer variables, and solving final LP...
Tried aggregator 1 time.
LP Presolve eliminated 124 rows and 125 columns.
Aggregator did 2 substitutions.
All rows and columns eliminated.
Presolve time =    0.00 sec.

Solution satisfies tolerances.

MIP Solution:           21.000000    (20900 iterations, 482 nodes)
Final Solve:            21.000000    (0 iterations)

Best possible:          23.000000
Absolute gap:            2.000000
Relative gap:            0.095238

--- Restarting execution
--- dice.gms(64) 2 Mb
--- Reading solution for model xdice
--- dice.gms(64) 2 Mb
*** Status: Normal completion
--- Job dice.gms Stop 02/01/08 12:56:44 elapsed 0:00:02.187
solver/terminate_the_optimization_after_gams_cplex_reaches_a_certain_value_of_the_objective.txt · Last modified: 2017/09/02 17:37 by support