1

我试图解决以下问题,使用 GLPSOL 求解器:

弗雷德有 5000 美元在未来五年内投资。每年年初,他可以将钱投资于一年或两年的定期存款。银行为一年期定期存款支付 4% 的利息,为两年期定期存款支付 9%(总计)的利息。此外,West World Limited 将从第二年初开始提供为期三年的证书。这些证书将返回 15%(总计)。如果 Fred 将每年可用的资金进行再投资,请制定一个线性程序,向他展示如何在第五年末最大化手头的总现金。

我想出了以下LP模型:

由于 x ij是第 j 年投资于期权 i 的金额,我们希望
最大化 z = 1,04x 15 + 1,09x 24 + 1,15x 33
但须符合:

  • x 11 + x 12 <= 5000
  • x 31 = x 34 = x 35 = 0
  • x 12 + x 22 + x 32 <= 1,04 x 11
  • x 13 + x 23 + x 33 <= 1,04 x 12 + 1,09 x 21
  • x 14 + x 24 <= 1,04 x 13 + 1,09 x 22
  • x 15 <= 1,04 x 14 + 1,09 x 23 + 1,15 x 32
  • x ij >= 0

并尝试用 GPL 编写它:

/* Variables */
var x{i in 1..3, j in 1..5} >= 0;

/* Objective */
maximize money: 1.04*x[1,5] + 1.09*x[2,4] + 1.15*x[3,3];

/* Constraints */
s.t. x[1,1] + x[2,1] <= 5000;
s.t. x[3,1] = x[3,4] = x[3,5] = 0;
s.t. x[1,2] + x[2,2] + x[3,2] <= 1.04 * x[1,1];
s.t. x[1,3] + x[2,3] + x[3,3] <= 1.04 * x[1,2] + 1.09 * x[2,1];
s.t. x[1,4] + x[2,4] <= 1.04 * x[1,3] + 1.09 * x[2,2];
s.t. x[1,5] <= 1.04 * x[1,4] + 1.09 * x[2,3] + 1.15 * x[3,2];

/* Resolve */
solve;

/* Results */
printf{j in 1..5}:"\n* %.2f %.2f %2.f \n", x[1,j], x[2,j], x[3,j];

end;

但是,我收到以下错误:

inv.mod:14: x 多重声明
上下文: ...[ 1 , 5 ] + 1.09 * x [ 2 , 4 ] + 1.15 * x [ 3 , 3 ] ; st x
MathProg 模型处理错误

有人对此有任何想法吗?

4

1 回答 1

2

您必须为每个约束指定一个唯一的名称。不允许多次分配。

这适用于我的机器:

/* Variables */
var x{i in 1..3, j in 1..5} >= 0;

/* Objective */
maximize money: 1.04*x[1,5] + 1.09*x[2,4] + 1.15*x[3,3];

/* Restrições */
s.t. c1: x[1,1] + x[2,1] <= 5000;
s.t. c2: x[3,1] = 0;
s.t. c3: x[3,4] = 0;
s.t. c4: x[3,5] = 0;
s.t. c5: x[1,2] + x[2,2] + x[3,2] <= 1.04 * x[1,1];
s.t. c6: x[1,3] + x[2,3] + x[3,3] <= 1.04 * x[1,2] + 1.09 * x[2,1];
s.t. c7: x[1,4] + x[2,4] <= 1.04 * x[1,3] + 1.09 * x[2,2];
s.t. c8: x[1,5] <= 1.04 * x[1,4] + 1.09 * x[2,3] + 1.15 * x[3,2];

/* Resolve */
solve;

/* Results */
printf{j in 1..5}:"\n* %.2f %.2f %2.f \n", x[1,j], x[2,j], x[3,j];

end;

它打印:

* 0.00 5000.00  0 

* 0.00 0.00  0 

* 0.00 0.00 5450 

* 0.00 0.00  0 

* 0.00 0.00  0 

祝你好运!

于 2014-03-31T01:18:56.757 回答