如何区分负变量和正变量?

时间:2019-05-08 23:03:56

标签: optimization linear-programming ampl glpk

让我有一个变量UT [i,j,k,r],其定义为其他2个变量的和。

const routes: Routes = [
 {
  path: 'home',
  component: HomeComponent,
 },
];

现在,我只想为正UT [i,j,k,r]写一些约束!我能做什么?

我尝试了很多方法:我定义了一个二进制变量,如果UT为正,则为1,否则为0,但这并不能解决我的问题,因为将它们相乘很复杂。有什么方法可以存储UT为正的索引?

2 个答案:

答案 0 :(得分:2)

假设BT[i,j,k,r]是您的二进制变量。然后,如果您使用CPLEX,Gurobi或Xpress作为您的求解器,则可以编写这样的“指标约束”:

  

BT[i,j,k,r] = 1 ==> *your constraint*

这是最简单的方法。或者,对于任何求解器,如果您的约束是线性的,则可以将指标约束转换为等效的线性约束,而无需将二进制变量乘以任何其他变量。 (如果您的约束是非线性的,那么也可能会有一个转换。)要了解如何完成这种转换,请参阅@ LarrySnyder610对if condition in ampl的回答。

答案 1 :(得分:0)

一种选择是将UT分为两部分:UTplus和UTminus,两者均> =0。然后定义UT = UTplus-UTminus。

现在,您需要添加一个约束,该约束说两个中的一个最多可以为非零。有几种选择:

  1. 您可以使用建议的指标约束,如4er所述。使用二进制帮助程序变量来指示,如果该变量为1,则UTminus必须为零;如果帮助程序变量为0,则UTplus必须为零。如果您可以导出UTplus和UTminus的上限M,那么您也可以添加约束UTplus <= M*binaryUTminus <= M*(1 - binary)。如果M不太大,可能会带来更好的性能。
  2. 您可以使用包含UTplus和UTminus的SOS约束(变量中的每个索引都需要一个SOS)。这也迫使这两个中的一个最多可以为非零,但不会引入任何新变量。这是否比指标还是big-M更有效?必须进行测试。
  3. 如果UTplus和UTminus在目标函数中都具有正系数(用于最小化),那么在任何最佳解决方案中,两者之一就有机会自动为零。这取决于变量UT在模型中确切表示什么。查看模型,看看是否可以证明该属性。然后,您根本不需要任何额外的约束或变量。