Вот описание проблемы оптимизации Мне нужно решить, но с небольшим поворотом. Мне нужно добавить два ограничения:
- Первое ограничение: из каждой группы мы хотим выбрать только один продукт, что означает, что мы не можем позволить двум продуктам из одной группы находиться в одной корзине (т.е. 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}.
Я также заметил это на вкладке конфликтов:
Итак, у меня пять вопросов:
- Я не вижу конфликтов между ограничениями, потому что, если мы выберем продукт «Продукт12» (или Продукт11), мы соблюдаем все ограничения, и бюджет будет <= 2, потому что цена [«Продукт12»] == 1.
- Я не понимаю, почему оптимизатор решил не соблюдать последнее ограничение и вместо этого максимизировать целевую функцию.
- Если бы оптимизатор не использовал какое-либо ослабление, привело бы ли это к недопустимой модели (без решения проблемы)? Я не понимаю почему? Для меня выбор только «Продукт12» (или «Продукт11») - идеальное решение, не требующее расслабления.
Как заставить оптимизатор не ослаблять последнее ограничение? (Обратите внимание, что изменение файла настроек products.ops для ослабления только помеченных ограничений, как в документация не помогла, так как я хочу ослабить только одно ограничение)
В документации по расслабляющие несовместимые модели Я обнаружил следующее:
Однако имейте в виду, что неосуществимость может быть следствием ошибки при моделировании другого ограничения.
Это мой случай?
Заранее спасибо за помощь