5.5.0.15 Solver Non-Optimal Solution

View: New views
4 Messages — Rating Filter:   Alert me  

5.5.0.15 Solver Non-Optimal Solution

by zfirth :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

In 5.5.0.5 this mps file gave the optimal solution (using the default settings).  In the latest 5.5.0.15 version, the optimal solution is not found (using the default settings).  Could someone explain why?

(I have added the mps file and output from the programs below.)

This is the mps file :

NAME MCPCSolverFile
ROWS
 N  OBJ
 L  YEAR001
 L  YEAR002
 L  YEAR003
 L  YEAR004
 L  YEAR005
 L  YEAR006
 L  MCP0000
 L  MCP0001
 L  MCP0002
 E  MCF0000
 E  MCF0001
 E  MCF0002
 G  GRP0005
 G  AUG0001
COLUMNS
    COL0000   OBJ       -225
    COL0000   YEAR001   1500
    COL0000   YEAR002   1500
    COL0000   YEAR003   1500
    COL0000   YEAR004   1500
    COL0000   YEAR005   1500
    COL0000   YEAR006   1500
    COL0000   MCP0000   1
    MNF0000   MCP0000   1
    MNF0000   MCF0000   1
    MIF0000   MCF0000   1
    MIF0000   GRP0005   1
    MIF0000   AUG0001   1
    COL0006   OBJ       -375
    COL0006   YEAR001   1500
    COL0006   YEAR002   1500
    COL0006   YEAR003   1500
    COL0006   YEAR004   1500
    COL0006   YEAR005   1500
    COL0006   YEAR006   1500
    COL0006   MCP0001   1
    MNF0001   MCP0001   1
    MNF0001   MCF0001   1
    MIF0001   MCF0001   1
    MIF0001   GRP0005   1
    MIF0001   AUG0001   1
    COL0012   OBJ       -390
    COL0012   YEAR001   1500
    COL0012   YEAR002   1500
    COL0012   YEAR003   1500
    COL0012   YEAR004   1500
    COL0012   YEAR005   1500
    COL0012   YEAR006   1500
    COL0012   MCP0002   1
    MNF0002   MCP0002   1
    MNF0002   MCF0002   1
    MIF0002   MCF0002   1
    MIF0002   AUG0001   12.5
    GIF0005   GRP0005   11.5
    GIF0005   AUG0001   1
    GNF0005   GRP0005   13.5
    ANF0001   AUG0001   13
RHS
    RHS1      YEAR001   3700
    RHS1      YEAR002   4500
    RHS1      YEAR003   4500
    RHS1      YEAR004   4500
    RHS1      YEAR005   4500
    RHS1      YEAR006   4500
    RHS1      MCP0000   1
    RHS1      MCP0001   1
    RHS1      MCP0002   1
    RHS1      MCF0000   1
    RHS1      MCF0001   1
    RHS1      MCF0002   1
    RHS1      GRP0005   13
    RHS1      AUG0001   13
BOUNDS
 LO BND1      COL0000   0
 UP BND1      COL0000   1
 LI BND1      MIF0000   0
 UI BND1      MIF0000   1
 LI BND1      MNF0000   0
 UI BND1      MNF0000   1
 LO BND1      COL0006   0
 UP BND1      COL0006   1
 LI BND1      MIF0001   0
 UI BND1      MIF0001   1
 LI BND1      MNF0001   0
 UI BND1      MNF0001   1
 LO BND1      COL0012   0
 UP BND1      COL0012   1
 LI BND1      MIF0002   0
 UI BND1      MIF0002   1
 LI BND1      MNF0002   0
 UI BND1      MNF0002   1
 LI BND1      GIF0005   0
 UI BND1      GIF0005   1
 LI BND1      GNF0005   0
 UI BND1      GNF0005   1
 LI BND1      ANF0001   0
 UI BND1      ANF0001   1
RANGES
    BND2      MCP0000   0
    BND2      MCP0001   0.6
    BND2      MCP0002   0
    BND2      GRP0005   2
    BND2      AUG0001   4
ENDATA


The optimal solution should be (given by 5.5.0.5) :

Value of objective function: -790

Actual values of the variables:
COL0000                         1
MNF0000                         0
MIF0000                         1
COL0006                  0.466667
MNF0001                         0
MIF0001                         1
COL0012                         1
MNF0002                         0
MIF0002                         1
GIF0005                         1
GNF0005                         0
ANF0001                         0

The result given by 5.5.0.15 is :

Value of objective function: -765.00000000

