我编写了一个遗传算法,为了优化其性能,我决定并行化个体的适应度测试。为了看看这对我的算法产生了什么样的变化,我重新进行了并行化之前所做的测试运行,测试了 GA 对于不断增长的群体规模的性能。
并行版本的 GA 实际上比原始版本花费了大约 50% 的时间。我意识到有时并行化的开销实际上可能比它节省的时间更多,但我怀疑这是否应该适用于这种情况 - 我的适应性测试正在寻找 Sheckel 的 Foxholes 函数的全局最小值( http://extreme.adorio-research.org/download/mvf/html/node51.html ),并且我的人口规模从 10 到 1000 不等。我预计,在并行执行 1000 次 sheckel 散兵坑时,节省的时间将大大超过并行化的开销。
所以我的问题是:为什么并行化会减慢算法的速度(而且如此显着)?
郑重声明,我使用 Java 进行编码,并使用 CountDownLatch 进行并行化,该 CountDownLatch 等待所有线程(适应性测试)执行后再继续。
最佳答案
根据您的评论,除了线程数量之外,您似乎做得相当合理。但你提到你正在使用 CountDownLatch 让我思考......
我强烈建议您使用 ExecutorService/Executors 来代替您自己的代码来进行并行化。让您的类成为Callable
,创建一堆它们,然后调用invokeAll()。这样,训练有素的(不确定他们是否高薪)专家完成了大部分编码工作。
使用Executors
,可以很简单地控制最大线程数。您可以调用 Runtime.availableProcessors() 来初步了解一次运行的线程数,然后进行一些测试和调整。
编辑:刚刚发布了introduction to converting an algorithm to use ExecutorService.享受,欢迎评论/反馈。
关于java - 遗传算法的并行化显着减慢了算法速度。为什么会这样呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11039862/