【发布时间】:2021-07-15 00:02:44
【问题描述】:
我正在使用 PySP (Pyomo) 解决一个随机优化问题。我为我的问题创建了一个具体的模型,并根据
中给出的农民示例定义了场景https://github.com/Pyomo/pysp/blob/main/examples/farmer/concrete/ReferenceModel.py
在上面的示例中,每个场景都调用了一个pysp_instance_creation_callback() 函数。在该函数中,为每个场景克隆了一个模型实例,以便使用 instance.Yield.store_values(Yield[scenario_name]) 为每个场景更新场景变量(在本例中为 Yield)。
我对我的问题采用了类似的方法。然而,在我的例子中,对于每个场景,未知数的大小都不同,不像农民的例子,场景只适用于三种作物(小麦、糖、玉米)。例如,我的场景应该是这样的,
Scenario1 = {123, 124, 118}
Scenario2 = {117, 10}
Scenario3 = {118, 120, 125, 126}
Scenario4 = {0, 125}
...
我的代码 sn-p 类似于下面的代码(为简单起见,我只提到了有用的约束和变量)
# Variable:
model.nEdges = 129
model.x_ij = range(0, model.nEdges) # line switching variable range
model.xij = Var(model.x_ij, bounds=(0, 1), within=Binary)
# Scenario parameter:
model.Fault = Param(mutable=True, initialize={123,124,118}, within=Any)
# Constraint:
for key, ite in model.Fault.items():
for faulty in ite.value:
model.c.add(model.xij[faulty] == 0)
# Scenarios:
Fault = {}
Fault['Scenario1'] = {123, 124, 118}
Fault['Scenario2'] = {120, 124, 118}
Fault['Scenario3'] = {1, 125}
# callback function to update the model parameter
def pysp_instance_creation_callback(scenario_name, node_names):
instance = model.clone()
instance.Fault.store_values(Fault[scenario_name])
return instance
但是,这种方法对我不起作用。对于每个场景,model.Fault 的值在初始化时保持不变,即 {123,124,118}。虽然如果我检查每个场景的实例值,即instance.Fault.value,那么看起来这些值正在更新(instance.Fault.value 给出与不同场景一致的不同值)但是在检查实际模型的输出 lp 文件时,约束不会按需要更新,并且最终解决方案对于前面提到的每个场景都是相同的。我不知道如何解决这个问题,而且我已经陷入这个问题好几天了。有人可以帮我吗?
【问题讨论】:
标签: python optimization pyomo