Su problema no parece ser "que la suma de los" agentes "tenga que suministrar exactamente una porción discreta de energía o nada para cada demanda ...", ¿verdad? O no me entendiste. Así que intentaré describir mejor mi problema, también porque encontré una solución.
En mi problema, tengo un conjunto de agentes donde cada uno tiene un presupuesto de ciertos recursos, que pueden compartir el costo de las tareas, que deben "ejecutarse" 1 vez o no (asignación de muchos a muchos sin la necesidad de "ejecutar" cada tarea). Significa: la suma de las soluciones parciales de los agentes para la tarea x debe ser menor o igual al costo de la tarea x. El objetivo es encontrar el conjunto de tareas con más valor que los agentes pueden pagar.
Estoy trabajando con el software gams, así que lo describo en estilo gams: establezca un agente, t tareas costo de parámetro (t), valor (t) recursos de parámetro (a)
variable positiva y (a, t) (no int), parte del agente a para el costo de la tarea 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);
Mientras escribía, tenía una solución pero no sabía cómo separar las soluciones de tareas parciales. Pero ahora descubrí que puedo construir una restricción con un
variable binaria z(t)
taskcost_bin_constraint z(t) =e= sum(a, y(a,t)) / cost(t);
sum(a, y(a,t)) / cost(t)
en la formulación de la ecuación hay algo entre 0 y 1 y por esta restricción, z
es 0 para todos menos de 1 y 1 para 1. con este taskcost_bin_constraint
objetivo sería:
maxvalue =e= sum(t, value(t) * z(t));
Me preguntaba, pero esto funciona y me da mejores soluciones bajo la restricción, para construir una tarea completa o no.
¿Quizás también puede agregar tal restricción? Una restricción para satisfacer las demandas exactamente, expresada en una expresión con valor entre 0 y 1.