使用ORTools实现自定义酸洗代码

时间:2018-06-05 09:20:20

标签: python-3.x multiprocessing or-tools

我正在使用多处理,我知道pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议。

而且我也知道哪些类型的数据可以被腌制,比如整数,列表,集合...... ....

但是如果我想使用其他不是pick_able的数据,我该怎么办?

更确切地说,我想使用多处理在ORTools中并行创建约束。打击是我的代码:

manager = Manager()
constraints = manager.list(range(16))

def constraint_saz():
    "constraint's condition"

# Create the constraints        
for i in range(len(data)):
    constraints[i] = solver.Constraint(1,1)
    p = Process(target=constraint_saz, args=(constraints,i))
    p.start()
    p.join()    

但我收到了这个错误:

TypeError: can't pickle SwigPyObject objects

我应该怎样做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

我不认为这是可行的,因为python只是C ++对象的轻包装。 现在,线性求解器和CP-SAT求解器支持将模型存储在protobuf对象中,该对象可以序列化。

这确实引起了一些问题,因为在创建模型时,您会创建链接到模型的变量。序列化后,您将没有这些变量。因此,查询solve()的解决方案很复杂。