如何在代表不同大小的向量和集合的PYOMO参数中定义?

发布于 2025-02-09 04:44:31 字数 550 浏览 3 评论 0原文

我有一个具有一组向量的LP作为输入参数,其中包含2至12个元素:

[1,2,0,0,3]
[1,0,0,0,0,1,2]
[5,0,0,1,0,7]

对于每个节点:

model.Nodes = pyo.Set(initialize = range(0, len(nodes))

基本上:

0:[1,2,0,0,3]
1:[1,0,0,0,0,1,2]
2:[5,0,0,1,0,7]

此外,还希望定义一个参数构造如下:

{0,1,2,3,4}
{0,1,2,3,4,5,6}
{0,1,2,3,4,5}

将数字0包含到每个向量中的组件数量。再次与节点链接:

0:{0,1,2,3,4}
1:{0,1,2,3,4,5,6}
2:{0,1,2,3,4,5}

我真的不知道如何处理不同参数的不同大小(节点的数量也无法解决不同问题)。只要设置保持顺序,通常应该充分“链接”。

I have an LP with a set of vectors as input parameter containing 2 to 12 elements:

[1,2,0,0,3]
[1,0,0,0,0,1,2]
[5,0,0,1,0,7]

for each node:

model.Nodes = pyo.Set(initialize = range(0, len(nodes))

so basically:

0:[1,2,0,0,3]
1:[1,0,0,0,0,1,2]
2:[5,0,0,1,0,7]

and additionally would like to define a parameter construct as follows:

{0,1,2,3,4}
{0,1,2,3,4,5,6}
{0,1,2,3,4,5}

containing the numbers 0 to the number of components in each vector. Again linked with the nodes:

0:{0,1,2,3,4}
1:{0,1,2,3,4,5,6}
2:{0,1,2,3,4,5}

I don't really know how to deal with the varying size of the different parameters (the number of nodes is also not fix for different problems). As long as the set stays in order it should in general be "linked" sufficiently.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

挥剑断情 2025-02-16 04:44:31

下面的某些变化可能是您要寻找的。从您的帖子中不太清楚您想处理整数参数吗?我假设您有(a)节点列表,(b)每个节点的一些任意长度向量,以及(c)一些索引系统(整数)以获取数据。

我认为您缺少的作品是索引集,它是使用1集(在这种情况下节点)作为“集合”的索引的构造。在下面的vecs的打印输出中,这更加清楚。当然,您需要在内部集合中进行索引,在这种情况下,我使用了一组足够长的整数来索引任何内部集合。

最后,我不确定一种更好的方法来使用该事物的组合来容纳数据(参数),而不是在下面的工作方式,即“弄平”索引集中的成员资格,并使用它来保持参数。请注意,这具有稀疏集的优点,小于节点X元素的完整X产品的大小,但是进行求和时,您必须使用适当的集合(vecs_flat

import pyomo.environ as pyo


some_vectors = {
    'SF': [4, 5, 9, 22],
    'LA': [6, 0],
    'NY': [8,]
}

longest_vec_length = max({len(value) for value in some_vectors.values()})


# make model
m = pyo.ConcreteModel('nodes and vectors')

# SETs
m.nodes = pyo.Set(initialize=some_vectors.keys())
m.elements = pyo.Set(initialize=list(range(longest_vec_length)))

# this is an "indexed set" where the members are indexed by another set..
def vec_init(m, node):
    return list(range(len(some_vectors[node])))
m.vecs = pyo.Set(m.nodes, within=m.elements, initialize=vec_init)

m.vecs_flat = pyo.Set(within=m.nodes*m.elements, 
    initialize=[(n, e) for n in m.nodes for e in m.vecs[n]])

# PARAMs
def data_init(m, node, element):
    return some_vectors[node][element]
m.data = pyo.Param(m.vecs_flat, initialize=data_init)


m.pprint()

。 :

5 Set Declarations
    elements : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    4 : {0, 1, 2, 3}
    nodes : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    3 : {'SF', 'LA', 'NY'}
    vecs : Size=3, Index=nodes, Ordered=Insertion
        Key : Dimen : Domain   : Size : Members
         LA :     1 : elements :    2 : {0, 1}
         NY :     1 : elements :    1 : {0,}
         SF :     1 : elements :    4 : {0, 1, 2, 3}
    vecs_flat : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain           : Size : Members
        None :     2 : vecs_flat_domain :    7 : {('SF', 0), ('SF', 1), ('SF', 2), ('SF', 3), ('LA', 0), ('LA', 1), ('NY', 0)}
    vecs_flat_domain : Size=1, Index=None, Ordered=True
        Key  : Dimen : Domain         : Size : Members
        None :     2 : nodes*elements :   12 : {('SF', 0), ('SF', 1), ('SF', 2), ('SF', 3), ('LA', 0), ('LA', 1), ('LA', 2), ('LA', 3), ('NY', 0), ('NY', 1), ('NY', 2), ('NY', 3)}

1 Param Declarations
    data : Size=7, Index=vecs_flat, Domain=Any, Default=None, Mutable=False
        Key       : Value
        ('LA', 0) :     6
        ('LA', 1) :     0
        ('NY', 0) :     8
        ('SF', 0) :     4
        ('SF', 1) :     5
        ('SF', 2) :     9
        ('SF', 3) :    22

6 Declarations: nodes elements vecs vecs_flat_domain vecs_flat data

Some variation of the below is probably what you are looking for. It isn't too clear from your post what you want to do with the parameter of integers? I'm assuming you have (a) a list of nodes, (b) some arbitrary length vector of data with each node, and (c) some indexing system (integers) to get at the data.

The piece that I think you are missing is an indexed set which is a construct to use 1 set (nodes in this case) as an index to a "set of sets". This is more clear in the printout of vecs below. Of course, you then need an index into the inner set, in this case I used a set of integers sufficiently long to index any of the internal sets.

Lastly, I'm not sure of a better way to use that combination of things to hold data (parameter) other than how I do it below, which is to "flatten out" the membership from the indexed set, and use that to hold the parameters. Note this has the advantage of being a sparse set, less than the size of the full x-product of nodes x elements, but you must use the appropriate set (vecs_flat) when doing summations, etc.

import pyomo.environ as pyo


some_vectors = {
    'SF': [4, 5, 9, 22],
    'LA': [6, 0],
    'NY': [8,]
}

longest_vec_length = max({len(value) for value in some_vectors.values()})


# make model
m = pyo.ConcreteModel('nodes and vectors')

# SETs
m.nodes = pyo.Set(initialize=some_vectors.keys())
m.elements = pyo.Set(initialize=list(range(longest_vec_length)))

# this is an "indexed set" where the members are indexed by another set..
def vec_init(m, node):
    return list(range(len(some_vectors[node])))
m.vecs = pyo.Set(m.nodes, within=m.elements, initialize=vec_init)

m.vecs_flat = pyo.Set(within=m.nodes*m.elements, 
    initialize=[(n, e) for n in m.nodes for e in m.vecs[n]])

# PARAMs
def data_init(m, node, element):
    return some_vectors[node][element]
m.data = pyo.Param(m.vecs_flat, initialize=data_init)


m.pprint()

Yields:

5 Set Declarations
    elements : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    4 : {0, 1, 2, 3}
    nodes : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain : Size : Members
        None :     1 :    Any :    3 : {'SF', 'LA', 'NY'}
    vecs : Size=3, Index=nodes, Ordered=Insertion
        Key : Dimen : Domain   : Size : Members
         LA :     1 : elements :    2 : {0, 1}
         NY :     1 : elements :    1 : {0,}
         SF :     1 : elements :    4 : {0, 1, 2, 3}
    vecs_flat : Size=1, Index=None, Ordered=Insertion
        Key  : Dimen : Domain           : Size : Members
        None :     2 : vecs_flat_domain :    7 : {('SF', 0), ('SF', 1), ('SF', 2), ('SF', 3), ('LA', 0), ('LA', 1), ('NY', 0)}
    vecs_flat_domain : Size=1, Index=None, Ordered=True
        Key  : Dimen : Domain         : Size : Members
        None :     2 : nodes*elements :   12 : {('SF', 0), ('SF', 1), ('SF', 2), ('SF', 3), ('LA', 0), ('LA', 1), ('LA', 2), ('LA', 3), ('NY', 0), ('NY', 1), ('NY', 2), ('NY', 3)}

1 Param Declarations
    data : Size=7, Index=vecs_flat, Domain=Any, Default=None, Mutable=False
        Key       : Value
        ('LA', 0) :     6
        ('LA', 1) :     0
        ('NY', 0) :     8
        ('SF', 0) :     4
        ('SF', 1) :     5
        ('SF', 2) :     9
        ('SF', 3) :    22

6 Declarations: nodes elements vecs vecs_flat_domain vecs_flat data
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文