python - 将 Python Ray 与 CPLEX 模型对象结合使用

标签 python cplex ray docplex

我正在尝试并行化与计算成本高昂的 Python 对象的交互。我想使用 Ray 来做到这一点,但到目前为止我的最大努力都失败了。

该对象是 CPLEX 模型对象,我正在尝试为条件列表添加一组约束。

这是我的设置:

import numpy as np
import docplex.mp.model as cpx
import ray

m = cpx.Model(name="mymodel")

def mask_array(arr, mask_val):
    array_mask = np.argwhere(arr == mask_val)
    arg_slice = [i[0] for i in array_mask]
    return arg_slice

weeks = [1,3,7,8,9]
const = 1.5
r = rate = np.array(df['r'].tolist(), dtype=np.float)
x1 = m.integer_var_list(data_indices, lb=lower_bound, ub=upper_bound)
x2 = m.dot(x1, r)

@ray.remote
def add_model_constraint(m, x2, x2sum, const):
    m.add_constraint(x2sum <= x2*const)
    return m

x2sums = []
for w in weeks:
    arg_slice = mask_array(x2, w)
    x2sum = m.dot([x2[i] for i in arg_slice], r[arg_slice])
    x2sums.append(x2sum)

#: this is the expensive part 
for x2sum in x2sums:
    add_model_constraint.remote(m, x2, x2sum, const)

简而言之,我正在做的是创建一个模型对象和一些变量,然后循环几周以构建约束。我对变量进行子集化,计算一些点积并应用约束。我希望能够并行创建约束,因为这需要一段时间,但到目前为止我的代码只是挂起,我不确定为什么。

我不知道是否应该在函数中返回模型对象,因为默认情况下 m.add_constraint 方法会就地修改对象。但同时我知道 Ray 返回对远程值的引用,所以是的,不确定那里会发生什么。

这是射线的有效使用吗?期望能够以这种方式修改 CPLEX 对象(或任何其他任意 python 对象)是否合理?

我是 Ray 新手,所以我的结构可能完全错误,或者这可能永远不会适用于 X、Y 和 Z 原因,这也很高兴知道。

最佳答案

Model 对象并非设计用于并行使用。您不能同时从多个线程添加约束。这将导致未定义的行为。您至少需要一个锁来确保一次只有线程添加约束。

请注意,并行模型构建可能根本不是一个好主意:约束的顺序或多或少是随机的。另一方面,求解器的行为可能取决于约束的顺序(这称为性能可变性)。因此,您可能很难重现某些结果/行为。

关于python - 将 Python Ray 与 CPLEX 模型对象结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58000663/

相关文章:

Python:将 numpy.array 附加到列表 python 会覆盖前面的元素

tensorflow2.0 - Ray Tensorflow-gpu 2.0 递归错误

numpy - RAY Python 框架内存不足

python - Ray actor 的一个实例只在一个进程中运行吗?

python - 如何将二进制代码解码为文本?

python - 链接多个combine_first()

java - 无法将模型从 MPS 文件导入到 IloCplex - IBM ILOG CPLEX - Java - Intellij

c++ - 为什么 Cplex 提供了一个松弛约束的解决方案?

python - 使用 python 创建 csv 文件并将其上传到 azure blob 存储

c++ - 我正在寻找一种在从模型中删除并重新添加修改后的对象后操作 iloextractable 对象的方法