Pyomo:优化发电厂大小的最佳方法,类型错误:不支持的操作数类型:*:'float'和'IndexedVar'



我正在尝试解决一个优化问题,其中负载需求必须由两个发电厂满足。这些发电厂有不同的发电量。例如(随机数)

power_prod1 = [2,0,1]
power_prod2 = [0,1,1]

不同电厂的负荷需求和成本以相似的方式给出。成本是指工厂的规模,见下面的工厂1和工厂2的规模。

load_demand = [4,4,4] 
Costs = {'power 1':60, 'power2':120}

为了解决这个问题,我尝试了


def plant1_size(model,i,j):
return(0, None)
model.PowerPlant1Size = pyo.Var(model.plants,model.periods,bounds=plant1_size)
def plant2_size(model,i,j):
return(0, None)
model.PowerPlant2Size  = pyo.Var(model.plants,model.periods,bounds=plant2_size)

def load_balance(model,i,j):
return (power_prod1[j]*model.PowerPlant1Size + power_prod2[j]*model.PowerPlant2Size == load_demand[j])
model.load_constraint = pyo.Constraint(model.plants,model.periods,rule=load_balance)

并有一个目标函数,其目标是通过选择合适的发电厂规模来最小化成本。当我运行这段代码时,我得到一个错误& TypeError:不支持的操作数类型(s) *: 'float'和'IndexedVar'"。我知道为什么我得到这个错误,但我不能想出一个办法来解决电厂的规模。(当我试图以另一种方式解决问题时,可能会有一些多余的代码和一些我没有包含的代码)。

我如何重写这个问题以pyomo可以解决的方式?

这里有几件事很麻烦。我不确定你的潜在数学问题是否合理。我会放慢执行速度,用铅笔和纸列出所有变量和索引,以确保它是有意义的。例如,您将plant size作为一个变量,它随时间段索引…这是否意味着5号电站可以在不同的时间段变大变小?

在同一变量上,您似乎将索引嵌入到名称中,即使您是按植物编号进行索引。我希望看到像特定工厂的产量这样的变量:

model.production = pyo.Var(model.plants, model.time_periods)

哦,你看到的错误的主要来源是你使用了一个索引变量,而没有在你的目标中提供PowerPlantSize的索引…

相关内容

最新更新