如何使用 Python 向 CPLEX 中的 OPL 模型提供输入,然后在 Python 中打印 OPL 模型的解决方案

问题描述 投票:0回答:1

我们有五个场景,每个场景都有一组不同的损坏节点。我们希望一次一个场景地将一组损坏线路输入到 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 中。

python optimization cplex opl
1个回答
0
投票

使用 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")
© www.soinside.com 2019 - 2024. All rights reserved.