¿Cómo crear un Param con tamaño variable en Pyomo?
Soy nuevo en Pyomo y hay una matriz similar a un array de NumPy np.array([[1,2,3,4],[5,6,7,8]...])
que representa las trayectorias predichas (posición) de los vehículos circundantes, y la primera dimensión representa el número de vehículos circundantes, la segunda dimensión representa el horizonte predicho.
Como uso Pyomo para calcular la acción del vehículo ego en cada paso de tiempo, y el número de vehículos circundantes cambia en cada paso de tiempo, la forma de la primera dimensión de la matriz siempre está cambiando, y estas trayectorias predichas se utilizan para calcular la función objetivo, como obj = Σx
, donde x
representa la trayectoria predicha, el número de vehículos circundantes determina el número de elementos. Por ejemplo, ahora hay 2 vehículos circundantes, obj = x0+x1
, en el siguiente paso de tiempo, hay 3 vehículos circundantes, por lo que obj = x0+x1+x2
. Así que me pregunto cómo crear un Param con RangeSet modificable y colocar la matriz de NumPy de 2 dimensiones modificable en el Param, o si hay algún otro método para combinar la función objetivo con la entrada cambiante.
Mi idea es la siguiente:
m = ConcreteModel()
m.num = Param(RangeSet(0,0),default= 0, mutable=True)
m.x = Param(RangeSet(0,value(m.num[0])-1),RangeSet(0,3), mutable=True)
x0 = np.array([[1,2,3,4],[5,6,7,8]])
m.num.reconstruct({0:x0.shape[0]})
m.x.reconstruct()
m.pprint()
pero la forma de m.x
no cambia:
1 Set Declarations
x_index : Size=1, Index=None, Ordered=True
Key : Dimen : Domain : Size : Members
None : 2 : x_index_0*x_index_1 : 0 : {}
3 RangeSet Declarations
num_index : Dimen=1, Size=1, Bounds=(0, 0)
Key : Finite : Members
None : True : [0]
x_index_0 : Dimen=1, Size=0, Bounds=(None, None)
Key : Finite : Members
None : True : []
x_index_1 : Dimen=1, Size=4, Bounds=(0, 3)
Key : Finite : Members
None : True : [0:3]
2 Param Declarations
num : Size=1, Index=num_index, Domain=Any, Default=0, Mutable=True
Key : Value
0 : 2
x : Size=0, Index=x_index, Domain=Any, Default=None, Mutable=True
Key : Value
6 Declarations: num_index num x_index_0 x_index_1 x_index x
Tal vez mi método está bastante equivocado, agradezco sinceramente cualquier ayuda.
davy.ai
Para lograr la funcionalidad deseada de cambiar la forma de un
Param
de Pyomo con unRangeSet
indexado por el número de vehículos circundantes, puedes utilizar el siguiente enfoque:En este enfoque, el parámetro
x
se crea con unRangeSet
que depende del número de vehículos circundantes. Además, se define una funciónreconstruct_params
que actualiza la forma y los valores del parámetrox
cada vez que cambia el número de vehículos circundantes. Para actualizar el parámetrox
, los datos se remodelan como un arreglo de 2 dimensiones y luego se aplana a un arreglo de 1 dimensión, que luego se redimensiona según el nuevo número de vehículos circundantes y la forma original. Finalmente, se utiliza el métodoreconstruct
para actualizar los valores del parámetro indexados por las nuevas claves deRangeSet
.Para utilizar el parámetro
x
en una función objetivo, puedes definir la función objetivo como una función de Python que tome el parámetrox
y el número de vehículos circundantes como argumentos, y devuelve una expresión de Pyomo. Por ejemplo:De esta manera, puedes actualizar dinámicamente la forma y los valores del parámetro
x
y utilizarlo en una función objetivo que depende del número de vehículos circundantes.