Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Python射线与CPLEX模型对象结合使用_Python_Cplex_Ray_Docplex - Fatal编程技术网

将Python射线与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

我正在尝试并行化与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)
将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.add_constraints()一次性添加约束,这应该比一次添加一个约束更有效
  • 使用Model.dotf()(函数式标量积)进行实验。它避免了构建辅助列表,而是传递键的函数,返回系数。 此方法在Docplex 2.12版中是新的。 例如,假设一个包含3个变量的列表:
  • abc=m.integer\u var\u list(3,name=[“a”,“b”,“c”])m.dotf(abc,lambda k:k+2)

    docplex.mp.LinearExpression(a+2b+3c)


    Model.dotf()通常比Model.dot()快。

    我知道主要问题是模块构建的性能。 根据您发送的代码,我有两个建议来解决此问题:

  • 成批发布约束,即将约束存储在列表中,并使用Model.add_constraints()一次性添加约束,这应该比一次添加一个约束更有效
  • 使用Model.dotf()(函数式标量积)进行实验。它避免了构建辅助列表,而是传递键的函数,返回系数。 此方法在Docplex 2.12版中是新的。 例如,假设一个包含3个变量的列表:
  • abc=m.integer\u var\u list(3,name=[“a”,“b”,“c”])m.dotf(abc,lambda k:k+2)

    docplex.mp.LinearExpression(a+2b+3c)


    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个线程在共享对象上运行时,该命令将发挥作用。最后一个建议很好。我将尽快尝试。