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;
}