我正在使用Ilog Cplex来解决我的问题。我还用它打印出我的问题的LP文件,以便稍后用不同的参数再次解决它。
解决时,我想在目标函数中打印出每个变量的值。问题是,目标函数包含系数等于0的变量。因此,并非目标函数中的所有变量都与我相关。
我想知道:
如果我找到一种方法从部分名称打印变量的值,那也会回答我的问题,因为我知道所有相关变量名称的一部分。例如,我想打印名称中包含“global”的所有变量的值。虽然,我认为我不能用Cplex Interactive Optimizer做到这一点。
答案 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。