Как я могу написать условие if для моей переменной в GLPK?

Вот моя полная проблема:

введите описание изображения здесь

Информация:

*Максимум. общая сумма инвестиций: 125 $

* Выплата - это сумма купленных единиц x выплата за единицу.

* Стоимость инвестиций: стоимость бай-ина + стоимость единицы x количество единиц, если вы покупаете хотя бы одну единицу.

* Стоимость представляет собой сумму затрат на одну инвестицию.

Ограничения:

* Вы не можете инвестировать одновременно в 2 и 5.

* Вы можете инвестировать в 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 else к переменной y в glpk. Не могли бы вы мне помочь?

Мое моделирование:

 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

person Figen Güngör    schedule 17.03.2013    source источник
comment
Что такое x_i? Это непрерывная, целочисленная или двоичная переменная или это входные данные?   -  person user327301    schedule 17.03.2013
comment
xi - это номер i купленного товара. Эти значения должна найти программа для оптимизации.   -  person Figen Güngör    schedule 17.03.2013
comment
Думаю, ваш ответ может быть здесь, но я никогда не использовал GLPK: en.wikibooks.org/ wiki / GLPK / GMPL_Workarounds   -  person user327301    schedule 18.03.2013


Ответы (1)


Вы не можете сделать это напрямую (нет возможности написать «напрямую» ограничение if в LP).

Однако для этого есть обходные пути. Например, вы можете написать:

M * yi > xi

где M - большая константа (больше любого значения xi).

Сюда:

  • если xi > 0, то ограничение эквивалентно yi > 0, то есть yi == 1, поскольку yi является двоичным (если M достаточно велико).
  • если xi == 0, то ограничение всегда проверяется, и yi будет равно 0, поскольку ваша цель увеличивается с yi, а вы минимизируете.

в обоих случаях ограничение эквивалентно тесту if.

person Nicolas Grebille    schedule 18.03.2013
comment
Спасибо, Николас. Я запустил свой код, но он дал мне эту синтаксическую ошибку, и я не могу ее понять. Не могли бы вы мне помочь? Я отредактировал свой вопрос с моей модельной и синтаксической ошибкой. - person Figen Güngör; 19.03.2013
comment
Извините, я не знаю вашего языка моделирования; однако кажется, что ваше объявление var {x in I} >=0; неверно. Возможно, есть лучший способ сделать это, но я предлагаю вам объявить переменную как другие var {x in I};, а затем добавить x[i] >= 0, как вы это делали с другими ограничениями (для каждого i). Если это не сработает, я предлагаю вам задать еще один вопрос конкретно об ошибке синтаксиса в вашей модели, вы, скорее всего, получите помощь (мало шансов, что кто-то сейчас обратится к этому вопросу, поскольку вы приняли ответ). - person Nicolas Grebille; 19.03.2013
comment
Кроме того, если вы добавите еще один вопрос, вам следует добавить тег для конкретного языка моделирования, который вы используете (для меня это похоже на ampl, но я не уверен и, как я уже сказал, я их не использую). glpk на самом деле является «основным» lp-решателем: его можно использовать с автономной программой, такой как glpsol и т. Д .; но это также C библиотека, поэтому тегирование glpk немного вводит в заблуждение (ваши проблемы, похоже, больше связаны с языком моделирования, чем с самим решателем). - person Nicolas Grebille; 19.03.2013
comment
Ну, я изменил его, как вы сказали, но возникла такая же проблема с синтаксисом. Я запускаю его с помощью: glpsol -m проблема.mod -o проблема.sol // Так что я собираюсь задать его в новом вопросе, как вы сейчас предлагаете. Спасибо. знак равно - person Figen Güngör; 19.03.2013