bug-glpk
[Top][All Lists]
Advanced

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

Re: [Fwd: Bug in glpk integer programmer]


From: Heinrich Schuchardt
Subject: Re: [Fwd: Bug in glpk integer programmer]
Date: Thu, 15 Oct 2020 16:29:15 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.12.0

On 15.10.20 16:03, Andrew Makhorin wrote:
> -------- Forwarded Message --------
> From: s meagher <sjmeagher@gmail.com>
> To: bug-glpk@gnu.org
> Subject: Bug in glpk integer programmer
> Date: Fri, 16 Oct 2020 00:19:14 +1100
>
>> Hi
>>
>> The following code demonstrates a possible bug in glpk. I fully
>> appreciate that in fact the bug may be that I do understand glpk
>> properly and have not configured it correctly. If this is the case,
>> please accept my apologies for taking up your time.
>>
>> Kind regards
>>
>> Steve Meagher
>>
>> /*   Possible integer programming bug in glpk v4.65
>>
>>      (c) Stephen Meagher 2020
>>
>>      The following code was written to demonstrate a bug I believed I
>> found for integer programming in glpk. Instead, I seem to have

You did not define any variable as integer.

>> discovered a different issue - which may be just because I'm using
>> glpk incorrectly.
>>
>>      The following integer programme
>>
>>              objective function: f(x_1,x_2) = 0
>>              row 1                           x_1 + x_2 = 3
>>              row 2                   0<=     x_1 - x_2 <= 2
>>
>> clearly has feasible solution x1 = 2, x2 = 1, but if I set it up as
>>
>>              objective function: f(x_1,x_2) = 0
>>              row 1                           x_1 + x_2 = 3
>>              row 2                   0<=     x_1 - x_2 <=
>> 2*(1.05)
>>
>> then glpk tells me the solution is x1 = 2.55 and x2 = 0.45, which is
>> wrong for two reasons. (Note, even if I set it up with 2 instead of
>> 2*(1.05), glpk gives the wrong answer when configured as follows).
>>
>>      I have compiled this programme on a MacBook Pro running macOS
>> Catalina 10.15.6 using the command: 
>>
>>      gcc -std=c18 glpkipbug.c -lglpk
>>
>>      I have the gnu big num library installed and use it to configure
>> glpk when I installed it.
>>
>>      Here is the fulloutput:
>>
>>      GLPK Simplex Optimizer, v4.65
>> 2 rows, 2 columns, 4 non-zeros
>>       0: obj =   0.000000000e+00 inf =   3.000e+00 (1)
>>       2: obj =   0.000000000e+00 inf =   0.000e+00 (0)
>> OPTIMAL LP SOLUTION FOUND
>> GLPK Integer Optimizer, v4.65
>> 2 rows, 2 columns, 4 non-zeros
>> 2 integer variables, none of which are binary
>> Preprocessing...
>> 2 rows, 2 columns, 4 non-zeros
>> 2 integer variables, none of which are binary
>> Scaling...
>>  A: min|aij| =  1.000e+00  max|aij| =  1.000e+00  ratio =  1.000e+00
>> Problem data seem to be well scaled
>> Constructing initial basis...
>> Size of triangular part is 2
>> Solving LP relaxation...
>> GLPK Simplex Optimizer, v4.65
>> 2 rows, 2 columns, 4 non-zeros
>>       2: obj =   0.000000000e+00 inf =   3.000e+00 (1)
>>       3: obj =   0.000000000e+00 inf =   0.000e+00 (0)
>> OPTIMAL LP SOLUTION FOUND
>> Integer optimization begins...
>> Long-step dual simplex will be used
>> +     3: mip =     not found yet >=              -inf        (1; 0)
>> +     4: >>>>>   0.000000000e+00 >=   0.000000000e+00   0.0% (1; 0)
>> +     4: mip =   0.000000000e+00 >=     tree is empty   0.0% (0; 1)
>> INTEGER OPTIMAL SOLUTION FOUND
>> Intopt success
>> Solution as x1 = 2.550000, x2 = 0.450000
>>
>>
>> (If you're still reading: The original bug occurred when I set certain
>> row bounds to be inequalities. Then the rows which were equalities
>> were no longer satisfied. However, this bug disappeared if I set the
>> bounds to be integers instead of real numbers. Furthermore, I wrote
>> that programme in C++ and not C.)
>>
>> */
>>
>>
>> #include <glpk.h>
>> #include <stdio.h>
>>
>> /* Defines and demontrates the bug */
>> void bug() {
>>      glp_prob *lp;
>>      glp_iocp parm;
>>      int ia[5];
>>      int ja[5];
>>      double arr[5];
>>      lp = glp_create_prob();
>>      glp_set_obj_dir(lp,GLP_MIN);
>>      glp_init_iocp(&parm);
>>      parm.presolve = GLP_ON;
>>      glp_add_rows(lp,2);
>>      glp_set_row_name(lp,1,"r1");
>>      glp_set_row_bnds(lp,1,GLP_FX,3.0,3.0);
>>      glp_set_row_name(lp,2,"r2");
>>
>>      glp_set_row_bnds(lp,2,GLP_DB, 0,2*(1.05));      // non-integer
>> bounds
>>
>>      glp_add_cols(lp,2);
>>      glp_set_col_name(lp,1,"x1");
>>      glp_set_obj_coef(lp,1,0.0);
>>      glp_set_col_bnds(lp,1,GLP_LO,0.0,0.0);
>>      glp_set_col_kind(lp,1,GLP_IV);
>>      glp_set_col_name(lp,2,"x2");
>>      glp_set_obj_coef(lp,2,0.0);
>>      glp_set_col_bnds(lp,2,GLP_LO,0.0,0.0);
>>      glp_set_col_kind(lp,2,GLP_IV);
>>      ia[1] = 1; ja[1] = 1; arr[1] = 1; ia[2] = 1; ja[2] = 2; arr[2] =
>> 1;
>>      ia[3] = 2; ja[3] = 1; arr[3] = 1; ia[4] = 2; ja[4] = 2; arr[4] =
>> -1;
>>      glp_load_matrix(lp,4,ia,ja,arr);
>>      glp_simplex(lp,NULL);
>>      if (glp_intopt(lp, &parm) != 0) {
>>              printf("Intopt error\n");
>>      } else {
>>              printf("Intopt success\n");
>>      }
>>      double x1 = glp_get_col_prim(lp,1);
>>      double x2 = glp_get_col_prim(lp,2);

You should use glp_mip_col_val() here to get

x1 = 2.000000, x2 = 1.000000

Best regards

Heinrich

>>      printf("Solution as x1 = %lf, x2 = %lf\n",x1,x2);
>>      glp_delete_prob(lp);
>> }
>>
>> int main() {
>>      bug();
>>      return 0;
>> }
>>
>>
>>
>




reply via email to

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