Actual values of the variables:
COL0000                         0
MNF0000                         1
MIF0000                         0
COL0006                         1
MNF0001                         0
MIF0001                         1
COL0012                         1
MNF0002                         0
MIF0002                         1
GIF0005                         0
GNF0005                         1
ANF0001                         0




RE: 5.5.0.15 Solver Non-Optimal Solution

by William H. Patton :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

This is definitely a mystery. Lets hope Kjell weighs in.
Here is an lp format – a bit easier to paste.

/* MCPCSolverFile */
// *  zfirth sept 28 2009  soln should be   -790 (5.5.0.5) get -765
(5.5.0.15)
//  try swapping the equivalent 2 objective lines below
// definitely a mystery  also in 5.5.0.14
/* Objective function */

min:  -375 COL0006 -390 COL0012 -225 colzero;
//min:  -225 colzero -375 COL0006 -390 COL0012;

//max:  225 colzero 375 COL0006 390 COL0012;
//max:   375 COL0006 390 COL0012 225 colzero;

/* Constraints */
YEAR001: +1500 colzero +1500 COL0006 +1500 COL0012 <= 3700;
YEAR002: +1500 colzero +1500 COL0006 +1500 COL0012 <= 4500;
YEAR003: +1500 colzero +1500 COL0006 +1500 COL0012 <= 4500;
YEAR004: +1500 colzero +1500 COL0006 +1500 COL0012 <= 4500;
YEAR005: +1500 colzero +1500 COL0006 +1500 COL0012 <= 4500;
YEAR006: +1500 colzero +1500 COL0006 +1500 COL0012 <= 4500;
MCP0000: +colzero +MNF0000 = 1;
MCP0001: +0.4 <= +COL0006 +MNF0001 <= 1;
MCP0002: +COL0012 +MNF0002 = 1;
MCF0000: +MNF0000 +MIF0000 = 1;
MCF0001: +MNF0001 +MIF0001 = 1;
MCF0002: +MNF0002 +MIF0002 = 1;
GRP0005: +15 >= +MIF0000 +MIF0001 +11.5 GIF0005 +13.5 GNF0005 >= 13;
AUG0001: +17 >= +MIF0000 +MIF0001 +12.5 MIF0002 +GIF0005 +13 ANF0001 >= 13;

/* Variable bounds */
colzero <= 1.1;
//COL0006 <= 1;
COL0006 <= 1.9666667;
COL0012 <= 1.3;

//  integers
MNF0000 <= 1;
MIF0000 <= 1;
MNF0001 <= 1;
MIF0001 <= 1;
MNF0002 <= 1;
MIF0002 <= 1;
GIF0005 <= 1;
GNF0005 <= 1;
ANF0001 <= 1;

/* Integer definitions */
int MNF0000,MIF0000,MNF0001,MIF0001,MNF0002,MIF0002,GIF0005,GNF0005,ANF0001;

________________________________________
From: lp_solve@... [mailto:lp_solve@...] On Behalf
Of zfirth
Sent: Tuesday, September 22, 2009 2:20 PM
To: lp_solve@...
Subject: [lp_solve] 5.5.0.15 Solver Non-Optimal Solution

 
In 5.5.0.5 this mps file gave the optimal solution (using the default
settings). In the latest 5.5.0.15 version, the optimal solution is not found
(using the default settings). Could someone explain why?

(I have added the mps file and output from the programs below.)

This is the mps file :

