如何使用不完整的图表实施蛮力旅行推销员

How to implement brute force travelling salesman with an incomplete graph?

本文关键字:施蛮力 旅行推销员 何使 用不完      更新时间:2023-10-16

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

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

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

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

我教授希望我们能够解决的两个示例都是不完整图的示例。是否可以对Geeksforgeeks的实现进行一些修改以解释不完整的图形?我想到简单地将零放在无法连接的顶点的邻接矩阵中,但是Geeksforgeeks上的代码假设所有顶点都连接到其他每个顶点,而在不完整的图中,则没有。我认为我需要某种方法来查找连接的所有顶点排列,而不是找到顶点的所有排列。

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

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