Правильный способ определения матрицы с использованием множеств Пиомо - PullRequest
0 голосов
/ 11 февраля 2020

Мне была дана оптимистическая модель c, которая была преобразована в стохастическую c модель с использованием стохастических c методов колокейшн.

Однако у меня возникли проблемы с сохранением выходных данных , Я определил количество стохастических c узлов (количество значений переменных состояния)

m.particle_number = Param(initialize = count)
m.K = Set(initialize = range(1,value(m.particle_number)+1))  

После этого модель определяет серию списков длины mn, количество точек, в которых модель оценивается. Вот пример.

position_phi     = list(range(0,value(m.n)+1))

Мне нужно превратить эти одномерные списки в m.K измерения. Я попытался написать

position_phi     = list(range(0,value(m.n)+1), range(0,value(m.K)+1))

вместо этого. Однако я получаю следующую ошибку:

TypeError: Невозможно оценить объект с неизвестным типом: SimpleSet

Может кто-нибудь объяснить мне, почему я не могу построить матрицу размер мн * мк?

1 Ответ

1 голос
/ 12 февраля 2020

Мне не совсем понятно, что пытается сделать ваша модель, но вы можете создать перекрестное произведение двух наборов в Pyomo, умножив их на два.

import pyomo.environ as pe
m = pe.ConcreteModel()
m.K = pe.Set(initialize=[1, 2, 3])
m.n = pe.Set(initialize=[4, 5, 6, 7])
m.position_phi = m.K * m.n

Это сделает элементы m.position_phi be [(1, 4), (1, 5), ...]

Затем вы можете использовать этот набор следующим образом:

m.whatever = pe.Param(m.position_phi, intitialize={(1, 4):4, (3, 6):6}, default=0)

И затем при вызове m.pprint() вы увидите что-то вроде этого:

3 Set Declarations
    K : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=(1, 3)
        [1, 2, 3]
    n : Dim=0, Dimen=1, Size=4, Domain=None, Ordered=False, Bounds=(4, 7)
        [4, 5, 6, 7]
    position_phi : Dim=0, Dimen=2, Size=12, Domain=None, Ordered=False, Bounds=None
        Virtual

1 Param Declarations
    whatever : Size=12, Index=position_phi, Domain=Any, Default=0, Mutable=False
        Key    : Value
        (1, 4) :     4
        (3, 6) :     6

4 Declarations: K n position_phi whatever

Кроме того, вызов list() с более чем 1 аргументом в Python должен вызывать ошибку TypeError.

...