纸浆CBC多线程不能与COIN_CMD一起工作

2024-10-02 08:24:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用PuLP和Python进行一些优化,由于我的数据太大,我决定尝试多线程,因为我的问题相当大,即选择

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

我跟随the instructions使用../configure --enable-cbc-parallel标志as described on Coin-OR website从源代码构建解算器;一切工作顺利,所有测试都通过了。我检查了build/Cbc/config.log中的CBC配置日志,它在第845行中有消息configure:30105: Cbc multithreading enabled,因此它肯定可以工作。在

系统:

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

代码,类似于from example here

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消息中有一行:

^{pr2}$

还有台词:

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而是指向其他东西。我在那上面找不到任何东西。在

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


Tags: tofortimecputhreadstartused算器
1条回答
网友
1楼 · 发布于 2024-10-02 08:24:10

看来所有的工作都是在预处理期间完成的。并行线程只在预处理后的分支绑定阶段起作用。尝试一个模型或数据集,其中CBC必须进行一些实际的分支。一、 e.节点数量显著时。对于大多数更大的MIP模型,CBC将需要探索大量的节点。在这种情况下,平行线程可以发挥作用。但在某些情况下,它也可能导致性能下降(参见link)。在

相关问题 更多 >

    热门问题