我在TSP的C ++解决方案中遇到转换错误

时间:2019-06-15 23:01:47

标签: c++ codeblocks traveling-salesman

我正在尝试使用多维数组解决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 ++指针的记忆不足,无法知道如何解决它。

感谢您的帮助,谢谢

2 个答案:

答案 0 :(得分:1)

当C数组衰减为指针时,您的声明应为double* points。如果使用c ++,则可以考虑使用std::vector<double>&作为输入。

编辑:如果最终使用了c数组,则必须在堆上分配它们并释放资源。

答案 1 :(得分:0)

int numCities = 10;
double cities[numCities][2];

与其创建一对匿名double来包含每个城市的xy位置,不如为其创建一个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