2

我正在使用 PuLP 和 Python 进行一些优化,因为我的数据很大,所以我决定尝试多线程,因为我的问题很大,即选择

但是,在测试主要问题的一小部分(10k 而不是 1M 人)时,我无法让多线程实际使用多个线程。

我按照说明使用Coin-OR 网站上描述../configure --enable-cbc-parallel的标志从源代码构建求解器;一切都很好,所有的测试都通过了。我检查了 CBC 配置登录,它在第 845 行有消息,所以它肯定可以工作。build/Cbc/config.logconfigure:30105: Cbc multithreading enabled

系统:

  • Mac OS X 10.14.3
  • i7-4870HQ 四核
  • Python 3.6.7 w/Anaconda
  • 在 Jupyter 和从命令行在 Python 解释器中运行时都会出现问题

代码,类似于此处的示例

start = time.time()
solver = solvers.COIN_CMD(~/Cbc-2.9/build/Cbc/src/cbc',threads=8,msg=1,fracGap = 0.01)
prob.solve(solver)
print('time to solve:',time.time()-start,'seconds')

>> time to solve: 24.815305948257446 seconds

如果我指定了多线程求解器或者我只使用了默认求解器,那么那个时间大致相同。

在运行时的 CBC 消息中有一行:

threads was changed from 0 to 8

还有以下几行:

Cbc0012I Integer solution of -25507 found by DiveCoefficient after 0 iterations and 0 nodes (18.04 seconds)
Cbc0030I Thread 0 used 0 times,  waiting to start 0.291008, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 1 used 0 times,  waiting to start 0.24997687, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 2 used 0 times,  waiting to start 0.21034408, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 3 used 0 times,  waiting to start 0.17122722, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 4 used 0 times,  waiting to start 0.13530493, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 5 used 0 times,  waiting to start 0.098966837, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 6 used 0 times,  waiting to start 0.062871933, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 7 used 0 times,  waiting to start 0.028151035, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Main thread 0 waiting for threads,  1 locks, 0.00077700615 locked, 9.5367432e-07 waiting for locks
Cbc0001I Search completed - best objective -25507, took 0 iterations and 0 nodes (18.29 seconds)

这意味着所有线程都已创建但未使用?

我想到但不知道如何解决的一种解决方案:也许我的求解器路径是错误的,即 COIN_CMD 求解器不应该被定向到.../cbc其他东西。我还没有找到任何东西。

那么我做错了什么?我找不到有关如何使用线程的任何其他文档。希望这是一个简单的解决方案的愚蠢问题。谢谢你的帮助。

4

1 回答 1

3

看起来所有的工作都是在预处理过程中完成的。并行线程仅在预处理后的分支定界阶段启动。尝试一个模型或数据集,其中 CBC 必须进行一些真正的分支。即节点数量很大的地方。对于大多数较大的 MIP 模型,CBC 将需要探索大量节点。在这种情况下,并行线程可以有所作为。但在某些情况下,它也可能导致性能下降(参见链接)。

于 2019-02-18T00:09:00.937 回答