Проблема с кодом 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
Удачи!