我正在使用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
,因此它肯定可以工作。
系统:
代码,类似于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消息中是以下行:
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
,而应定向到其他目标。我还没找到任何东西。
那我做错了什么?我找不到其他有关如何使用线程的文档。希望这是一个愚蠢的问题,并且有一个简单的解决方案。感谢您的帮助。
答案 0 :(得分:2)
看起来所有工作都是在预处理过程中完成的。并行线程仅在预处理之后的分支定界阶段才起作用。尝试模型或数据集,其中CBC必须做一些实际的分支。即节点数很大的地方。对于大多数大型MIP模型,CBC将需要探索大量节点。在这种情况下,并行线程可能会有所作为。但在某些情况下,它也可能导致性能下降(请参见link)。