NAME MCPCSolverFile
ROWS
N OBJ
L YEAR001
L YEAR002
L YEAR003
L YEAR004
L YEAR005
L YEAR006
L MCP0000
L MCP0001
L MCP0002
E MCF0000
E MCF0001
E MCF0002
G GRP0005
G AUG0001
COLUMNS
COL0000 OBJ -225
COL0000 YEAR001 1500
COL0000 YEAR002 1500
COL0000 YEAR003 1500
COL0000 YEAR004 1500
COL0000 YEAR005 1500
COL0000 YEAR006 1500
COL0000 MCP0000 1
MNF0000 MCP0000 1
MNF0000 MCF0000 1
MIF0000 MCF0000 1
MIF0000 GRP0005 1
MIF0000 AUG0001 1
COL0006 OBJ -375
COL0006 YEAR001 1500
COL0006 YEAR002 1500
COL0006 YEAR003 1500
COL0006 YEAR004 1500
COL0006 YEAR005 1500
COL0006 YEAR006 1500
COL0006 MCP0001 1
MNF0001 MCP0001 1
MNF0001 MCF0001 1
MIF0001 MCF0001 1
MIF0001 GRP0005 1
MIF0001 AUG0001 1
COL0012 OBJ -390
COL0012 YEAR001 1500
COL0012 YEAR002 1500
COL0012 YEAR003 1500
COL0012 YEAR004 1500
COL0012 YEAR005 1500
COL0012 YEAR006 1500
COL0012 MCP0002 1
MNF0002 MCP0002 1
MNF0002 MCF0002 1
MIF0002 MCF0002 1
MIF0002 AUG0001 12.5
GIF0005 GRP0005 11.5
GIF0005 AUG0001 1
GNF0005 GRP0005 13.5
ANF0001 AUG0001 13
RHS
RHS1 YEAR001 3700
RHS1 YEAR002 4500
RHS1 YEAR003 4500
RHS1 YEAR004 4500
RHS1 YEAR005 4500
RHS1 YEAR006 4500
RHS1 MCP0000 1
RHS1 MCP0001 1
RHS1 MCP0002 1
RHS1 MCF0000 1
RHS1 MCF0001 1
RHS1 MCF0002 1
RHS1 GRP0005 13
RHS1 AUG0001 13
BOUNDS
LO BND1 COL0000 0
UP BND1 COL0000 1
LI BND1 MIF0000 0
UI BND1 MIF0000 1
LI BND1 MNF0000 0
UI BND1 MNF0000 1
LO BND1 COL0006 0
UP BND1 COL0006 1
LI BND1 MIF0001 0
UI BND1 MIF0001 1
LI BND1 MNF0001 0
UI BND1 MNF0001 1
LO BND1 COL0012 0
UP BND1 COL0012 1
LI BND1 MIF0002 0
UI BND1 MIF0002 1
LI BND1 MNF0002 0
UI BND1 MNF0002 1
LI BND1 GIF0005 0
UI BND1 GIF0005 1
LI BND1 GNF0005 0
UI BND1 GNF0005 1
LI BND1 ANF0001 0
UI BND1 ANF0001 1
RANGES
BND2 MCP0000 0
BND2 MCP0001 0.6
BND2 MCP0002 0
BND2 GRP0005 2
BND2 AUG0001 4
ENDATA

The optimal solution should be (given by 5.5.0.5) :

Value of objective function: -790

Actual values of the variables:
COL0000 1
MNF0000 0
MIF0000 1
COL0006 0.466667
MNF0001 0
MIF0001 1
COL0012 1
MNF0002 0
MIF0002 1
GIF0005 1
GNF0005 0
ANF0001 0

The result given by 5.5.0.15 is :

Value of objective function: -765.00000000

Actual values of the variables:
COL0000 0
MNF0000 1
MIF0000 0
COL0006 1
MNF0001 0
MIF0001 1
COL0012 1
MNF0002 0
MIF0002 1
GIF0005 0
GNF0005 1
ANF0001 0



Re: 5.5.0.15 Solver Non-Optimal Solution

by peter_notebaert :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

The error is in routine MIP_stepOF in lp_lib.c

Kjell already solved this problem in his version 6 development version. From that code, I extracted following new routine for version 5.5:

