【发布时间】:2020-11-23 10:30:28
【问题描述】:
我目前正在为我的论文编写遗传算法,但在实现 parallel_for 循环时遇到了错误,这可能非常明显,但我不知道如何解决这个问题。
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));
});
}
这是实际的并行 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;
}
不幸的是,这只是意味着它返回全零。而它实际上应该计算一些欧几里得距离。
作为参考,Chromosome 是一个对象,包含一个 double 类型的长度和一个对城市vector<City *> 的引用向量,一个城市被定义为一个 X、Y 整数和一个字符串 ID。
我真的很感谢这里的一些帮助。
以下是城市的生成方式:
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);
vector.emplace_back(&city);
}
return vector;
}
【问题讨论】:
-
我认为该错误与并行内的 sum 声明有关。
-
我正在使用 Visual Studio 社区 2019 附带的最新 MSVC 编译器,我曾在某处看到它受支持并且我没有收到任何编译错误。
-
我猜问题可能出在
cities的生成方式上。你确定指针是有效的并且指向不同的对象吗? -
我将编辑主帖以显示城市是如何生成的。
标签: c++ parallel-processing c++17