C++ C++;并行问题处理单元

C++ C++;并行问题处理单元,c++,parallel-processing,c++17,C++,Parallel Processing,C++17,我目前正在为我的论文写一个遗传算法,在实现并行循环时遇到了一个错误,这可能非常明显,但我不确定如何解决这个问题 void evaluate_population_fitness(vector<Chromosome *> population) { std::for_each(std::execution::par_unseq, population.begin(), population.end(), [](Chromosome *item) { item->set

我目前正在为我的论文写一个遗传算法,在实现并行循环时遇到了一个错误,这可能非常明显,但我不确定如何解决这个问题

void evaluate_population_fitness(vector<Chromosome *> population) {
  std::for_each(std::execution::par_unseq, population.begin(), population.end(), [](Chromosome *item) {
    item->setLength(1 / calculate_Chromosome_length(item));
  });
}
void评估总体适应性(向量总体){
std::for_each(std::execution::par_unseq,population.begin(),population.end(),[](染色体*项目){
项目->设置长度(1/计算染色体长度(项目));
});
}
这是实际的并行for循环这是它调用的函数:

double calculate_Chromosome_length(Chromosome *path) {
  double sum = 0;
  vector<City *> cities = path->getCities();
  for (int i = 0; i < cities.size()-1; i++) {
    sum += sqrt(pow(cities[i]->getPosX() - cities[i + 1]->getPosX(), 2)
                    + pow(cities[i]->getPosY() - cities[i + 1]->getPosY(), 2));
    cout << sum << std::endl;
  }
  cout << sum << std::endl;
  return sum;
}
双重计算染色体长度(染色体*路径){
双和=0;
向量城市=路径->获取城市();
对于(int i=0;igetPosX()-城市[i+1]->getPosX(),2)
+pow(城市[i]->getPosY()-城市[i+1]->getPosY(),2));

cout您正在
std::vector
中存储指向局部变量的指针,这是未定义的行为

std::vector<City *> generate_randomCity(int number_Of_Cities_to_generate) {
  vector<City *> vector = std::vector<City *>();
  if (number_Of_Cities_to_generate == 0) return vector;
  string city_name = "City";
  for (int i = 0; i < number_Of_Cities_to_generate; i++) {
    city_name += std::to_string(i);
    City city = City(city_name, randomNumber(0, 999), randomNumber(0, 999), i);
    // Storing a pointer to local variable
    vector.emplace_back(&city);
  }
  return vector;
}

请注意,当不再需要时,需要删除
City
对象,因此,最好使用智能指针,而不是
new

如果在调试器下运行代码,您可能会看到所有指针指向同一地址。而该地址无效(尽管调试器无法告诉您)

您创建了一个本地对象
City
,当当前循环迭代完成时,该对象立即消失。存储在vector中的指针无效

通常,保留指针的向量是没有意义的,因此最好重新组织代码以返回
std::vector

std::vector<City> generate_randomCity(int number_Of_Cities_to_generate) {
  vector<City> vector;
  //if (number_Of_Cities_to_generate == 0) return vector; //unnecessary, loop can run 0 times, no problem with that
  string city_name = "City";
  for (int i = 0; i < number_Of_Cities_to_generate; i++) {
    //city_name += std::to_string(i); //this will add the number forever, so 5th city gets name 'City01234'
    vector.emplace_back(city_name + std::to_string(i), randomNumber(0, 999), randomNumber(0, 999), i);
  }

  return vector;
}
请注意,您有责任在使用完这些指针后,通过
delete
释放它们。

请确保您在向量总体方面没有相同的错误,我认为错误与并行中的求和声明有关。我使用的是Visual studio community 2019附带的最新MSVC编译器,我在某个地方看到它受到支持,我没有收到任何编译错误。我猜问题可能是城市是如何生成的。你确定指针是有效的并且指向不同的对象吗?我将编辑主要帖子来展示城市是如何生成的。我一定会研究智能指针。我来自Java land,所以肯定有点困惑,但这解决了我的错误。现在获得正确的返回值。Tha谢谢,谢谢你的帮助,我会修改我的代码。
City* city = new City(city_name, randomNumber(0, 999), randomNumber(0, 999), i);
vector.push_back(city);
std::vector<City> generate_randomCity(int number_Of_Cities_to_generate) {
  vector<City> vector;
  //if (number_Of_Cities_to_generate == 0) return vector; //unnecessary, loop can run 0 times, no problem with that
  string city_name = "City";
  for (int i = 0; i < number_Of_Cities_to_generate; i++) {
    //city_name += std::to_string(i); //this will add the number forever, so 5th city gets name 'City01234'
    vector.emplace_back(city_name + std::to_string(i), randomNumber(0, 999), randomNumber(0, 999), i);
  }

  return vector;
}
std::vector<City*> generate_randomCity(int number_Of_Cities_to_generate) {
  vector<City*> vector;
  //if (number_Of_Cities_to_generate == 0) return vector; //unnecessary, loop can run 0 times, no problem with that
  string city_name = "City";
  for (int i = 0; i < number_Of_Cities_to_generate; i++) {
    //city_name += std::to_string(i); //this will add the number forever, so 5th city gets name 'City01234'
    City* city = new City(city_name + std::to_string(i), randomNumber(0, 999), randomNumber(0, 999), i);
    vector.emplace_back(city);
  }
  return vector;
}