使用GLPK读取带二进制变量的LP文件

时间:2013-02-25 12:15:41

标签: java optimization solver

我正在尝试将一个非常简单的LP文件读入GLPK。这个LP文件有4个变量,其中2个是二进制的,看起来GLPK读取这两个二进制变量(HACE_MESAS,HACE_SILLAS)。它记录:

  

警告:变量HACE_MESAS的下限已重新定义警告:upper   变量HACE_MESAS的绑定重新定义了警告:下限   变量HACE_SILLAS重新定义警告:变量的上限   HACE_SILLAS重新定义

并且它解决得很糟糕,因为将实际值放到这两个变量中:

HACE_MESAS = 0.01
HACE_SILLAS = 0.02

LP文件是这样的:

Maximize
 obj: 5 MESAS + 3 SILLAS
Subject To
 IloC0: MESAS + 2 SILLAS >= 0
 IloC1: MESAS + 2 SILLAS <= 50
 IloC2: 2 MESAS + SILLAS >= 0
 IloC3: 2 MESAS + SILLAS <= 40
 IloC4: MESAS - 1000 HACE_MESAS <= 0
 IloC5: SILLAS - 1000 HACE_SILLAS <= 0
 IloC6: HACE_MESAS + HACE_SILLAS <= 1
Bounds
      MESAS >= 0
      SILLAS >= 0
 0 <= HACE_MESAS <= 1
 0 <= HACE_SILLAS <= 1
Binaries
 HACE_MESAS  HACE_SILLAS 
Generals
 MESAS  SILLAS 
End

谁能告诉我我做得不好?感谢。

1 个答案:

答案 0 :(得分:0)

只需删除多余的边界(它们是不必要的,但是因为你看起来有麻烦)

 0 <= HACE_MESAS <= 1
 0 <= HACE_SILLAS <= 1

也就是说,我运行这个模型:

Maximize
 obj: 5 MESAS + 3 SILLAS
Subject To
 IloC0: MESAS + 2 SILLAS >= 0
 IloC1: MESAS + 2 SILLAS <= 50
 IloC2: 2 MESAS + SILLAS >= 0
 IloC3: 2 MESAS + SILLAS <= 40
 IloC4: MESAS - 1000 HACE_MESAS <= 0
 IloC5: SILLAS - 1000 HACE_SILLAS <= 0
 IloC6: HACE_MESAS + HACE_SILLAS <= 1
Bounds
      MESAS >= 0
      SILLAS >= 0
Binaries
 HACE_MESAS  HACE_SILLAS 
Generals
 MESAS  SILLAS 
End

一切都按预期工作:

Problem:    
Rows:       7
Columns:    4 (4 integer, 2 binary)
Non-zeros:  14
Status:     INTEGER OPTIMAL
Objective:  obj = 100 (MAXimum)

   No.   Row name        Activity     Lower bound   Upper bound
------ ------------    ------------- ------------- -------------
     1 IloC0                      20             0               
     2 IloC1                      20                          50 
     3 IloC2                      40             0               
     4 IloC3                      40                          40 
     5 IloC4                    -980                           0 
     6 IloC5                       0                           0 
     7 IloC6                       1                           1 

   No. Column name       Activity     Lower bound   Upper bound
------ ------------    ------------- ------------- -------------
     1 MESAS        *             20             0               
     2 SILLAS       *              0             0               
     3 HACE_MESAS   *              1             0             1 
     4 HACE_SILLAS  *              0             0             1 

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 = 0.00e+00 on row 0
        max.rel.err = 0.00e+00 on row 0
        High quality

End of output