REAL MIP_stepOF(lprec *lp)
/* This function tries to find a non-zero minimum improvement
   if the OF contains all integer variables (logic only applies if we are
   looking for a single solution, not possibly several equal-valued ones). */
{
  MYBOOL  OFgcd;
  int     colnr, rownr, n, ib, ie,
          pluscount, intcount;
  int     intval, maxndec;
  REAL    value = 0, valOF, divOF, valGCD;
  MATrec  *mat = lp->matA;

  if((lp->int_vars > 0) && (lp->solutionlimit == 1) && mat_validate(mat)) {

    /* Get statistics for integer OF variables and compute base stepsize */
    n = row_intstats(lp, 0, 0, &maxndec, &pluscount, &intcount, &intval, &valGCD, &divOF);
    if((n == 0) || (maxndec < 0))
      return( value );
    OFgcd = (MYBOOL) (intval > 0);
    if(OFgcd)
      value = valGCD;

    /* Check non-ints in the OF to see if we can get more info */
    if(n - intcount > 0) {
      int nrv = n - intcount; /* Number of real variables in the objective */
      int niv = 0;            /* Number of real variables identified as integer */
      int nrows = lp->rows;

      /* See if we have equality constraints */
      for(ib = 1; ib <= nrows; ib++) {
        if(is_constr_type(lp, ib, EQ))
          break;
      }

      /* If so, there may be a chance to find an improved stepsize */
      if(ib < nrows)
      for(colnr = 1; colnr <= lp->columns; colnr++) {

        /* Go directly to the next variable if this is an integer or
          there is no row candidate to explore for hidden bounds for
          real-valued variables (limit scan to one row/no recursion) */
        if((lp->orig_obj[colnr] == 0) || is_int(lp, colnr))
          continue;

        /* Scan equality constraints */
        ib = mat->col_end[colnr-1];
        ie = mat->col_end[colnr];
        while(ib < ie) {
          if(is_constr_type(lp, (rownr = COL_MAT_ROWNR(ib)), EQ)) {

            /* Get "child" row statistics, but break out if we don't
              find enough information, i.e. no integers with coefficients of proper type */
            n = row_intstats(lp, rownr, colnr, &maxndec, &pluscount, &intcount, &intval, &valGCD, &divOF);
            if((intval < n - 1) || (maxndec < 0)) {
              value = 0;
              break;
            }
            niv++;

            /* We can update */
            valOF = unscaled_mat(lp, lp->orig_obj[colnr], 0, colnr);
            valOF = fabs( valOF * (valGCD / divOF) );
            if(OFgcd) {
              SETMIN(value, valOF);
            }
            else {
              OFgcd = TRUE;
              value = valOF;
            }
          }
          ib++;
        }

        /* No point in continuing scan if we failed in current column */
        if(value == 0)
          break;
      }

      /* Check if we found information for any real-valued variable;
         if not, then we must set the improvement delta to 0 */
      if(nrv > niv)
        value = 0;
    }
  }
  return( value );
}

There is another small error in routine check_solution, but it does not affect the calcultated result. It is only a wrong relative gap that can be shown by this:

    report(lp, NORMAL, "%s solution  " RESULTVALUEMASK " after %10.0f iter, %9.0f nodes (gap %.1f%%).\n",
                       my_if(lp->bb_break && !bb_better(lp, OF_DUALLIMIT, OF_TEST_BE) && bb_better(lp, OF_RELAXED, OF_TEST_NE), "Subopt.", "Optimal"),
                       solution[0], (double) lp->total_iter, (double) lp->bb_totalnodes,
                       100.0*fabs(my_reldiff(lp->solution[0], lp->bb_limitOF)));

Must be:

    report(lp, NORMAL, "%s solution  " RESULTVALUEMASK " after %10.0f iter, %9.0f nodes (gap %.1f%%).\n",
                       my_if(lp->bb_break && !bb_better(lp, OF_DUALLIMIT, OF_TEST_BE) && bb_better(lp, OF_RELAXED, OF_TEST_NE), "Subopt.", "Optimal"),
                       solution[0], (double) lp->total_iter, (double) lp->bb_totalnodes,
                       100.0*fabs(my_reldiff(solution[0], lp->bb_limitOF)));


Peter



From: William H. Patton
Sent: Tuesday, September 29, 2009 06:23
To: lp_solve@...
Subject: RE: [lp_solve] 5.5.0.15 Solver Non-Optimal Solution


  This is definitely a mystery. Lets hope Kjell weighs in.
Here is an lp format - a bit easier to paste.

/* MCPCSolverFile */
// * zfirth sept 28 2009 soln should be -790 (5.5.0.5) get -765
(5.5.0.15)
// try swapping the equivalent 2 objective lines below
// definitely a mystery also in 5.5.0.14
/* Objective function */

min: -375 COL0006 -390 COL0012 -225 colzero;
//min: -225 colzero -375 COL0006 -390 COL0012;

//max: 225 colzero 375 COL0006 390 COL0012;
//max: 375 COL0006 390 COL0012 225 colzero;

/* Constraints */
YEAR001: +1500 colzero +1500 COL0006 +1500 COL0012 <= 3700;
YEAR002: +1500 colzero +1500 COL0006 +1500 COL0012 <= 4500;
YEAR003: +1500 colzero +1500 COL0006 +1500 COL0012 <= 4500;
YEAR004: +1500 colzero +1500 COL0006 +1500 COL0012 <= 4500;
YEAR005: +1500 colzero +1500 COL0006 +1500 COL0012 <= 4500;
YEAR006: +1500 colzero +1500 COL0006 +1500 COL0012 <= 4500;
MCP0000: +colzero +MNF0000 = 1;
MCP0001: +0.4 <= +COL0006 +MNF0001 <= 1;
MCP0002: +COL0012 +MNF0002 = 1;
MCF0000: +MNF0000 +MIF0000 = 1;
MCF0001: +MNF0001 +MIF0001 = 1;
MCF0002: +MNF0002 +MIF0002 = 1;
GRP0005: +15 >= +MIF0000 +MIF0001 +11.5 GIF0005 +13.5 GNF0005 >= 13;
AUG0001: +17 >= +MIF0000 +MIF0001 +12.5 MIF0002 +GIF0005 +13 ANF0001 >= 13;

