将Python射线与CPLEX模型对象结合使用
我正在尝试并行化与Python对象的交互,这在计算上非常昂贵。我想用Ray来做这件事,但到目前为止我的努力都失败了 该对象是一个CPLEX模型对象,我试图为一系列条件添加一组约束 以下是我的设置:将Python射线与CPLEX模型对象结合使用,python,cplex,ray,docplex,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.argwher
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)
将numpy导入为np
将docplex.mp.model导入为cpx
导入光线
m=cpx.Model(name=“mymodel”)
def遮罩阵列(arr,遮罩值):
数组掩码=np.argwhere(arr==mask\u val)
arg_slice=[i[0]表示数组中的i_掩码]
返回arg_切片
周=[1,3,7,8,9]
常数=1.5
r=rate=np.array(df['r'].tolist(),dtype=np.float)
x1=m.整数变量列表(数据索引,lb=下限,ub=上限)
x2=m点(x1,r)
@雷,遥控器
def add_model_约束(m、x2、x2sum、const):
m、 添加_约束(x2sum模型
对象不是为并行使用而设计的。您不能同时从多个线程添加约束。这将导致未定义的行为。您必须至少锁定以确保一次只有线程添加约束
请注意,并行模型构建可能根本不是一个好主意:约束的顺序或多或少是随机的。另一方面,解算器的行为可能取决于约束的顺序(这称为性能可变性)。因此,您可能很难复制某些结果/行为。模型对象不是为并行使用而设计的。您不能同时添加来自多个线程的约束。这将导致未定义的行为。您必须至少锁定以确保一次只有线程添加约束
请注意,并行模型构建可能根本不是一个好主意:约束的顺序或多或少是随机的。另一方面,解算器的行为可能取决于约束的顺序(这称为性能可变性)。因此,您可能很难再现某些结果/行为。我知道主要问题是模块构建的性能。 根据您发送的代码,我有两个建议来解决此问题:
Model.dotf()通常比Model.dot()快。我知道主要问题是模块构建的性能。 根据您发送的代码,我有两个建议来解决此问题:
Model.dotf()通常比Model.dot()快。我以前从未听说过或使用过
ray
,但您的代码片段似乎不完整。首先,没有import ray
。其次,根据快速入门文档,您不需要ray.get()吗
call?最后,我想知道是否有一种方法可以让您并行地创建约束表达式,然后只调用m.add_constraints
一次(一批)?我刚刚更新了代码片段,以包含import ray
语句。我不确定ray.get()如何
命令在有N个线程在共享对象上运行时起作用。最后一个建议很好。我会尽快尝试。我以前从未听说过或使用过ray
,但您的代码片段似乎不完整。首先,没有导入ray
。其次,根据快速入门文档,不要您需要一个ray.get()
调用吗?最后,我想知道是否有一种方法可以让您并行创建约束表达式,然后只调用m.add_constraints
一次(一批)?我刚刚更新了代码片段以包含import ray
语句。我不确定ray.get()是如何实现的
当您有N个线程在共享对象上运行时,该命令将发挥作用。最后一个建议很好。我将尽快尝试。