您的问题似乎不是,““代理”的总和必须为每个单一需求提供完全离散的能量部分或不提供任何东西......”,对吗?或者你不理解我。所以我会尝试更好地描述我的问题,也是因为我找到了解决方案。
在我的问题中,我有一组代理,其中每个代理都有特定资源的预算,他们可以分担任务的成本,这些任务应该“执行”一次或不执行(多对多分配,无需“执行”每个任务)。这意味着:任务 x 的代理的部分解决方案之和应小于或等于任务 x 的成本。目标是找到代理可以支付的最有价值的任务集。
我正在使用 gams 软件,所以我用 gams 风格描述它:设置代理、t 任务参数成本(t)、值(t)参数资源(a)
正变量 y(a,t)(非整数),代理 a 的一部分,用于任务 t 目标的成本:
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);
正如我所写,我有一个解决方案,但不知道如何分离部分任务解决方案。但现在我发现我可以用
二进制变量z(t)
taskcost_bin_constraint z(t) =e= sum(a, y(a,t)) / cost(t);
sum(a, y(a,t)) / cost(t)
在方程公式中是介于 0 和 1 之间的东西,并且通过这个约束,z
对于所有小于 1 和 1 来说都是 0。这个taskcost_bin_constraint
目标将是:
maxvalue =e= sum(t, value(t) * z(t));
我想知道,但这可行,并在约束下为我提供了更好的解决方案,以完成或不完成任务。
也许您也可以添加这样的约束?一个精确满足需求的约束,用值在 0 到 1 之间的表达式表示。