zoukankan      html  css  js  c++  java
  • 剪枝法观点下的旅行商问题(TSP)

    1. 构建基本的穷举搜索骨架

    int n;
    int dst[100][100];
    int best;
    
    const int INF = 987654321;
    
    // 初始状态下,path 存入第一节点,visited 全部元素为 false,curLen = 0;
    void search(vector<int>& path, vector<bool>& visited, int curLen){
        if (best <= curLen)
            return;
        int here = path.back();
        if (path.size() == n) {
            best = min(best, curLen+dst[here][0]);
            return;
        }
        for (int next = 0; next < n; ++next){
            if (visited[next])
                continue;
            visited[next] = true;
            path.push_back(next);
            search(path, visited, curLen + dst[here][next]);
            visited[next] = false;
            path.pop_back();
        }
    }
    
    double solve(){
        best = INF;
        vector<bool> visited(n, false);
        vector<int> path(1, 0);
        visited[0] = true;
        search(path, visited, 0);
        return best;
    }
    

    2. 剪枝法初步:不如最优解就当即结束

    只需在 search() 函数的开头部分加入如下一行代码:

    // best 初始化为INF,
    // 只有在 if (path.size() == n)... 才对其进行更新;
    if (best <= curLen)
        return;

    3. 剪枝法进阶:利用启发式算法的剪枝法

    “不如最优解”就终止搜索的剪枝法,虽然比较有用,但比起动态规划还差很远,“利用启发式方法估计剩余部分”的剪枝法就相对巧妙得多。

    比如设计这样的启发式函数,会在未访问的城市相连路径中选择最短的路径相加。

    int minEdge;
    
    double simpleHeur(const vector<bool>& visited){
        double ret = minEdge[0];
        for (int i = 0; i < visited.size(); ++i)
            if (!visited[i])
                ret += minEdge[i];
                                        // 城市结点之间彼此互通
        return ret;
    }
    
    void search(vector<int>& path, vector<bool>& visited, int curLen){
        if (best <= curLen + simpleHeur(visited)) return;
        //...
    }
    
     double solve(){
         for (int i = 0; i < n; ++i){
             minEdge[i] = INF;
             for (int j = 0; j < n; ++j){
                 if (i != j)
                     minEdge[i] = min(minEdge[i], dst[i][j]);
             }
         }
     }
  • 相关阅读:
    Maven中配置生成单元测试报告配置
    maven-surefire-plugin总结
    Java程序内存分析:使用mat工具分析内存占用
    利用内存分析工具(Memory Analyzer Tool,MAT)分析java项目内存泄露
    JVM性能监控工具(一)-jdk命令行工具
    Java线程详细监控和其dump的分析使用—-分析Java性能瓶颈
    JDK自带内存及线程分析工具
    使用jstack和TDA进行java线程dump分析
    qt 插件开发
    精通linux设备驱动开发 笔记
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9423799.html
Copyright © 2011-2022 走看看