我正在尝试使用多维数组解决C ++中的TSP,并收到有关类型转换的错误消息。
我对C ++几年来一直没有使用它感到生疏,因此为了重新学习,我决定尝试一些Traveling Salesman解决方案。我使用的第一个数组使用多维数组存储点,这些点是随机分配的。那部分效果很好,所以我继续进行距离公式。我为基本距离公式创建了一个辅助函数,该函数以2个数组作为输入,并自行运行,然后创建了一个函数来查找整个城市数组的总距离。它采用一个双精度数组和一个代表城市总数的整数,然后遍历该数组以找到每个点的距离并将它们相加。
这是变量声明和随机点分配
int numCities = 10;
double cities[numCities][2];
//Creates random(unseeded) points
for(int i = 0; i < numCities; i++){
for(int j = 0; j < 2; j++){
cities[i][j] = (rand() % 100) + 1;
}
}
这是用于调用函数的行
cout << distTotal(cities, numCities) << endl;
这是函数和辅助函数
//basic distance formula
double cityDist(double cityA[], double cityB[]){
return sqrt(pow((cityB[0]-cityA[0]), 2.0)+
pow((cityB[1]-cityA[1]), 2.0));
}
//calculate total distance of group of cities
double distTotal(double* points[], int num){
double total = 0;
for(int i = 0; i < num-1; i++){
total=total+cityDist(points[i], points[i+1]);
}
return total;
}
因此,理想情况下,这应该以此处给出的基本顺序为我提供所有点之间的总距离。但是,我目前遇到以下错误:
错误:无法将参数'1'的'double(*)[2]'转换为'double **'到'double distTotal(double **,int)'
如果我没记错的话,这可能与指针有关,但是老实说,我对C ++指针的记忆不足,无法知道如何解决它。
感谢您的帮助,谢谢
答案 0 :(得分:1)
当C数组衰减为指针时,您的声明应为double* points
。如果使用c ++,则可以考虑使用std::vector<double>&
作为输入。
编辑:如果最终使用了c数组,则必须在堆上分配它们并释放资源。
答案 1 :(得分:0)
int numCities = 10; double cities[numCities][2];
与其创建一对匿名double
来包含每个城市的x
和y
位置,不如为其创建一个class
/ struct
。这将使以后扩展解决方案变得更加容易。如果您想存储城市名称及其位置,例如:
struct position_t {
double x;
double y;
};
struct city_t {
position_t position;
std::string name;
};
然后,考虑使用vector
,它可以在运行时动态地增长和收缩,而不是在阵列中固定数量的城市:
std::vector<city_t> cities;
添加了一些辅助功能:
#include <cmath>
#include <iostream>
#include <string>
#include <string_view>
#include <vector>
struct position_t {
position_t(double X, double Y) : x(X), y(Y) {}
double dist(const position_t& other) const {
return std::sqrt(std::pow(x - other.x, 2.) + std::pow(y - other.y, 2.));
}
// a function to print the position
friend std::ostream& operator<<(std::ostream&, const position_t&);
double x;
double y;
};
std::ostream& operator<<(std::ostream& os, const position_t& p) {
return os << '{' << p.x << ',' << p.y << '}';
}
struct city_t {
city_t(const position_t& p, const std::string_view& n) : position(p), name(n) {}
double dist(const city_t& other) const {
// this distance function just calls the function in the position_t
return position.dist(other.position);
}
// a function to print the values of the city
friend std::ostream& operator<<(std::ostream&, const city_t&);
position_t position;
std::string name;
};
std::ostream& operator<<(std::ostream& os, const city_t& c) {
return os << c.position << ' ' << c.name;
}
int main() {
std::vector<city_t> cities = {{{10., 20.}, "Ankeborg"},
{{11., 12.}, "Gothenburg"}};
for(const auto& c : cities) {
std::cout << c << "\n";
}
std::cout << "distance: " << cities[0].dist(cities[1]) << "\n";
}
输出:
{10,20} Ankeborg
{11,12} Gothenburg
distance: 8.06226