/* Variable bounds */
colzero <= 1.1;
//COL0006 <= 1;
COL0006 <= 1.9666667;
COL0012 <= 1.3;

// integers
MNF0000 <= 1;
MIF0000 <= 1;
MNF0001 <= 1;
MIF0001 <= 1;
MNF0002 <= 1;
MIF0002 <= 1;
GIF0005 <= 1;
GNF0005 <= 1;
ANF0001 <= 1;

/* Integer definitions */
int MNF0000,MIF0000,MNF0001,MIF0001,MNF0002,MIF0002,GIF0005,GNF0005,ANF0001;

________________________________________
From: lp_solve@... [mailto:lp_solve@...] On Behalf
Of zfirth
Sent: Tuesday, September 22, 2009 2:20 PM
To: lp_solve@...
Subject: [lp_solve] 5.5.0.15 Solver Non-Optimal Solution

 
In 5.5.0.5 this mps file gave the optimal solution (using the default
settings). In the latest 5.5.0.15 version, the optimal solution is not found
(using the default settings). Could someone explain why?

(I have added the mps file and output from the programs below.)

This is the mps file :

NAME MCPCSolverFile
ROWS
N OBJ
L YEAR001
L YEAR002
L YEAR003
L YEAR004
L YEAR005
L YEAR006
L MCP0000
L MCP0001
L MCP0002
E MCF0000
E MCF0001
E MCF0002
G GRP0005
G AUG0001
COLUMNS
COL0000 OBJ -225
COL0000 YEAR001 1500
COL0000 YEAR002 1500
COL0000 YEAR003 1500
COL0000 YEAR004 1500
COL0000 YEAR005 1500
COL0000 YEAR006 1500
COL0000 MCP0000 1
MNF0000 MCP0000 1
MNF0000 MCF0000 1
MIF0000 MCF0000 1
MIF0000 GRP0005 1
MIF0000 AUG0001 1
COL0006 OBJ -375
COL0006 YEAR001 1500
COL0006 YEAR002 1500
COL0006 YEAR003 1500
COL0006 YEAR004 1500
COL0006 YEAR005 1500
COL0006 YEAR006 1500
COL0006 MCP0001 1
MNF0001 MCP0001 1
MNF0001 MCF0001 1
MIF0001 MCF0001 1
MIF0001 GRP0005 1
MIF0001 AUG0001 1
COL0012 OBJ -390
COL0012 YEAR001 1500
COL0012 YEAR002 1500
COL0012 YEAR003 1500
COL0012 YEAR004 1500
COL0012 YEAR005 1500
COL0012 YEAR006 1500
COL0012 MCP0002 1
MNF0002 MCP0002 1
MNF0002 MCF0002 1
MIF0002 MCF0002 1
MIF0002 AUG0001 12.5
GIF0005 GRP0005 11.5
GIF0005 AUG0001 1
GNF0005 GRP0005 13.5
ANF0001 AUG0001 13
RHS
RHS1 YEAR001 3700
RHS1 YEAR002 4500
RHS1 YEAR003 4500
RHS1 YEAR004 4500
RHS1 YEAR005 4500
RHS1 YEAR006 4500
RHS1 MCP0000 1
RHS1 MCP0001 1
RHS1 MCP0002 1
RHS1 MCF0000 1
RHS1 MCF0001 1
RHS1 MCF0002 1
RHS1 GRP0005 13
RHS1 AUG0001 13
BOUNDS
LO BND1 COL0000 0
UP BND1 COL0000 1
LI BND1 MIF0000 0
UI BND1 MIF0000 1
LI BND1 MNF0000 0
UI BND1 MNF0000 1
LO BND1 COL0006 0
UP BND1 COL0006 1
LI BND1 MIF0001 0
UI BND1 MIF0001 1
LI BND1 MNF0001 0
UI BND1 MNF0001 1
LO BND1 COL0012 0
UP BND1 COL0012 1
LI BND1 MIF0002 0
UI BND1 MIF0002 1
LI BND1 MNF0002 0
UI BND1 MNF0002 1
LI BND1 GIF0005 0
UI BND1 GIF0005 1
LI BND1 GNF0005 0
UI BND1 GNF0005 1
LI BND1 ANF0001 0
UI BND1 ANF0001 1
RANGES
BND2 MCP0000 0
BND2 MCP0001 0.6
BND2 MCP0002 0
BND2 GRP0005 2
BND2 AUG0001 4
ENDATA

