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