如何用不完整的图来实现蛮力旅行推销员?

时间:2019-05-14 03:25:16

标签: c++ traveling-salesman

我即将进行考试,我们将要测试的是在无向加权图上实现旅行推销员问题。以下是我们将要解决的问题类型的示例:

示例1: https://www.autonomousrobotslab.com/uploads/5/8/4/4/58449511/cs302_final_preparation_treasure_hunter.pdf

示例2: https://www.autonomousrobotslab.com/uploads/5/8/4/4/58449511/cs302_final_preparation_tsp.pdf

但是,我看过的绝大多数视频/代码都是用完整的图形来解决tsp的,例如以下示例: https://www.geeksforgeeks.org/traveling-salesman-problem-tsp-implementation/

我的教授希望我们能够解决的两个例子都是不完整图的例子。是否可以对geeksforgeeks的实现进行一些修改以解决图形不完整的问题?我曾考虑过在不连接顶点的邻接矩阵中简单地添加零,但是geeksforgeeks的代码假定所有顶点都彼此连接,而在不完整图中则没有。我认为我将需要一种方法来找到所有相连顶点的排列,而不是一般地找到所有顶点排列。

1 个答案:

答案 0 :(得分:0)

您可以使用next_permutation获取向量的所有排列。您遍历所有排列,计算成本并跟踪最低成本。下面是第二个示例的实现。

int main(int argc, char** argv) {

    const int NUM_NODES = 5;

    int adjacencyMatrix[NUM_NODES][NUM_NODES] = {
        {0, 10, 16, 12, 8},
        {10, 0, 15, INT_MAX, 20},
        {16, 15, 0, 10, INT_MAX},
        {12, INT_MAX, 10, 0, 8},
        {8, 20, INT_MAX, 8, 0}
    };
    int min;
    int bestScore = INT_MAX;
    int currentScore = 0;
    vector<int> bestTrip;
    vector<int> trip;
    int legCost = 0;

    //set a default trip
    for (int i = 0; i < NUM_NODES; ++i) {
        trip.insert(trip.end(), i);
    }
    //insert trip back home
    trip.insert(trip.end(), 0);

    while (next_permutation(trip.begin() + 1, trip.end() - 1)) {
        currentScore = 0;
        for (int i = 0; i < NUM_NODES; i++) {
            legCost = adjacencyMatrix[trip[i]][trip[i + 1]];
            if (legCost == INT_MAX || currentScore == INT_MAX) {
                currentScore = INT_MAX;
            } else {
                currentScore += legCost;
            }
        }
        if (currentScore < bestScore) {
            bestScore = currentScore;
            bestTrip = trip;
        }
    }

    cout << "best trip: ";
    for (int i = 0; i < NUM_NODES + 1; i++) {
        cout << bestTrip[i];
    }
    cout << endl;
    cout << "best score:" << bestScore << endl;
    return 0;
}