Seu problema não parece ser "que a soma dos" agentes "precisa fornecer exatamente uma porção discreta de energia ou nada para cada demanda ...", certo? Ou você não me entendeu. Então, tentarei descrever melhor meu problema, também porque encontrei uma solução.
No meu problema, tenho um conjunto de agentes em que cada um tem um orçamento de certos recursos, que podem compartilhar o custo das tarefas, que devem ser "executadas" 1 vez ou não (atribuição de muitos para muitos sem a necessidade de "execute" todas as tarefas). Significa: a soma de soluções parciais de agentes para a tarefa x deve ser menor ou igual ao custo da tarefa x. O objetivo é encontrar o conjunto de tarefas com maior valor que os agentes podem pagar.
Estou trabalhando com o software gams, para descrevê-lo no estilo gams: defina um agente, t tarefa parâmetro cost (t), value (t) parameter resources (a)
variável positiva y (a, t) (não int), parte do agente a para o custo da tarefa t objetivo:
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);
Como escrevi, eu tinha uma solução, mas não sabia como separar soluções de tarefas parciais. Mas agora descobri que posso criar uma restrição com um
variável binária z(t)
taskcost_bin_constraint z(t) =e= sum(a, y(a,t)) / cost(t);
sum(a, y(a,t)) / cost(t)
na formulação da equação é algo entre 0 e 1 e, por essa restrição, z
é 0 para todos menos de 1 e 1 para 1. com esse taskcost_bin_constraint
objetivo seria:
maxvalue =e= sum(t, value(t) * z(t));
Fiquei pensando, mas isso funciona e me dá melhores soluções sob a restrição, para construir uma tarefa completa ou não.
Talvez você também possa adicionar essa restrição? Uma restrição para atender exatamente às demandas, expressa em uma expressão com valor entre 0 e 1.