Change Dir

          先知cd——熱愛(ài)生活是一切藝術(shù)的開(kāi)始

          統(tǒng)計(jì)

          留言簿(18)

          積分與排名

          “牛”們的博客

          各個(gè)公司技術(shù)

          我的鏈接

          淘寶技術(shù)

          閱讀排行榜

          評(píng)論排行榜

          深入理解動(dòng)態(tài)規(guī)劃的一系列問(wèn)題(5)

          今天主要面對(duì)的問(wèn)題還是路徑問(wèn)題,回顧最短路的Floyd-Warshall算法,決定還是這里把它實(shí)現(xiàn)以下。經(jīng)過(guò)前面的訓(xùn)練,當(dāng)我們確定一個(gè)問(wèn)題可用動(dòng)態(tài)規(guī)劃方法求解時(shí),最重要的一步就是要先給出狀態(tài)定義,其后就可以列出DPFE方程了。那么對(duì)于FW算法所求解的全路徑最短路問(wèn)題,問(wèn)題是要求解一個(gè)有向圖中的所有節(jié)點(diǎn)之間的最短路徑。也就是說(shuō)對(duì)于一個(gè)N個(gè)節(jié)點(diǎn)的圖,總共有N(N-1)/2個(gè)可能組合,求解他們的最短路徑。對(duì)于這時(shí)的狀態(tài)定義,我們可以參考SPC問(wèn)題,我們可以定義一個(gè)狀態(tài)(k,p,q)表示從p到q的最短路徑,其中k表示不超過(guò)k段組成。也就是從p到q不超過(guò)k段路徑的組合中,最短路徑的狀態(tài)。于是,轉(zhuǎn)移方程也就可以列出來(lái)了:

          F(k,p,q) = min r∈S{b(p, r)+F(k?1,r,q)},k>0。其中當(dāng)p=q時(shí),F(xiàn)(0,p,q)=0,當(dāng)p≠q時(shí),F(xiàn)(0,p,q)=∞,b(p,p)=0,b是路徑長(zhǎng)度函數(shù)。

          這樣,列出方程,我們可以輕松寫(xiě)遞歸代碼求解問(wèn)題了。

          當(dāng)然這里還是補(bǔ)充一下Floyd-Warshall算法的狀態(tài)轉(zhuǎn)移方程:F(k,p,q) = min{F(k?1,p,q),F(k?1,p,k)+F(k?1,k,q)},其中當(dāng)p=q時(shí),F(xiàn)(0,p,q)=0,當(dāng)p≠q時(shí),F(xiàn)(0,p,q)=b(p,q)。可以看出兩者的差異,F(xiàn)W算法縮減了SPC問(wèn)題求解方法的中間變量r,也就是說(shuō)每次求解min值不需要在一個(gè)狀態(tài)集合里尋求最短,而把min縮小到(k-1,p,q)和(k-1,p,k)+(k-1,k,q)中,這樣直接把計(jì)算復(fù)雜度降了一個(gè)量級(jí)。

          遞歸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) 評(píng)論(11)  編輯  收藏 所屬分類: 算法

          評(píng)論

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問(wèn)題(5) 2014-04-08 11:27 金利鎖業(yè)

          支持博主分享  回復(fù)  更多評(píng)論   

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問(wèn)題(5) 2014-04-08 15:23 無(wú)添加

          網(wǎng)址動(dòng)態(tài)好還是靜態(tài)好呢?  回復(fù)  更多評(píng)論   

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問(wèn)題(5) 2014-04-10 09:17 開(kāi)鎖者

          期待更新啊博主  回復(fù)  更多評(píng)論   

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問(wèn)題(5) 2014-04-10 10:40 零柒鎖業(yè)

          謝謝博主分享啊  回復(fù)  更多評(píng)論   

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問(wèn)題(5) 2014-04-10 15:06 柚子舍

          動(dòng)態(tài)鏈接對(duì)SEO也越來(lái)越友好了。  回復(fù)  更多評(píng)論   

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問(wèn)題(5) 2014-04-11 09:36 鵬達(dá)鎖業(yè)

          期待更新阿博主  回復(fù)  更多評(píng)論   

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問(wèn)題(5) 2014-04-11 10:39 萬(wàn)利鎖業(yè)

          謝謝博主分享  回復(fù)  更多評(píng)論   

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問(wèn)題(5) 2014-04-11 22:34 wingsBlog

          不明覺(jué)厲  回復(fù)  更多評(píng)論   

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問(wèn)題(5) 2014-04-12 10:12 萬(wàn)利鎖業(yè)

          期待 更新樓主  回復(fù)  更多評(píng)論   

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問(wèn)題(5) 2014-04-12 13:51 魏五鎖業(yè)

          給力支持樓主  回復(fù)  更多評(píng)論   

          # re: 深入理解動(dòng)態(tài)規(guī)劃的一系列問(wèn)題(5) 2014-04-12 13:52 鵬達(dá)鎖業(yè)

          期待更新AB制  回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 无棣县| 鹤峰县| 六安市| 辛集市| 富源县| 南和县| 延安市| 成都市| 富蕴县| 菏泽市| 牟定县| 三都| 辽中县| 沂南县| 哈尔滨市| 临沭县| 天台县| 高阳县| 焉耆| 本溪市| 哈尔滨市| 铜山县| 平谷区| 丹江口市| 文安县| 晋宁县| 舒兰市| 大方县| 乌拉特后旗| 漠河县| 六枝特区| 纳雍县| 青铜峡市| 鄄城县| 威远县| 江川县| 三台县| 深圳市| 甘德县| 综艺| 大埔区|