2013-03-17 102 views
5

这里是我的全部问题:如何在GLPK中为我的变量编写if条件?

enter image description here

信息:

*最大。项目总投资:$ 125

*放线为单位的总和买X放/单元

*每个投资成本:买入成本+单位成本/单元X号,如果你买的至少一个单元

*成本约为每投资成本

约束的总和:

*您不得投资于2和5

* Y ou可以投资1只有当您投资2和3中的至少一个时。

*您必须投资3,4,5中的至少两个。

*您不得投资超过最大单位数量。

问题:最大化利润:放线 - 成本

xi: # of units i ∈ {1,2,3,4,5} 
yi=1 if xi>0 else yi=0 
cost = sum{i in I} buyInCost_i * yi + cost-unit_i*xi 
pay-off = sum{i in I} (pay-off/unit)_i*xi 
profit = pay-off - cost 

Maximize profit 

Subject to 

y2+y5 <= 1 
y1<= y2+y3 
y3+y4+y5 >= 2 
x1<=5, x2<=4, x3<=5, x4<=7, x5<=3 
cost<=125 

这里是我的问题:

比如我有这样的二元变量y

yi=1 if xi>0 else yi=0 and i ∈ {1,2,3,4,5} 

我宣布我作为一个数据集

set I; 

data; 

set I := 1 2 3 4 5; 

我不知道如何添加if条件到glpk中的y变量。你能帮我解决吗?

我的造型:

set I; 

/*if x[i]>0 y[i]=1 else y[i]=0 ?????*/ 
var y{i in I}, binary; 

param a{i in I}; 
/* buy-in cost of investment i */ 

param b{i in I}; 
/* cost per unit of investment i */ 

param c{i in I}; 
/* pay-off per unit of investment i */ 

param d{i in I}; 
/* max number of units of investment i */ 

var x{i in I} >=0; 
/* Number of units that is bought of investment i */ 

var po := sum{i in I} c[i]*x[i]; 

var cost := sum{i in I} a[i]*y[i] + b[i]*x[i]; 

maximize profit: po-cost; 

s.t. c1: y[2]+y[5]<=1; 
s.t. c2: y[1]<y[2]+y[3]; 
s.t. c3: y[3]+y[4]+y[5]>=2; 
s.t. c4: x[1]<=5 
    x[2]<=4 
    x[3]<=5 
    x[4]<=7 
    x[5]<=3; 

s.t. c5: cost <=125; 
s.t. c6{i in I}: M * y[i] > x[i]; // if condition of y[i] 

set I := 1 2 3 4 5; 
param a := 
1 25 
2 35 
3 28 
4 20 
5 40; 

param b := 
1 5 
2 7 
3 6 
4 4 
5 8; 

param c := 
1 15 
2 25 
3 17 
4 13 
5 18; 

param d := 
1 5 
2 4 
3 5 
4 7 
5 3; 

param M := 10000; 

我得到这个语法错误:

 problem.mod:21: syntax error in variable statement 
     Context: ...I } ; param d { i in I } ; var x { i in I } >= 0 ; var po := 
     MathProg model processing error 
+0

什么是x_i?它是连续的,整数还是二进制变量,还是输入数据? – raoulcousins 2013-03-17 19:22:45

+0

xi是我购买的产品数量。这些值应该通过程序找到优化。 – 2013-03-17 19:31:34

+0

我想你的答案可能在这里,但我从来没有使用GLPK:http://en.wikibooks.org/wiki/GLPK/GMPL_Workarounds – raoulcousins 2013-03-17 20:56:37

回答

8

你不能直接这样做(有没有办法写“直接”的一if约束LP)。

但是,有这方面的解决方法。 例如,可以编写:

M * yi > xi 

M哪里是一个大的恒定(比xi任何值)。

这样:

  • 如果xi > 0,那么约束就等于yi > 0,这是因为yi == 1yi二进制文件(如果M足够大)。
  • 如果xi == 0,那么约束总是被验证,并且yi将等于0,因为您的目标随着yi的增加而增加,并且您正在最小化。

在这两种情况下,约束条件相当于if测试。

+0

谢谢你,尼古拉斯。我跑了我的代码,但它给了我这个语法错误,我无法弄清楚。你能帮我解决吗?我用我的建模和语法错误编辑了我的问题。 – 2013-03-18 21:42:54

+0

对不起,我不知道你的造型语言;然而,看起来你的声明'var {x in I}> = 0;'是不正确的。可能有更好的方法来做到这一点,但我建议你将变量声明为其他变量'var {x in I};'然后像对待其他约束一样添加'x [i]> = 0'每个'我')。如果这不起作用,我建议你在模型中特别提出另一个关于synthax错误的问题,你将更有可能获得帮助(现在很少有人看到这个问题,因为你接受了答案)。 – 2013-03-18 21:58:47

+0

另外,如果你添加另一个问题,你应该为你使用的特定建模语言添加一个标签(它看起来像'ampl',但我不确定,正如我所说,我不使用这些标签) 。 'glpk'实际上是'核心'lp解算器:它可以与独立程序一起使用,例如'glpsol'等;但它也是一个'C'库,所以标记'glpk'有点误导(你的问题似乎更多的是建模语言而不是解算器本身)。 – 2013-03-18 22:03:16