IBM Optimization Studio OPL, почему ограничение не соблюдается? - PullRequest
0 голосов
/ 13 сентября 2018

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

  • Первое ограничение: из каждой группы мы хотим выбрать только один продукт, что означает, что мы не можем допустить, чтобы два продукта из одной группы были в одном и том жекорзина (т. е. 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. Я не вижу противоречий между ограничениями, потому что если мы выберем продукт"Product12" (или Product11 ") мы соблюдаем все ограничения, и бюджет будет <= 2, потому что цена [" Product12 "] == 1. </li>
  2. Я не понимаю, почему оптимизатор решил несоблюдайте последнее ограничение и вместо этого максимизируйте целевую функцию.
  3. Если оптимизатор не использовал какое-либо ослабление, приведет ли это к неосуществимой модели (без решения проблемы)? Я не понимаю, почему?Для меня выбор только «Product12» (или «Product11») - это идеальное решение без какой-либо релаксации.
  4. Как заставить оптимизатор не ослаблять последнее ограничение? (Обратите внимание, что изменениефайл настроек, products.ops для relтолько топор помечал ограничения как в документации не помогло, так как я хочу ослабить только одно ограничение)

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

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

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

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

1 Ответ

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