The optimal solution should be (given by 5.5.0.5) :

Value of objective function: -790

Actual values of the variables:
COL0000 1
MNF0000 0
MIF0000 1
COL0006 0.466667
MNF0001 0
MIF0001 1
COL0012 1
MNF0002 0
MIF0002 1
GIF0005 1
GNF0005 0
ANF0001 0

The result given by 5.5.0.15 is :

Value of objective function: -765.00000000

Actual values of the variables:
COL0000 0
MNF0000 1
MIF0000 0
COL0006 1
MNF0001 0
MIF0001 1
COL0012 1
MNF0002 0
MIF0002 1
GIF0005 0
GNF0005 1
ANF0001 0




RE: 5.5.0.15 Solver Non-Optimal Solution

by William H. Patton :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

This code revision also fixes the similar difficulty in thread

http://tech.groups.yahoo.com/group/lp_solve/message/12156

 

William

  _____  

From: lp_solve@... [mailto:lp_solve@...] On Behalf
Of Peter Notebaert
Sent: Monday, October 12, 2009 6:06 AM
To: lp_solve@...
Subject: Re: [lp_solve] 5.5.0.15 Solver Non-Optimal Solution

 

 

The error is in routine MIP_stepOF in lp_lib.c

 

Kjell already solved this problem in his version 6 development version. From
that code, I extracted following new routine for version 5.5:

 

REAL MIP_stepOF(lprec *lp)
/* This function tries to find a non-zero minimum improvement
   if the OF contains all integer variables (logic only applies if we are
   looking for a single solution, not possibly several equal-valued ones).
*/
{
  MYBOOL  OFgcd;
  int     colnr, rownr, n, ib, ie,
          pluscount, intcount;
  int     intval, maxndec;
  REAL    value = 0, valOF, divOF, valGCD;
  MATrec  *mat = lp->matA;

 

  if((lp->int_vars > 0) && (lp->solutionlimit == 1) && mat_validate(mat)) {

 

    /* Get statistics for integer OF variables and compute base stepsize */
    n = row_intstats(lp, 0, 0, &maxndec, &pluscount, &intcount, &intval,
&valGCD, &divOF);
    if((n == 0) || (maxndec < 0))
      return( value );
    OFgcd = (MYBOOL) (intval > 0);
    if(OFgcd)
      value = valGCD;

 

    /* Check non-ints in the OF to see if we can get more info */
    if(n - intcount > 0) {
      int nrv = n - intcount; /* Number of real variables in the objective
*/
      int niv = 0;            /* Number of real variables identified as
integer */
      int nrows = lp->rows;

 

      /* See if we have equality constraints */
      for(ib = 1; ib <= nrows; ib++) {
        if(is_constr_type(lp, ib, EQ))
          break;
      }

 

      /* If so, there may be a chance to find an improved stepsize */
      if(ib < nrows)
      for(colnr = 1; colnr <= lp->columns; colnr++) {

 

        /* Go directly to the next variable if this is an integer or
          there is no row candidate to explore for hidden bounds for
          real-valued variables (limit scan to one row/no recursion) */
        if((lp->orig_obj[colnr] == 0) || is_int(lp, colnr))
          continue;

 

        /* Scan equality constraints */
        ib = mat->col_end[colnr-1];
        ie = mat->col_end[colnr];
        while(ib < ie) {
          if(is_constr_type(lp, (rownr = COL_MAT_ROWNR(ib)), EQ)) {

 

            /* Get "child" row statistics, but break out if we don't
              find enough information, i.e. no integers with coefficients of
proper type */
            n = row_intstats(lp, rownr, colnr, &maxndec, &pluscount,
&intcount, &intval, &valGCD, &divOF);
            if((intval < n - 1) || (maxndec < 0)) {
              value = 0;
              break;
            }
            niv++;

 

            /* We can update */
            valOF = unscaled_mat(lp, lp->orig_obj[colnr], 0, colnr);
            valOF = fabs( valOF * (valGCD / divOF) );
            if(OFgcd) {
              SETMIN(value, valOF);
            }
            else {
              OFgcd = TRUE;
              value = valOF;
            }
          }
          ib++;
        }

 

        /* No point in continuing scan if we failed in current column */
        if(value == 0)
          break;
      }

 

      /* Check if we found information for any real-valued variable;
         if not, then we must set the improvement delta to 0 */
      if(nrv > niv)
        value = 0;
    }
  }
  return( value );
}

