我们有五个场景,每个场景都有一组不同的损坏节点。我们希望一次一个场景地将一组损坏线路输入到 OPL 模型中,并将每个场景的结果存储在 Python 中。我们将对其他场景重复此过程,将每个解决方案存储在 Python 中。
向 OPL 模型提供输入(一个场景的损坏节点集)并打印结果的 Python 代码--
from doopl.factory import create_opl_model
Damage_Nodes = [
(1, {8, 9, 12, 16, 19, 23, 24, 27, 30}),
]
model_path = "C:/Users/VGFD/opl/MEG_Case3/MEG_Case3.mod"
with create_opl_model(model=model_path) as opl:
opl.set_input("damage_Nodes", Damage_Nodes)
opl.run()
decision_vars = opl.get_decision_variables()
for var in decision_vars:
print(f"{var} = {decision_vars[var]}")
objective_value = opl.get_objective_value()
print("Objective value:", objective_value)`
下面提供了 OPL 模型从 Python 接收输入的代码。
tuple damage_Node {
int scenario;
{int} value;
}
{damage_Node} damage_Nodes = ...;
我想检索损坏的节点集并在约束内使用它。
forall (rc in Repaircrew){
forall (n in damage_Nodes){
forall (s in Slot:s<=N_T-1){
StatusLine[rc][n][s]<= StatusLine[rc][n][s+1];
}
}
}
错误 - Windows 致命异常:访问冲突
我想在 python 中针对不同的场景运行这个 OPL 模型。不同的场景代表 OPL 模型的不同输入(损坏节点集)。然后将每个场景的解决方案存储在 python 中。
使用 doopl,可以在 https://pypi.org/project/doopl/
阅读使用 doopl,“输入可以是元组列表、panda 的数据框、sql alchemy fetch 语句。”
所以我要么改变
Damage_Nodes = [
(1, {8, 9, 12, 16, 19, 23, 24, 27, 30}),
]
进入
Damage_Nodes = [
(1, 8), (1,9),(1,12),(1,16),(1,19),(1,23),(1,24),(1,27),(1,30),
]
并在 OPL 模型中进行转换或
从 python 编写一个 .dat 文件,如下所示
damage_Nodes = {<1,{8, 9, 12, 16, 19, 23, 24, 27, 30};
然后像示例中那样依赖该 dat 文件 https://github.com/IBMDecisionOptimization/doopl-examples/blob/master/examples/Mulprod.py
import os
from os.path import dirname, abspath, join
DATADIR = join(dirname(abspath(__file__)), 'data')
mod = join(DATADIR, "mulprod.mod")
dat = join(DATADIR, "mulprod.dat")