pyomo:如何僅在集合的一部分中索引變量?

第二

我正在嘗試在pyomo優化模型中跟踪 SOC 我有許多 BEV,我想跟踪每個 SOC。我傳遞給的 xpressionpe.Objective如下所示:

sum(sum(model.SOC[t+1, b] - model.SOC[t, b] for b in model.buses) for t in model.times)

model.buses並且model.times是我已經聲明為的兩個集合pe.Set時間從 (0, ...., 95) 開始。因此,在最後一次迭代中,model.times它嘗試訪問model.SOC[96, b]導致KeyError.

有沒有辦法告訴 pyomo 離開集合的最後一個元素來防止這個錯誤?

類似於:

sum(sum(model.SOC[t+1, b] - model.SOC[t, b] for b in model.buses) for t in model.times[0:-2])

可悲的是,這也引發了一個錯誤:

IndexError: times indices must be integers, not slice

這是一個應該重現錯誤的最小示例:

import pyomo.environ as pe

solver = pe.SolverFactory('glpk')
model = pe.ConcreteModel('Test')
model.times = pe.Set(initialize=list(range(96)))
model.buses = pe.Set(initialize=list(range(5)))
model.SOC = pe.Var(model.times*model.buses, domain=pe.PositiveReals)

def example_rule(model):
    return sum(sum(model.SOC[t+1, b] - model.SOC[t, b] for b in model.buses) for t in model.times)

model.obj = pe.Objective(rule=example_rule, sense=pe.maximize)

model.pprint()

提前謝謝了!

魷魚

是的,有幾種方法可以做到這一點。首先,如果你想索引是有序的(這是默認值)的設置,您可以使用firstlast以及prev以各種方式設置的方法。(請參閱我對下面代碼的編輯)

其次,您始終可以構建自己的子集並將其放入或不放入模型中。下面的第二個模型顯示了任意複雜子集的構造並將其放入模型中。該集合可用作目標或約束的基礎。

此解決方案類似於此答案

import pyomo.environ as pe

solver = pe.SolverFactory('glpk')
model = pe.ConcreteModel('Test')
model.times = pe.Set(initialize=list(range(5)), ordered=True)  # ordered is default, this is for clarity...
model.buses = pe.Set(initialize=list(range(2)))
model.SOC = pe.Var(model.times*model.buses, domain=pe.PositiveReals)

def example_rule(model):
    return sum(sum(model.SOC[t+1, b] - model.SOC[t, b] for b in model.buses) for t in model.times if t != model.times.last())

model.obj = pe.Objective(rule=example_rule, sense=pe.maximize)

model.pprint()


# making your own subset...
times = 10
model2 = pe.ConcreteModel("other")
model2.times = pe.Set(initialize=range(times))
# make a subset of the even values that are no more than 4 values close to the end....
model2.times_subset = pe.Set(initialize=[t for t in model2.times if t%2==0 and t <= times-4])

model2.pprint()

產量:

3 Set Declarations
    SOC_index : Size=1, Index=None, Ordered=True
        Key  : Dimen : Domain      : Size : Members
        None :     2 : times*buses :   10 : {(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1), (4, 0), (4, 1)}
    buses : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    2 : {0, 1}
    times : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    5 : {0, 1, 2, 3, 4}

1 Var Declarations
    SOC : Size=10, Index=SOC_index
        Key    : Lower : Value : Upper : Fixed : Stale : Domain
        (0, 0) :     0 :  None :  None : False :  True : PositiveReals
        (0, 1) :     0 :  None :  None : False :  True : PositiveReals
        (1, 0) :     0 :  None :  None : False :  True : PositiveReals
        (1, 1) :     0 :  None :  None : False :  True : PositiveReals
        (2, 0) :     0 :  None :  None : False :  True : PositiveReals
        (2, 1) :     0 :  None :  None : False :  True : PositiveReals
        (3, 0) :     0 :  None :  None : False :  True : PositiveReals
        (3, 1) :     0 :  None :  None : False :  True : PositiveReals
        (4, 0) :     0 :  None :  None : False :  True : PositiveReals
        (4, 1) :     0 :  None :  None : False :  True : PositiveReals

1 Objective Declarations
    obj : Size=1, Index=None, Active=True
        Key  : Active : Sense    : Expression
        None :   True : maximize : SOC[1,0] - SOC[0,0] + SOC[1,1] - SOC[0,1] + SOC[2,0] - SOC[1,0] + SOC[2,1] - SOC[1,1] + SOC[3,0] - SOC[2,0] + SOC[3,1] - SOC[2,1] + SOC[4,0] - SOC[3,0] + SOC[4,1] - SOC[3,1]

5 Declarations: times buses SOC_index SOC obj
2 Set Declarations
    times : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :   10 : {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
    times_subset : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    4 : {0, 2, 4, 6}

2 Declarations: times times_subset
[Finished in 553ms]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Java中的索引之间替换字符串的一部分

索引数组的一部分

如何使#if #endif成为宏的一部分

如何计算在Python中作为列表一部分的集合的出现次数?

如何过滤函数输出的一部分

SQLite中列的一部分上的索引

如何显示大图像的一部分?

Elasticsearch-如何在所有索引和文档中搜索词的一部分

如何在熊猫中取一列的一部分与另一列的一部分匹配?

如何根据索引删除列表的一部分

如何确定产品是否属于Shopify液体模板中的隐藏集合的一部分?

如何更新模型是集合的一部分

获取包含在字符向量中的名称的一部分字符的索引

确保数字是集合的一部分(javascript)

如何重写URL的一部分?

更新集合时如何更新模板的一部分?

我将如何为作为 cloudant nosql 中数组一部分的元素创建索引?

如何在 XAML 中迭代集合,其中集合是 c# 类中模型的一部分

如何在单词索引后获取标题的一部分 - wordpress

如何使数据透视表的熊猫索引成为列名的一部分?

如何在表格的一部分中添加百分比

定义列系列的一部分以在熊猫中建立索引

如何在 MongoDB 中的 findOne 之後僅顯示數組的一部分?

WordPress WP_Query 僅顯示總帖子的一部分

如何僅從字典中獲取鍵的一部分的值?

如何在 Swift 中僅讀取文件的第一部分?

RewriteRule 僅包括 REQUESTI_URI 的最後一部分

如何只調整數組的一部分,而其他部分保持不變?

是否可以根據變量的值更改變量的一部分?