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}.

Я также заметил это на вкладке конфликтов:  введите описание изображения здесь

И это на вкладке релаксации:  введите описание изображения здесь

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

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

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

Однако имейте в виду, что неосуществимость может быть следствием ошибки при моделировании другого ограничения.

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

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


person sel    schedule 13.09.2018    source источник


Ответы (1)


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