我试图并行化与计算成本高昂的 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 返回对远程值的引用,所以是的,不确定那里会发生什么。

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

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

#1楼 票数:0

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

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

#2楼 票数:0

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

  1. 批量发布约束,即将约束存储在列表中并使用 Model.add_constraints() 添加一次,这应该比一次添加一个更有效。
  2. 试验 Model.dotf()(函数式标量积)。 它避免构建辅助列表,而是传递 key 的函数,返回系数。 此方法是 Docplex 2.12 版中的新方法。 例如,假设一个包含 3 个变量的列表:

abc = m.integer_var_list(3, name=["a", "b", "c"]) m.dotf(abc, lambda k: k+2)

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

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

  ask by Sledge translate from so

未解决问题?本站智能推荐:

1回复

使用 Cplex 进行 LP 松弛 (Python)

我正在 python 上开发一个带有 docplex 的 lp 模型,我需要获取宽松的解变量,但不知道如何要求 python 给我模型的宽松解变量。 我可以将它们视为输出,但是当我打印它时,它只会改变变量的非松弛值。 所以,问题是我该如何解决, 最好的祝福,
1回复

将 CPLEX 数学模型从 C++ 转移到 Python

我已经使用 CPLEX 在 C++ 中编写了我的数学模型,现在我想使用 docplex.mp.model 将其传输到 Python 我在添加约束时遇到了一些问题。 在C++中,我习惯添加这样的约束 我在 python 中编写这段代码是这样的: 这是正确的吗? 谢谢 :)
1回复

Python + CPLEX:没有名为“docplex”的模块

安装 matplotlib 和 seaborn 后,我遇到以下问题: 我的环境已经安装了 docplex 和 docloud ,但我只使用本地版本。Conda 列表输出: 我安装的程序: cplex_studio1210.win-x86-64 Anaconda3-2019.1
1回复

如何在解决方案生成期间更改 Cplex 模型?

我有一个带有多个约束和解决方案池的 Cplex 模型。 我的约束之一是: SetAlt 是一组 2 个值,将在进行约束之前从 R_alt 中删除。 我需要 cplex 为每个解决方案随机选取这 2 个值。 换句话说,我需要 cplex 在解决方案池生成期间更改此约束上的模型。 例如,如果我在
1回复

我的 cplex 脚本不能在没有错误的情况下在 python 上运行

我已经在我的 PC 上使用 Cplex 和 docplex(在 python 上)很长时间了,它运行良好。 但是最近,当我运行我的脚本时,它会启动引擎,但它会在开始时停留很长时间(可能是 24 小时),然后它在没有解决方案也没有错误的情况下终止了进程。 当我使用 conflict_refiner 发
2回复

如何将您已安装的 CPLex 学术计划与 python 连接起来?

我在带有 Anaconda 的 MAC 中使用 python 3.6 版本和 CPLEX 12.10。 如何访问 python 的 cplex 库? 我的 MAC 中安装了学术版,可以在 GUI 中独立使用。
1回复

为什么Cplex和PythonDocplex的结果不同

我的Cplex和PythonDocplex的结果不一样,感觉很迷茫,不知道为什么。 下面是我的代码,因为有数据所以很长,数据是一样的,约束是一一对应的,可以直接运行。 因为我不能详细提交,所以我会补充一些无用的词。请理解。谢谢。 Python文档: 复杂: 模式: 日期:
1回复

Cplex(Python),model.solution提供的结果与model.print_solution()不同是正常的吗?

使用docplex解决优化问题后,实际上在访问解决方案时遇到问题。 在下面,我将发布我正在使用的完整代码,只要得到的结果即可(对结果进行注释): 优化问题是在这个岗位充分说明优化问题 所以我有两个问题: 我不明白为什么函数mdl.print_solution()与在