help-glpk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: One-off error in the MIP solver?


From: Antti Lehtila
Subject: Re: One-off error in the MIP solver?
Date: Mon, 24 Jan 2022 20:26:24 +0200
User-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.10.0

Hi Hartmut,

Please find below my attempt to explain what's happening there.
I think the integrality tolerance is  parm->tol_int = 1e-5;  (hard-coded), at least it was so a few years ago.
And indeed, the solution for the LP relaxation already happens to satisfy the tolerances.  The LP solution is as follows:
------------------------
   No.   Row name   St   Activity     Lower bound   Upper bound    Marginal
------ ------------ -- ------------- ------------- ------------- -------------
     1 slack        B              0                            
     2 cs1          NU        131072                      131072         < eps
     3 cs2          B         131072        131072              

   No. Column name  St   Activity     Lower bound   Upper bound    Marginal
------ ------------ -- ------------- ------------- ------------- -------------
     1 x[1]         NU             1             0             1         < eps
     2 x[2]         NU             1             0             1         < eps
     3 x[3]         NU             1             0             1         < eps
     4 x[4]         NU             1             0             1         < eps
     5 x[5]         NU             1             0             1         < eps
     6 x[6]         NU             1             0             1         < eps
     7 x[7]         NU             1             0             1         < eps
     8 x[8]         NU             1             0             1         < eps
     9 x[9]         NU             1             0             1         < eps
    10 x[10]        NU             1             0             1         < eps
    11 x[11]        NU             1             0             1         < eps
    12 x[12]        NU             1             0             1         < eps
    13 x[13]        NU             1             0             1         < eps
    14 x[14]        NU             1             0             1         < eps
    15 x[15]        NU             1             0             1         < eps
    16 x[16]        NU             1             0             1         < eps
    17 x[17]        NU             1             0             1         < eps
    18 x[18]        B    7.62939e-06             0             1
    19 x[19]        NL             0             0             1         < eps
    20 x[20]        NL             0             0             1         < eps
    21 e            NL             0             0                           1
------------------------
As you can see, the variable x[18] is basic at the value of 7.63e-6, which nicely satisfies the integrality tolerance. The Karush-Kuhn-Tucker conditions also all have high quality in the LP relaxation solution. So, it appears that when entering the MIP algorithm, this initial LP solution is immediately accepted as the optimal MIP solution.  But then, it seems that Glpk rounds off the levels of the binary variables, and as a result, in the final solution x[18] has zero value and the second constraint is actually shown violated.  Indeed, the MIP solution is listed showing the constraint violation and low quality for KKT.PB, as follows:

   No.   Row name        Activity     Lower bound   Upper bound
------ ------------    ------------- ------------- -------------
     1 slack                       0                            
     2 cs1                    131071                      131072
     3 cs2                    131071        131072              

   No. Column name       Activity     Lower bound   Upper bound
------ ------------    ------------- ------------- -------------
     1 x[1]         *              1             0             1
     2 x[2]         *              1             0             1
     3 x[3]         *              1             0             1
     4 x[4]         *              1             0             1
     5 x[5]         *              1             0             1
     6 x[6]         *              1             0             1
     7 x[7]         *              1             0             1
     8 x[8]         *              1             0             1
     9 x[9]         *              1             0             1
    10 x[10]        *              1             0             1
    11 x[11]        *              1             0             1
    12 x[12]        *              1             0             1
    13 x[13]        *              1             0             1
    14 x[14]        *              1             0             1
    15 x[15]        *              1             0             1
    16 x[16]        *              1             0             1
    17 x[17]        *              1             0             1
    18 x[18]        *              0             0             1
    19 x[19]        *              0             0             1
    20 x[20]        *              0             0             1
    21 e                           0             0              

Integer feasibility conditions:

KKT.PE: max.abs.err = 0.00e+00 on row 0
        max.rel.err = 0.00e+00 on row 0
        High quality

KKT.PB: max.abs.err = 1.00e+00 on row 3
        max.rel.err = 7.63e-06 on row 3
        Low quality



On 24.01.2022 11:46, Hartmut Henkel wrote:
Hi,

here seems to be some one-off error in gmpl/glpk (5.0, debian Linux):

param v := 131072;
param n := 20; # number of bits
set J  := 1..n; # set of all bits
var x{j in J}, binary;
var e, >= 0;
minimize slack: e;

s.t. cs1: sum{j in J} (2**(j - 1) * x[j]) - v <=  e;
s.t. cs2: sum{j in J} (2**(j - 1) * x[j]) - v >= -e;

solve;

printf "v: %d\nv: ", v;
for {j in J} printf "%d", x[n - j + 1];
printf "\n";
printf "v: %d\n", sum{j in J} (2**(j - 1) * x[j]);
printf "e: %d\n", e;

end;

Here it prints:

v: 131072
v: 0011111111111111111
v: 131071
e: 0

With v = 131071 or v = 131073 or v = 65536 it works fine. Also fine with
larger numbers like v = 888888. Same problem when solving the exported
.lp file, which looks ok., confirmed by another solver. Seems not to be
a general int limitation or printing issue. Do you have any idea what's
happening here?

Best Regards, Hartmut

.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]