Il tuo problema non sembra essere "che la somma degli" agenti "debba fornire esattamente una porzione discreta di energia o niente per ogni singola domanda ...", giusto? O non mi hai capito. Quindi proverò a descrivere meglio il mio problema, anche perché ho trovato una soluzione.
Nel mio problema, ho una serie di agenti in cui ognuno ha un budget di determinate risorse, che possono condividere il costo dei compiti, che dovrebbero essere "eseguiti" 1 volta o meno (assegnazione da molti a molti senza la necessità di "esegui" ogni attività). Significa: la somma delle soluzioni parziali degli agenti per l'attività x dovrebbe essere inferiore o uguale al costo dell'attività x. L'obiettivo è trovare l'insieme di attività con il maggior valore che gli agenti possono pagare.
Sto lavorando con il software gams, quindi lo descrivo in stile gams: impostare un agent, t task parametro cost (t), valore (t) parametro parametri (a)
variabile positiva y (a, t) (non int), parte dell'agente a per costo del compito t obiettivo:
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);
Come ho scritto, avevo una soluzione ma non sapevo come separare le soluzioni di attività parziali. Ma ora ho scoperto che posso creare un vincolo con a
variabile binaria z(t)
taskcost_bin_constraint z(t) =e= sum(a, y(a,t)) / cost(t);
sum(a, y(a,t)) / cost(t)
nell'equazione la formulazione è qualcosa tra 0 e 1 e con questo vincolo, z
è 0 per tutti meno di 1 e 1 per 1. con questo taskcost_bin_constraint
obiettivo sarebbe:
maxvalue =e= sum(t, value(t) * z(t));
Mi chiedevo ma questo funziona e mi offre soluzioni migliori sotto il vincolo, per costruire un compito pieno o no.
Forse puoi anche aggiungere un tale vincolo? Un vincolo per soddisfare esattamente le richieste, espresso in un'espressione con valore compreso tra 0 e 1.