为什么我在Ilog Cplex生成的LP文件中的目标函数包含系数等于0的变量?

时间:2016-07-21 18:32:48

标签: cplex

我正在使用Ilog Cplex来解决我的问题。我还用它打印出我的问题的LP文件,以便稍后用不同的参数再次解决它。

解决时,我想在目标函数中打印出每个变量的值。问题是,目标函数包含系数等于0的变量。因此,并非目标函数中的所有变量都与我相关。

我想知道:

  1. 为什么Cplex在目标函数中添加具有空系数的变量?
  2. 我可以以某种方式删除它们吗?
  3. 如果我找到一种方法从部分名称打印变量的值,那也会回答我的问题,因为我知道所有相关变量名称的一部分。例如,我想打印名称中包含“global”的所有变量的值。虽然,我认为我不能用Cplex Interactive Optimizer做到这一点。

1 个答案:

答案 0 :(得分:2)

在写入LP格式时,CPLEX在目标中包括所有变量的原因有很多(甚至那些系数为零的原因)。一个原因是,当读取LP文件时,某些类型的约束要求在使用变量之前先“存在”变量(请注意,这是传统的实现细节,不一定是硬要求)。

例如,考虑以下玩具LP:

Minimize                                                                        
obj: x1 + x2                                                                    
Subject to                                                                      
c1: x1 + x2 <= 10                                                               
SOS                                                                             
s1: s1:: x1:1 x2:2 x3:3                                                         
End

如果我们尝试通过互动阅读,则会得到:

CPLEX> Warning, line 6: Name 'x3' does not exist.
CPLEX Error  1616: Line 6: Expected identifier, found ':'.
No file read.

如果我们改为在目标中加入x3,就像这样:

Minimize                                                                        
obj: x1 + x2 + 0 x3                                                             
Subject to                                                                      
c1: x1 + x2 <= 10                                                               
SOS                                                                             
s1: s1:: x1:1 x2:2 x3:3                                                         
End

然后,CPLEX将很乐意接受该问题。

CPLEX这样做的另一个可能更令人信服的原因是,有时在程序构建模型时,会创建临时或伪变量。这些对于实际模型可能重要,也可能不重要。为了将尽可能接近程序内置内存的内容写入LP文件,有时会将无用或无害的内容写入LP文件。例如,如果创建了一个变量但从未使用过,则它至少在LP文件中显示为目标文件中系数为零的变量。这样可以重现用户在技术支持情况下观察到的某些行为。

LP格式有很多怪癖。您可以阅读关于它们的here