<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Change Dir

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

    統(tǒng)計(jì)

    留言簿(18)

    積分與排名

    “牛”們的博客

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

    我的鏈接

    淘寶技術(shù)

    閱讀排行榜

    評(píng)論排行榜

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

    在問(wèn)題1線性搜索里,我們提到了狀態(tài)轉(zhuǎn)移圖模型,因?yàn)榕c通用解法等價(jià),所以基本所有動(dòng)態(tài)規(guī)劃問(wèn)題都可以用圖論的方法求解,很多問(wèn)題等價(jià)于一個(gè)最短路徑問(wèn)題。而本文主要介紹一下通俗的最短路問(wèn)題——DP第二題:SPA(Shortest Path in an Acyclic Graph)。

    對(duì)于一個(gè)無(wú)環(huán)圖來(lái)講(有環(huán)圖后面講到),一個(gè)起始節(jié)點(diǎn)為s,一個(gè)目標(biāo)節(jié)點(diǎn)為t,DPFE為:f(p) = min q{ b(p,q) + f(q)},其中b(p,q)是從p到q的距離,f(p)是從p到t的最短路徑,另外這里的p是q的前驅(qū)節(jié)點(diǎn),如果p不是q的直接前驅(qū),那么b(p,q)=∞。而目標(biāo)函數(shù)就是求 f(s),base condition就是f(t)=0。

    那么舉例如下:一個(gè)有向無(wú)環(huán)圖,其有四個(gè)節(jié)點(diǎn),集合為{s,x,y,t},五條邊,邊集合為{(s,x), (s,y), (x,y), (x,t), (y,t)},長(zhǎng)度為{3,5,1,8,5}。那么求從s到t的最短路徑。

    image

    首先使每個(gè)節(jié)點(diǎn)都有到t的邊,如果沒(méi)有的,加一條虛擬邊,長(zhǎng)度為∞,即(s,t)=∞。DPFE為:f(s) = min{b(s,x)+f(x), b(s,y)+f(y), b(s,t)+f(t)},f(x) = min{b(x,y)+f(y), b(x,t)+f(t)},f(y) = min{b(y,t)+f(t)},f(t)=0。依次代入,得到f(y)=min{5+0}=5,f(x)=min{1+5,8+0}=6,f(s)=min{3+6,5+5,∞+0}=9。

    因此最短路徑長(zhǎng)度為9,路徑為s->x->y->t。

    代碼是經(jīng)典的最短路代碼,使用鄰接矩陣來(lái)表示一個(gè)有向無(wú)環(huán)圖,這里仍然用一個(gè)遞歸函數(shù)來(lái)簡(jiǎn)化:

       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: import java.util.HashSet;
      19: import java.util.Set;
      20:  
      21: public class ShortestPathAcyclic {
      22:  
      23:     private static final int INF = Integer.MAX_VALUE;
      24:  
      25:     // nodes (s,x,y,t) = {0,1,2,3}, so (s,x) = 3 means d[0][1] = 3
      26:     private static int[][] distance = { 
      27:         { INF, 3,      5,     INF }, 
      28:         { INF, INF, 1,     8 },
      29:         { INF, INF, INF, 5 }, 
      30:         { INF, INF, INF, INF } 
      31:     };
      32:  
      33:     private static Set<Integer> possibleNextNodes(int node) {
      34:         Set<Integer> result = new HashSet<Integer>();
      35:         for (int i = 0; i < distance[node].length; i++) {
      36:             if (distance[node][i] != INF) {
      37:                 result.add(new Integer(i));
      38:             }
      39:         }
      40:         return result;
      41:     }
      42:     
      43:     public static double f(int currentNode){
      44:         if(currentNode==3) return 0.0;
      45:         else{
      46:             Set<Integer> possibleSuccessors = possibleNextNodes(currentNode);
      47:             double min = Double.MAX_VALUE;
      48:             for(Integer d : possibleSuccessors){
      49:                 double dis = distance[currentNode][d]+f(d);
      50:                 if(dis<min) {
      51:                     min = dis;
      52:                 }
      53:             }
      54:             return min;
      55:         }
      56:     }
      57:  
      58:     /**
      59:      * @param args
      60:      */
      61:     public static void main(String[] args) {
      62:         double shortest = f(0);
      63:         System.out.println(shortest);
      64:     }
      65:  
      66: }

     

    其實(shí)這個(gè)版本的代碼沒(méi)有記錄路徑,只求出了最短距離值,路徑的記錄有很多種方式,最直觀的方法是在f函數(shù)內(nèi)部的for循環(huán)結(jié)束后,把最小距離計(jì)算出的對(duì)應(yīng)的后繼節(jié)點(diǎn)d保存,然后記錄一個(gè)(currentNode,d)這樣的一個(gè)節(jié)點(diǎn)對(duì),保存到currentNode為key的一個(gè)map里,表示對(duì)應(yīng)從currentNode開(kāi)始到d選定的最短距離的邊,最后把map里所有這些邊都拿出來(lái)拼成一個(gè)路徑即可。具體代碼就不寫(xiě)了(因?yàn)榭紤]到影響對(duì)動(dòng)態(tài)規(guī)劃的理解,記得算法導(dǎo)論里也是把記錄路徑單獨(dú)寫(xiě)一個(gè)函數(shù)去講解的)。

    posted on 2014-03-17 13:40 changedi 閱讀(1552) 評(píng)論(0)  編輯  收藏 所屬分類: 算法

    主站蜘蛛池模板: 亚洲A∨无码一区二区三区| 亚洲精品V天堂中文字幕| 成人女人A级毛片免费软件| 国产精品亚洲色图| 久久精品国产亚洲av麻| 久久WWW色情成人免费观看| 污污污视频在线免费观看| 亚洲人成电影福利在线播放 | 免费看又爽又黄禁片视频1000| 污污视频网站免费观看| 亚洲无线电影官网| 国产人妖ts在线观看免费视频| 七色永久性tv网站免费看| 亚洲高清一区二区三区电影| 亚洲人精品午夜射精日韩| 成人影片麻豆国产影片免费观看| 久香草视频在线观看免费| 亚洲国产精品成人精品小说 | 久久亚洲sm情趣捆绑调教| 尤物永久免费AV无码网站| 免费一级毛片在线播放视频| 精品亚洲国产成人av| 麻豆亚洲av熟女国产一区二| 亚洲熟女乱综合一区二区| 成人片黄网站A毛片免费| 永久免费av无码入口国语片| 国产亚洲视频在线播放大全| 亚洲国产美女精品久久久久| 中文字幕久久亚洲一区| 国产免费拔擦拔擦8x| 国内精品免费麻豆网站91麻豆| 两个人看的www免费视频| 婷婷亚洲综合五月天小说在线| 亚洲日本国产精华液| 亚洲av综合色区| 丝袜熟女国偷自产中文字幕亚洲| 日韩高清在线免费看| 韩国免费一级成人毛片| 57pao一国产成永久免费| 青青操在线免费观看| 精品97国产免费人成视频|