java - 遗传算法的并行化显着减慢了算法速度。为什么会这样呢?

标签 java performance parallel-processing genetic-algorithm

我编写了一个遗传算法,为了优化其性能,我决定并行化个体的适应度测试。为了看看这对我的算法产生了什么样的变化,我重新进行了并行化之前所做的测试运行,测试了 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/

相关文章:

Java 对象类 MYSTERY

.net - 如何分析 .NET 应用程序的网络利用率

javascript - 并行执行中两个实例之间的 Protractor 延迟

c++ - 训练一个非常大的神经网络

python - t-SNE 的并行版本

java - 如何在 Intellij IDEA 社区版中为 gradle spring boot 项目设置 spring.config.location?

java - 这是聚合吗?

java - OSX 上的 JNI 问题

c# - Un-Threaded 比线程更快

python - 当前使用 "for loop"的 pandas 数据帧转换的性能优化