Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么要并行化此实现的代码';s遗传算法求解tsp的速度慢得多?_Java_Multithreading - Fatal编程技术网

Java 为什么要并行化此实现的代码';s遗传算法求解tsp的速度慢得多?

Java 为什么要并行化此实现的代码';s遗传算法求解tsp的速度慢得多?,java,multithreading,Java,Multithreading,我正在做一个关于遗传算法的大学项目来解决TSP问题,老师让我们将优化函数并行化。我尝试并行实现优化功能,它可以工作,但速度要慢得多。 小费 您可以在此处找到原始代码: public SalesmanGenome optimizeP()抛出InterruptedException{ //设置在优化过程中不会更改的所有常量属性 addInP.setGenerationSize(generationSize); addInP.setGenomeSize(genomeSize); addInP.setM

我正在做一个关于遗传算法的大学项目来解决TSP问题,老师让我们将优化函数并行化。我尝试并行实现优化功能,它可以工作,但速度要慢得多。 小费

您可以在此处找到原始代码:

public SalesmanGenome optimizeP()抛出InterruptedException{
//设置在优化过程中不会更改的所有常量属性
addInP.setGenerationSize(generationSize);
addInP.setGenomeSize(genomeSize);
addInP.setMutationRate(mutationRate);
addInP.setNumberOfCities(城市数);
附加设置开始城市(开始城市);
添加设置travelPrices(travelPrices);
addInP myThreads[]=新的addInP[N_线程];
列表填充=初始填充();//随机填充
SalesmanGenome globalBestGenome=人口.get(0);
对于(int i=0;i
这是扩展线程的addInP类的run函数

public void run()
{
    while( getCurrentGenerationSize() < generationSize){

        List<SalesmanGenome> parents = pickNRandomElements(population,2);
        List<SalesmanGenome> children = crossover(parents);
        children.set(0, mutate(children.get(0)));
        children.set(1, mutate(children.get(1)));
        generation.addAll(children);
        setCurrentGenerationSize( getCurrentGenerationSize()+2);

    }

}
public void run()
{
while(getCurrentGenerationSize()
这些是我的addInP类的属性和使用共享变量currentGenerationSize的方法

private static List<SalesmanGenome> population;
private static volatile int currentGenerationSize ;
private static int generationSize;
private static int[][] travelPrices;
private static int startingCity;
private static int numberOfCities;
private static int genomeSize;
private static float mutationRate;
private static List<SalesmanGenome> generation;

public synchronized int getCurrentGenerationSize() {
    return currentGenerationSize;
}

public synchronized  static void setCurrentGenerationSize(int currentGenerationSize) {
    addInP.currentGenerationSize = currentGenerationSize;
}
私有静态列表填充;
私有静态volatile int currentGenerationSize;
私有静态整数生成;
私有静态int[][]旅行价格;
私人静态int startingCity;
私人静态城市数;
私有静态int基因组化;
私有静态浮动突变率;
私有静态列表生成;
public synchronized int getCurrentGenerationSize(){
返回电流生成大小;
}
公共同步静态无效setCurrentGenerationSize(int currentGenerationSize){
addInP.currentGenerationSize=currentGenerationSize;
}

您可以将
基因组.size
分割成一个较小的块,并独立计算分数。这只对
基因组有意义。就我所见,for循环实际上不需要访问来修改其封闭范围内的任何内容。因此,你的导师可能希望你并行计算每个基因组的适合性,而不是顺序计算(for循环是顺序的)。因此,您可以启动一个大小为
genome.size
的线程池,让每个线程计算给定基因组的适合度,并将结果发布回主线程,然后将结果添加到适合度。只有在计算适合度的顺序无关紧要(据我所知,这并不重要)的情况下,这种方法才有效。这是否更有效值得商榷,因为线程切换会增加开销,因此可能会比直接for循环慢。请参阅:
private static List<SalesmanGenome> population;
private static volatile int currentGenerationSize ;
private static int generationSize;
private static int[][] travelPrices;
private static int startingCity;
private static int numberOfCities;
private static int genomeSize;
private static float mutationRate;
private static List<SalesmanGenome> generation;

public synchronized int getCurrentGenerationSize() {
    return currentGenerationSize;
}

public synchronized  static void setCurrentGenerationSize(int currentGenerationSize) {
    addInP.currentGenerationSize = currentGenerationSize;
}