当前位置:   article > 正文

Held-Karp算法的C++代码

Held-Karp算法的C++代码

Held-Karp算法是动态规划的一种应用,用于解决旅行商问题 (TSP)。该算法通过记录部分路径的最小成本来避免重复计算,从而有效地降低计算复杂度。

Held-Karp算法使用一个状态压缩动态规划表dp,其中dp[mask][i]表示从起点出发,访问过所有由mask表示的集合中的节点,并以节点i结束的最小路径长度。

  1. #include <iostream>
  2. #include <vector>
  3. #include <limits>
  4. class HeldKarp {
  5. private:
  6. int n; // 城市数量
  7. std::vector<std::vector<int>> distances; // 城市间距离矩阵
  8. std::vector<std::vector<int>> dp; // 动态规划表
  9. public:
  10. // 构造函数,初始化距离矩阵和状态表
  11. HeldKarp(const std::vector<std::vector<int>>& dist)
  12. : distances(dist), n(dist.size()) {
  13. int max_mask = 1 << n; // 最大的掩码数,即2^n
  14. dp.resize(max_mask, std::vector<int>(n, std::numeric_limits<int>::max())); // 初始化动态规划表,默认值为无穷大
  15. dp[1][0] = 0; // 起始城市的状态初始化为0
  16. }
  17. // 求解TSP问题的函数
  18. int solve() {
  19. for (int mask = 1; mask < (1 << n); mask++) { // 遍历所有可能的掩码
  20. for (int u = 0; u < n; u++) { // 遍历所有城市
  21. if (mask & (1 << u)) { // 如果城市u在掩码中
  22. for (int v = 0; v < n; v++) { // 遍历所有城市
  23. if (!(mask & (1 << v))) { // 如果城市v不在掩码中
  24. int next_mask = mask | (1 << v); // 更新掩码,加入城市v
  25. dp[next_mask][v] = std::min(dp[next_mask][v], dp[mask][u] + distances[u][v]); // 更新动态规划表
  26. }
  27. }
  28. }
  29. }
  30. }
  31. // 计算从最后一个城市回到起点的最短路径
  32. int ans = std::numeric_limits<int>::max(); // 初始化最小值为无穷大
  33. for (int u = 1; u < n; u++) { // 遍历所有城市
  34. ans = std::min(ans, dp[(1 << n) - 1][u] + distances[u][0]); // 计算最小值
  35. }
  36. return ans; // 返回最短路径长度
  37. }
  38. };
  39. int main() {
  40. // 定义城市间的距离矩阵
  41. std::vector<std::vector<int>> distances = {
  42. {0, 10, 15, 20}, // 城市0到其他城市的距离
  43. {10, 0, 35, 25}, // 城市1到其他城市的距离
  44. {15, 35, 0, 30}, // 城市2到其他城市的距离
  45. {20, 25, 30, 0} // 城市3到其他城市的距离
  46. };
  47. // 创建HeldKarp对象,并传入距离矩阵
  48. HeldKarp hk(distances);
  49. int minDistance = hk.solve(); // 求解最短路径长度
  50. std::cout << "最短路径长度: " << minDistance << std::endl; // 输出最短路径长度
  51. return 0; // 返回0,表示程序正常结束
  52. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/855568
推荐阅读
相关标签
  

闽ICP备14008679号