Ihr Problem scheint nicht zu sein, "dass die Summe der" Agenten "für jeden einzelnen Bedarf genau einen diskreten Teil der Energie oder gar nichts liefern muss ...", oder? Oder du hast mich nicht verstanden. Also werde ich versuchen, mein Problem besser zu beschreiben, auch weil ich eine Lösung gefunden habe.
In meinem Problem habe ich eine Reihe von Agenten, bei denen jeder über ein Budget von bestimmten Ressourcen verfügt, die sich die Kosten für Aufgaben teilen können, die 1 Mal "ausgeführt" werden sollen oder nicht (viele-zu-viele-Zuweisungen, ohne dass dies erforderlich ist) jede Aufgabe "ausführen"). Dies bedeutet: Die Summe der Teillösungen der Agenten für Aufgabe x sollte kleiner oder gleich den Kosten für Aufgabe x sein. Ziel ist es, die Aufgaben zu finden, die für die Agenten am wertvollsten sind.
Ich arbeite mit Gams-Software, daher beschreibe ich sie im Gams-Stil: Setze einen Agenten, t Aufgaben, Parameter, Kosten (t), Wert (t), Parameter, Ressourcen (a).
positive Variable y (a, t) (nicht int), Teil von Agent a für die Kosten der Aufgabe t Ziel:
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);
Wie ich schrieb, hatte ich eine Lösung, wusste aber nicht, wie ich Teillösungen trennen sollte. Aber jetzt habe ich herausgefunden, dass ich mit a eine Einschränkung aufbauen kann
binäre Variable z(t)
taskcost_bin_constraint z(t) =e= sum(a, y(a,t)) / cost(t);
sum(a, y(a,t)) / cost(t)
in der gleichungsformulierung ist etwas zwischen 0 und 1 und nach dieser einschränkung z
ist 0 für alle kleiner als 1 und 1 für 1. mit diesem taskcost_bin_constraint
ziel wäre:
maxvalue =e= sum(t, value(t) * z(t));
Ich habe mich gefragt, aber das funktioniert und gibt mir bessere Lösungen unter der Bedingung, eine Aufgabe voll zu erstellen oder nicht.
Vielleicht können Sie auch eine solche Einschränkung hinzufügen? Eine Einschränkung, um die Anforderungen genau zu erfüllen, ausgedrückt in einem Ausdruck mit einem Wert zwischen 0 und 1.