Pyomo 中的嵌套总和

Nested sum in Pyomo

我是 Pyomo 的新手,也是 Python 的新手。我正在尝试编写一个模型,其中包含一个带有嵌套总和的 objective 函数。这是一个玩具示例,希望它也能使这个问题与其他人相关:

我有一组客户 C 和一组服务器 S。我按分钟租用服务器,我有一个 Pyomo 成本集,表示租用每台服务器的每分钟成本(有些比其他服务器贵).该 Set 的长度等于服务器的数量。我还有一组二维 Pyomo 服务时间,表示为每个客户提供服务所需的时间。这取决于服务器和客户,因此它由两者索引。

总成本是服务器成本之和(以服务器为索引)乘以服务时间之和(以服务器和客户为索引)。

我不知道如何在 Pyomo 中表示它,因为我索引的集合不同。这个 link: Pyomo sum inside sum with various index 似乎是一个类似的问题,但没有帮助。请记住,这一切都必须存在于 Pyomo Objective 函数中。

我尝试使用 Pyomo 的 sum_product 函数并对两者的笛卡尔积进行索引 (index = model.customers * model.servers),但这不起作用,因为服务器无法对客户进行索引。

我也试过嵌套总和 (sum_product(server costs, sum_product(service times, index = model.customers * model.servers), index = servers)),但这也不起作用,因为内部 sum_product 变成了服务器无法订阅的 LinearExpression 对象。

如何正确表达这笔金额?非常感谢。

我很确定你的 objective 函数看起来像这样(假设你的模型中有一个二进制变量 x 表明服务器 s 是否已分配给客户 c):

def cost_(model):
    return sum(model.Scostperminute[s]*model.servicetime[s,c]*model.x[s,c] for s in model.S for c in model.C)
model.cost = Objective(rule=cost_)