Схоже, ваша проблема не полягає в тому, що сума "агентів" повинна забезпечувати рівномірну частку енергії або нічого на кожну потребу ... ", правда? Або ти мене не зрозумів. Тому я спробую краще описати свою проблему ще й тому, що знайшов рішення.
У своїй проблемі я маю набір агентів, у кожного з яких є бюджет певних ресурсів, який може поділити вартість завдань, які повинні бути "виконані" 1 раз чи ні (завдання багато-багато-багато без необхідності "виконати" кожне завдання). Це означає: сума часткових розв’язків агентів для завдання x повинна бути меншою або рівною вартості завдання x. Мета - знайти набір завдань з найбільшою вартістю, яку можуть заплатити агенти.
Я працюю з програмним забезпеченням gams, тому описую його у стилі gams: встановіть агенти, t параметр параметра вартості (t), значення (t) ресурсів параметрів (a)
позитивна змінна y (a, t) (non-int), частина агента a для вартості завдання t цілі:
maxvalue =e= sum((a,t), value(t) * y(a,t) / cost(t) );
agentresource_max_constraint(a).. sum(t, y(a,t)) =l= resources(a);
taskcost_max_constraint.. sum(a, y(a,t)) =l= cost(t);
Як я писав, я мав рішення, але не знав, як відокремити часткові рішення завдань. Але тепер я дізнався, що я можу створити обмеження з a
двійкова змінна z(t)
taskcost_bin_constraint z(t) =e= sum(a, y(a,t)) / cost(t);
sum(a, y(a,t)) / cost(t)
у формулюванні рівняння є щось середнє між 0 і 1, і за цим обмеженням z
дорівнює 0 для всіх менше 1 і 1 для 1. з цією taskcost_bin_constraint
метою було б:
maxvalue =e= sum(t, value(t) * z(t));
Мені було цікаво, але це працює і дає мені кращі рішення з обмеженням, будувати завдання повне чи ні.
Може, ви також можете додати таке обмеження? Обмеження точно виконувати вимоги, виражене у виразі зі значенням від 0 до 1.