Ibm optimization studio opl, почему не соблюдаются ограничения?

Вот описание проблема оптимизации, которое мне нужно решить, но с небольшим поворотом. Мне нужно добавить два ограничения:

  • Первое ограничение: из каждой группы мы хотим выбрать только один продукт, что означает, что мы не можем позволить двум продуктам из одной группы находиться в одной корзине (т.е. Product11 и Product12 никогда не должны находиться в одной корзине).
  • Второе ограничение: в пользовательской корзине нам нужны только продукты из категорий, которые интересуют пользователя. То есть, если пользователя интересует категория «Белок», он никогда не должен найти в своей корзине продукт из категории «Углеводы» или « Толстый'.

Соответственно я изменил код OPL products.mod:

{string} categories=...;

{string} groups[categories]=...;

{string} allGroups=union (c in categories) groups[c];

{string} products[allGroups]=...;
{string} allProducts=union (g in allGroups) products[g];

float prices[allProducts]=...;

int Uc[categories]=...;
float Ug[allGroups]=...;

float budget=...;



dvar boolean z[allProducts]; // product out or in ?


dexpr int xg[g in allGroups]=(sum(p in products[g]) z[p]);
dexpr int xc[c in categories]=(1<=sum(g in groups[c]) xg[g]);




maximize
sum(c in categories) Uc[c]*xc[c]+
sum(c in categories) sum(g in groups[c]) Uc[c]*Ug[g]*xg[g];
subject to
{
ctBudget:// first constraint
    sum(p in allProducts) z[p]*prices[p]<=budget;
ctGroups: // second constraint 
    forall( g in allGroups )
        xg[g]==1;
ctCategories: // third constraint 
    forall( c in categories )
        Uc[c]==xc[c];
}
{string} solution={p | p in allProducts : z[p]==1};
 execute
 {
   writeln("xg=",xc);
   writeln("xg=",xg);
   writeln("Solution=",solution);

  }

Вот код для products.data

categories={"Carbs","Protein","Fat"};
groups=[{"Meat","Milk"},{"Pasta","Bread"},{"Oil","Butter"}];
products=[
{"Product11","Product12"},{"Product21","Product22","Product23"},
{"Product31","Product32"},{"Product41","Product42"},
{"Product51"},{"Product61","Product62"}];

prices=[1,1,3,3,2,1,2,1,3,1,2,1];


Uc=[1,0,0];
Ug=[0.8,0.2,0.1,1,0.01,0.6];
budget=2;

IBM Studio выдала следующие результаты: {Product12, Product31}; в то время как я хочу получить либо {Product11}, либо {Product12}.

Я также заметил это на вкладке конфликтов: enter image description here

И это во вкладке релаксации: enter image description here

Итак, у меня пять вопросов:

  1. Я не вижу никаких конфликтов между ограничениями, потому что, если мы выберем продукт «Продукт12» (или Продукт11), мы соблюдаем все ограничения, и бюджет будет <= 2, потому что цена [«Продукт12»] == 1.
  2. Я не понимаю, почему оптимизатор решил не соблюдать последнее ограничение и вместо этого максимизировать целевую функцию.
  3. Если бы оптимизатор не использовал какое-либо ослабление, привело бы ли это к недопустимой модели (без решения проблемы)? Я не понимаю почему? Для меня выбор только «Продукт12» (или «Продукт11») - идеальное решение, не требующее расслабления.
  4. Как заставить оптимизатор не ослаблять последнее ограничение? (Обратите внимание, что изменение файла настроек products.ops для ослабления только помеченных ограничений, как в документация, не помогло, так как я хочу ослабить только одно ограничение)

  5. В документации по расслабляющие неосуществимые модели я нашел это:

Be aware, however, that infeasibility may be the consequence of an error in the modeling of another constraint.

Это мой случай?

Заранее спасибо за помощь

1
0
222
1

Ответы 1

  • на № 1 + 2 = у вас есть некоторые вещи, которые не определены в модели ... можете ли вы сказать, существуют ли все группы и группы отдельно или 2 одинаковые, тогда каковы данные для них? Также вы используете «продукты» и «все продукты», то же Q, что и для «групп». Не могли бы вы вставить сюда полные .mod и .dat, которые вы запустили и дали расслабленный результат, который вы показали ...? Как только я смогу хотя бы воспроизвести проблему, которую вы показываете, я могу начать искать «почему» :-)
  • на № 3 = да, это должно быть
  • на № 4 = способ, которым вы могли бы прийти к нерелаксированной модели, состоит в том, что вы удаляете наименования для ограничений. Т.е. КАЖДОЕ указанное ограничение считается ослабленным, если без ослабления не может быть решения. Каждое неименованное ограничение является «жестким», т.е. оно ДОЛЖНО соблюдаться, его нельзя ослаблять. Просто удалите или закомментируйте эти строки: ctBudget:// first constraint, ctGroups: // second constraint, ctCategories: // third constraint, если вы хотите, чтобы все ограничения соблюдались так же, как и с заданными данными ...

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