Проблема с кодом GMPL

Я пытался решить следующую проблему с помощью решателя GLPSOL:

Фред должен вложить 5000 долларов в течение следующих пяти лет. В начале каждого года он может вкладывать деньги в депозиты на один или два года. Банк выплачивает 4% по годичным депозитам и 9% (всего) по двухлетним срочным депозитам. Кроме того, West World Limited будет предлагать трехлетние сертификаты, начиная с начала второго года. Эти сертификаты вернут 15% (всего). Если Фред реинвестирует свои деньги, которые доступны каждый год, сформулируйте линейную программу, чтобы показать ему, как максимизировать его общую наличность в конце пятого года.

Я придумал следующую модель LP:

Поскольку x ij - сумма, инвестированная в опцион i в год j, мы смотрим на
максимизировать z = 1,04x 15 + 1,09x 24 + 1,15x 33,
при условии:

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

И попытался написать это в GMPL:

/* 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

У кого-нибудь есть мысли по этому поводу?

1 ответ

Решение

Вы должны дать уникальное имя каждому ограничению. Многократные назначения не допускаются.

Это работает на моей машине:

/* 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 

Удачи!

Другие вопросы по тегам