Change Dir

          先知cd——熱愛生活是一切藝術的開始

          統計

          留言簿(18)

          積分與排名

          “牛”們的博客

          各個公司技術

          我的鏈接

          淘寶技術

          閱讀排行榜

          評論排行榜

          深入理解動態規劃的一系列問題(5)

          今天主要面對的問題還是路徑問題,回顧最短路的Floyd-Warshall算法,決定還是這里把它實現以下。經過前面的訓練,當我們確定一個問題可用動態規劃方法求解時,最重要的一步就是要先給出狀態定義,其后就可以列出DPFE方程了。那么對于FW算法所求解的全路徑最短路問題,問題是要求解一個有向圖中的所有節點之間的最短路徑。也就是說對于一個N個節點的圖,總共有N(N-1)/2個可能組合,求解他們的最短路徑。對于這時的狀態定義,我們可以參考SPC問題,我們可以定義一個狀態(k,p,q)表示從p到q的最短路徑,其中k表示不超過k段組成。也就是從p到q不超過k段路徑的組合中,最短路徑的狀態。于是,轉移方程也就可以列出來了:

          F(k,p,q) = min r∈S{b(p, r)+F(k?1,r,q)},k>0。其中當p=q時,F(0,p,q)=0,當p≠q時,F(0,p,q)=∞,b(p,p)=0,b是路徑長度函數。

          這樣,列出方程,我們可以輕松寫遞歸代碼求解問題了。

          當然這里還是補充一下Floyd-Warshall算法的狀態轉移方程:F(k,p,q) = min{F(k?1,p,q),F(k?1,p,k)+F(k?1,k,q)},其中當p=q時,F(0,p,q)=0,當p≠q時,F(0,p,q)=b(p,q)。可以看出兩者的差異,FW算法縮減了SPC問題求解方法的中間變量r,也就是說每次求解min值不需要在一個狀態集合里尋求最短,而把min縮小到(k-1,p,q)和(k-1,p,k)+(k-1,k,q)中,這樣直接把計算復雜度降了一個量級。

          遞歸Java source code:

             1: /*
             2:  * Copyright (C) 2013 changedi
             3:  *
             4:  * Licensed under the Apache License, Version 2.0 (the "License");
             5:  * you may not use this file except in compliance with the License.
             6:  * You may obtain a copy of the License at
             7:  *
             8:  * http://www.apache.org/licenses/LICENSE-2.0
             9:  *
            10:  * Unless required by applicable law or agreed to in writing, software
            11:  * distributed under the License is distributed on an "AS IS" BASIS,
            12:  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
            13:  * See the License for the specific language governing permissions and
            14:  * limitations under the License.
            15:  */
            16: package com.jybat.dp;
            17:  
            18: public class APSP {
            19:  
            20:     private static final int INF = Integer.MAX_VALUE;
            21:  
            22:     // nodes (s,x,y,t) = {0,1,2,3}, so (s,x) = 3 means d[0][1] = 3
            23:     private static int[][] distance = { 
            24:         { INF, 5,      3,     INF }, 
            25:         { INF, INF, 2,     5 },
            26:         { INF, 1,       INF, 8 }, 
            27:         { INF, INF, INF, INF } 
            28:     };
            29:     
            30:     private static int maxNodeIndex = distance.length-1;
            31:     
            32:     private static int[] possibleSuccessors = { 0, 1 };
            33:     
            34:     public static double f(int k, int p, int q) {
            35:         if (k == 0 && p == q)
            36:             return 0;
            37:         if (k == 0 && p != q)
            38:             return distance[p][q];
            39:         double min = Double.MAX_VALUE;
            40:         for (int d : possibleSuccessors) {
            41:             double t = (1 - d) * f(k - 1, p, q) + d * f(k - 1, p, k) + d
            42:                     * f(k - 1, k, q);
            43:             if (t < min)
            44:                 min = t;
            45:         }
            46:         return min;
            47:     }
            48:     /**
            49:      * @param args
            50:      */
            51:     public static void main(String[] args) {
            52:         System.out.println(f(maxNodeIndex,0,3));
            53:     }
            54:  
            55: }

          posted on 2014-04-08 10:30 changedi 閱讀(1663) 評論(11)  編輯  收藏 所屬分類: 算法

          評論

          # re: 深入理解動態規劃的一系列問題(5) 2014-04-08 11:27 金利鎖業

          支持博主分享  回復  更多評論   

          # re: 深入理解動態規劃的一系列問題(5) 2014-04-08 15:23 無添加

          網址動態好還是靜態好呢?  回復  更多評論   

          # re: 深入理解動態規劃的一系列問題(5) 2014-04-10 09:17 開鎖者

          期待更新啊博主  回復  更多評論   

          # re: 深入理解動態規劃的一系列問題(5) 2014-04-10 10:40 零柒鎖業

          謝謝博主分享啊  回復  更多評論   

          # re: 深入理解動態規劃的一系列問題(5) 2014-04-10 15:06 柚子舍

          動態鏈接對SEO也越來越友好了。  回復  更多評論   

          # re: 深入理解動態規劃的一系列問題(5) 2014-04-11 09:36 鵬達鎖業

          期待更新阿博主  回復  更多評論   

          # re: 深入理解動態規劃的一系列問題(5) 2014-04-11 10:39 萬利鎖業

          謝謝博主分享  回復  更多評論   

          # re: 深入理解動態規劃的一系列問題(5) 2014-04-11 22:34 wingsBlog

          不明覺厲  回復  更多評論   

          # re: 深入理解動態規劃的一系列問題(5) 2014-04-12 10:12 萬利鎖業

          期待 更新樓主  回復  更多評論   

          # re: 深入理解動態規劃的一系列問題(5) 2014-04-12 13:51 魏五鎖業

          給力支持樓主  回復  更多評論   

          # re: 深入理解動態規劃的一系列問題(5) 2014-04-12 13:52 鵬達鎖業

          期待更新AB制  回復  更多評論   

          主站蜘蛛池模板: 闸北区| 白山市| 桐庐县| 铜鼓县| 桦南县| 砀山县| 修水县| 孟州市| 土默特左旗| 奉贤区| 临洮县| 芒康县| 绵阳市| 界首市| 云阳县| 保定市| 邮箱| 莎车县| 吴川市| 浑源县| 洛扎县| 宜兰县| 嵊泗县| 余干县| 清丰县| 江陵县| 和静县| 哈巴河县| 桐庐县| 丰顺县| 县级市| 子洲县| 明星| 德令哈市| 镇沅| 县级市| 灌南县| 玉树县| 青神县| 瑞丽市| 始兴县|