There is another small error in routine check_solution, but it does not
affect the calcultated result. It is only a wrong relative gap that can be
shown by this:

 

    report(lp, NORMAL, "%s solution  " RESULTVALUEMASK " after %10.0f iter,
%9.0f nodes (gap %.1f%%).\n",
                       my_if(lp->bb_break && !bb_better(lp, OF_DUALLIMIT,
OF_TEST_BE) && bb_better(lp, OF_RELAXED, OF_TEST_NE), "Subopt.", "Optimal"),
                       solution[0], (double) lp->total_iter, (double)
lp->bb_totalnodes,
                       100.0*fabs(my_reldiff(lp->solution[0],
lp->bb_limitOF)));

Must be:

 

    report(lp, NORMAL, "%s solution  " RESULTVALUEMASK " after %10.0f iter,
%9.0f nodes (gap %.1f%%).\n",
                       my_if(lp->bb_break && !bb_better(lp, OF_DUALLIMIT,
OF_TEST_BE) && bb_better(lp, OF_RELAXED, OF_TEST_NE), "Subopt.", "Optimal"),
                       solution[0], (double) lp->total_iter, (double)
lp->bb_totalnodes,
                       100.0*fabs(my_reldiff(solution[0], lp->bb_limitOF)));

 

Peter

 

From: William H. Patton <mailto:pattonwh@...>  

Sent: Tuesday, September 29, 2009 06:23

To: lp_solve@yahoogroup <mailto:lp_solve@...> s.com

Subject: RE: [lp_solve] 5.5.0.15 Solver Non-Optimal Solution

 

 

This is definitely a mystery. Lets hope Kjell weighs in.
Here is an lp format - a bit easier to paste.

/* MCPCSolverFile */
// * zfirth sept 28 2009 soln should be -790 (5.5.0.5) get -765
(5.5.0.15)
// try swapping the equivalent 2 objective lines below
// definitely a mystery also in 5.5.0.14
/* Objective function */

min: -375 COL0006 -390 COL0012 -225 colzero;
//min: -225 colzero -375 COL0006 -390 COL0012;

//max: 225 colzero 375 COL0006 390 COL0012;
//max: 375 COL0006 390 COL0012 225 colzero;

/* Constraints */
YEAR001: +1500 colzero +1500 COL0006 +1500 COL0012 <= 3700;
YEAR002: +1500 colzero +1500 COL0006 +1500 COL0012 <= 4500;
YEAR003: +1500 colzero +1500 COL0006 +1500 COL0012 <= 4500;
YEAR004: +1500 colzero +1500 COL0006 +1500 COL0012 <= 4500;
YEAR005: +1500 colzero +1500 COL0006 +1500 COL0012 <= 4500;
YEAR006: +1500 colzero +1500 COL0006 +1500 COL0012 <= 4500;
MCP0000: +colzero +MNF0000 = 1;
MCP0001: +0.4 <= +COL0006 +MNF0001 <= 1;
MCP0002: +COL0012 +MNF0002 = 1;
MCF0000: +MNF0000 +MIF0000 = 1;
MCF0001: +MNF0001 +MIF0001 = 1;
MCF0002: +MNF0002 +MIF0002 = 1;
GRP0005: +15 >= +MIF0000 +MIF0001 +11.5 GIF0005 +13.5 GNF0005 >= 13;
AUG0001: +17 >= +MIF0000 +MIF0001 +12.5 MIF0002 +GIF0005 +13 ANF0001 >= 13;

/* Variable bounds */
colzero <= 1.1;
//COL0006 <= 1;
COL0006 <= 1.9666667;
COL0012 <= 1.3;

// integers
MNF0000 <= 1;
MIF0000 <= 1;
MNF0001 <= 1;
MIF0001 <= 1;
MNF0002 <= 1;
MIF0002 <= 1;
GIF0005 <= 1;
GNF0005 <= 1;
ANF0001 <= 1;

/* Integer definitions */
int MNF0000,MIF0000,MNF0001,MIF0001,MNF0002,MIF0002,GIF0005,GNF0005,ANF0001;

