我即将进行考试,我们将要测试的是在无向加权图上实现旅行推销员问题。以下是我们将要解决的问题类型的示例:
示例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的代码假定所有顶点都彼此连接,而在不完整图中则没有。我认为我将需要一种方法来找到所有相连顶点的排列,而不是一般地找到所有顶点排列。
答案 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;
}