Sorununuz, "ajanların" toplamının her bir talep için tam olarak ayrı bir enerji kısmı veya hiçbir şey sağlaması gerektiği gibi görünmüyor ... ", değil mi? Yoksa beni anlamadın. Bu yüzden sorunumu daha iyi açıklamaya çalışacağım, çünkü bir çözüm buldum.
Benim sorunumda, her birinin belirli kaynakların bir bütçesine sahip olduğu, 1 kez "yürütülmesi" gerekip gerekmediği görevlerin maliyetini paylaşabilecek bir dizi ajanım var (gerek kalmadan çoktan çoğa atama) her görevi "yürüt". Bunun anlamı: Görev x için ajanların kısmi çözümlerinin toplamı, görev x'in maliyetine eşit veya daha az olmalıdır. Amaç, temsilcilerin ödeyebileceği en değerli iş kümesini bulmaktır.
Gams yazılımı ile çalışıyorum, bu yüzden gams tarzında açıklarım: bir ajan, t görev parametre maliyeti (t), değer (t) parametre kaynakları (a)
pozitif değişken y (a, t) (int olmayan), görev a'nın maliyeti için madde a'nın bir amacı:
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);
Yazdığım gibi, bir çözümüm vardı ama kısmi görev çözümlerini nasıl ayıracağımı bilmiyordum. Ama şimdi öğrendim ki bir
ikili değişken z(t)
taskcost_bin_constraint z(t) =e= sum(a, y(a,t)) / cost(t);
sum(a, y(a,t)) / cost(t)
denklem formülasyonunda 0 ile 1 arasında bir şeydir ve bu kısıtlama z
ile 1 için 1 ve 1'den küçük olanlar için 0'dır. Bu taskcost_bin_constraint
amaçla:
maxvalue =e= sum(t, value(t) * z(t));
Merak ediyordum ama bu işe yarıyor ve bana tam bir görev inşa etmek ya da etmemek için kısıtlama altında daha iyi çözümler sunuyor.
Belki de böyle bir kısıtlama ekleyebilirsiniz? 0 ile 1 arasında bir değere sahip bir ifadede ifade edilen talepleri tam olarak yerine getirmek için bir kısıtlama.