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

Posted

技术标签:

【中文标题】使用 ORTools 实现自定义酸洗代码【英文标题】:implement custom pickling code in using ORTools 【发布时间】:2018-06-05 09:20:20 【问题描述】:

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

而且我还知道可以腌制哪些类型的数据,例如 Integer、List、Set 和 ....

但是如果我想使用其他数据,而不是 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】:

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

这确实会引发一些问题,因为当您创建模型时,您会创建链接到模型的变量。序列化后,您没有这些变量可用。所以查询solve()的解很复杂。

【讨论】:

以上是关于使用 ORTools 实现自定义酸洗代码的主要内容,如果未能解决你的问题,请参考以下文章

自定义 scikit-learn 酸洗在网格搜索中不起作用

使用VBA代码实现简单自定义函数

自定义控件(倒计时篇)

自定义控件(倒计时篇)

微信小程序自定义tabBar(实操)

VBA代码实现自定义函数2