________________________________________
From: lp_solve@yahoogroup <mailto:lp_solve%40yahoogroups.com> s.com
[mailto:lp_solve@yahoogroup <mailto:lp_solve%40yahoogroups.com> s.com] On
Behalf
Of zfirth
Sent: Tuesday, September 22, 2009 2:20 PM
To: lp_solve@yahoogroup <mailto:lp_solve%40yahoogroups.com> s.com
Subject: [lp_solve] 5.5.0.15 Solver Non-Optimal Solution

 
In 5.5.0.5 this mps file gave the optimal solution (using the default
settings). In the latest 5.5.0.15 version, the optimal solution is not found
(using the default settings). Could someone explain why?

(I have added the mps file and output from the programs below.)

This is the mps file :

NAME MCPCSolverFile
ROWS
N OBJ
L YEAR001
L YEAR002
L YEAR003
L YEAR004
L YEAR005
L YEAR006
L MCP0000
L MCP0001
L MCP0002
E MCF0000
E MCF0001
E MCF0002
G GRP0005
G AUG0001
COLUMNS
COL0000 OBJ -225
COL0000 YEAR001 1500
COL0000 YEAR002 1500
COL0000 YEAR003 1500
COL0000 YEAR004 1500
COL0000 YEAR005 1500
COL0000 YEAR006 1500
COL0000 MCP0000 1
MNF0000 MCP0000 1
MNF0000 MCF0000 1
MIF0000 MCF0000 1
MIF0000 GRP0005 1
MIF0000 AUG0001 1
COL0006 OBJ -375
COL0006 YEAR001 1500
COL0006 YEAR002 1500
COL0006 YEAR003 1500
COL0006 YEAR004 1500
COL0006 YEAR005 1500
COL0006 YEAR006 1500
COL0006 MCP0001 1
MNF0001 MCP0001 1
MNF0001 MCF0001 1
MIF0001 MCF0001 1
MIF0001 GRP0005 1
MIF0001 AUG0001 1
COL0012 OBJ -390
COL0012 YEAR001 1500
COL0012 YEAR002 1500
COL0012 YEAR003 1500
COL0012 YEAR004 1500
COL0012 YEAR005 1500
COL0012 YEAR006 1500
COL0012 MCP0002 1
MNF0002 MCP0002 1
MNF0002 MCF0002 1
MIF0002 MCF0002 1
MIF0002 AUG0001 12.5
GIF0005 GRP0005 11.5
GIF0005 AUG0001 1
GNF0005 GRP0005 13.5
ANF0001 AUG0001 13
RHS
RHS1 YEAR001 3700
RHS1 YEAR002 4500
RHS1 YEAR003 4500
RHS1 YEAR004 4500
RHS1 YEAR005 4500
RHS1 YEAR006 4500
RHS1 MCP0000 1
RHS1 MCP0001 1
RHS1 MCP0002 1
RHS1 MCF0000 1
RHS1 MCF0001 1
RHS1 MCF0002 1
RHS1 GRP0005 13
RHS1 AUG0001 13
BOUNDS
LO BND1 COL0000 0
UP BND1 COL0000 1
LI BND1 MIF0000 0
UI BND1 MIF0000 1
LI BND1 MNF0000 0
UI BND1 MNF0000 1
LO BND1 COL0006 0
UP BND1 COL0006 1
LI BND1 MIF0001 0
UI BND1 MIF0001 1
LI BND1 MNF0001 0
UI BND1 MNF0001 1
LO BND1 COL0012 0
UP BND1 COL0012 1
LI BND1 MIF0002 0
UI BND1 MIF0002 1
LI BND1 MNF0002 0
UI BND1 MNF0002 1
LI BND1 GIF0005 0
UI BND1 GIF0005 1
LI BND1 GNF0005 0
UI BND1 GNF0005 1
LI BND1 ANF0001 0
UI BND1 ANF0001 1
RANGES
BND2 MCP0000 0
BND2 MCP0001 0.6
BND2 MCP0002 0
BND2 GRP0005 2
BND2 AUG0001 4
ENDATA

The optimal solution should be (given by 5.5.0.5) :

Value of objective function: -790

Actual values of the variables:
COL0000 1
MNF0000 0
MIF0000 1
COL0006 0.466667
MNF0001 0
MIF0001 1
COL0012 1
MNF0002 0
MIF0002 1
GIF0005 1
GNF0005 0
ANF0001 0

The result given by 5.5.0.15 is :

Value of objective function: -765.00000000

Actual values of the variables:
COL0000 0
MNF0000 1
MIF0000 0
COL0006 1
MNF0001 0
MIF0001 1
COL0012 1
MNF0002 0
MIF0002 1
GIF0005 0
GNF0005 1
ANF0001 0