我目前正在构建优化模型,并且有一个关于设置预定义/固定参数值的问题。
我的参数由两个不同的预定义集 G & T 索引,如下所示: '''model.q=param(G,T)'''
我的问题与以下内容有关:
我想将此参数的某些索引值设置为预定义值,并让其他值自由以确定问题: 例如 q[1,"A"]=50 或 q[2,"B"]=80 但不是全部。
为此,我为特定的 G 和 T 值创建了一个形式为 {(G,T) : x } 的适当字典,但是当我尝试使用此字典初始化参数时,出现错误:某些索引缺少参数值,这是正确的,因为字典引用了特定值。
是否有其他方法可以解决上述问题?
如果我使用特定索引的字典的特定值对优化模型中的参数设置约束,以便模型可以自由决定参数的所有其他索引值,这会起作用吗?
P.S.:我知道我没有附加任何代码,但即使特定的 block 也太大而无法附加,我希望我的写作有足够的解释性!
提前谢谢您!
最佳答案
有多种方法可以做到这一点。首先,词汇......如果“项目”在求解过程中可以改变,那么它就是一个变量。 参数是模型中的固定常量。所以,如果我理解正确的话,你有一个索引变量,你想分配值并将它们锁定。你可以设置值,然后单独将锁设置为 True ,或者使用 fix()
“一体化”。在下面的模型中,x['A']
和x['C']
是固定的,其他值可能会 float :
import pyomo.environ as pyo
locks = {"A": 12, "C": 14}
m = pyo.ConcreteModel()
m.S = pyo.Set(initialize=list('ABCD'))
m.x = pyo.Var(m.S, domain=pyo.NonNegativeReals)
# set and lock the vars...
for idx in locks.keys():
m.x[idx].fix(locks[idx])
m.pprint()
输出:
1 Set Declarations
S : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 4 : {'A', 'B', 'C', 'D'}
1 Var Declarations
x : Size=4, Index=S
Key : Lower : Value : Upper : Fixed : Stale : Domain
A : 0 : 12 : None : True : False : NonNegativeReals
B : 0 : None : None : False : True : NonNegativeReals
C : 0 : 14 : None : True : False : NonNegativeReals
D : 0 : None : None : False : True : NonNegativeReals
2 Declarations: S x
这有一些重复的信息:How can I set a value of an indexed variable? - Pyomo
关于python - 如何仅为某些索引设置 Pyomo 索引变量的值并让其他索引自由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76157400/