• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            http://acm.hdu.edu.cn/showproblem.php?pid=2224
                  貨郎問題(Traveling Salesman Problem,簡稱“TSP”)也叫貨郎擔(dān)問題,中國郵路問題,旅行商問題等,是計算機算法理論歷史上的經(jīng)典問題。在過去幾十年中,它成為許多重要算法思想的測試平臺,同時也促使一些新的理論領(lǐng)域的產(chǎn)生,比如多面體理論和復(fù)雜性理論。 貨郎問題:給定n個結(jié)點和任意一對結(jié)點{i,j}之間的距離為dist(i,j),要求找出一條閉合的回路,該回路經(jīng)過每個結(jié)點一次且僅一次,并且該回路的費用最小,這里的費用是指每段路徑的距離和。 貨郎問題求解其精確解是NP難的,并且求解任意常數(shù)因子近以度的解也是NP難的。若將問題限定在歐氏平面上,就成為歐氏平面上的貨郎問題,也叫歐幾里德旅行商問題(Eculid Traveling Salesman Problem)。但是,即使是歐氏平面上的貨郎問題也是NP難的。因此通常用來解決TSP問題的解法都是近似算法。其中第一個歐幾里德旅行商問題的多項式近似算法是Arora在1996年使用隨機平面分割和動態(tài)規(guī)劃方法給出的。

                J.L. Bentley 建議通過只考慮雙調(diào)旅程(bitonic tour)來簡化問題,這種旅程即為從最左點開始,嚴(yán)格地從左到右直至最右點,然后嚴(yán)格地從右到左直至出發(fā)點。事實上,存在確定的最優(yōu)雙調(diào)路線的O(n*n)時間的算法。

            /**********************************************************************
            *        Bitonic path (詳見《算法導(dǎo)論》 P217)                                                                                  
            *        一個人從p1嚴(yán)格地增的走到pn,然后再嚴(yán)格遞減的回到p1;求總路徑的最小值;   
            *        網(wǎng)上看到很多解題報告。。??吹奈抑泵昂?nbsp;    
            *        只好自己看書,翻譯。。。                                                                  
            *        對于1 <= i <= j <= n, 我們定義P(i, j)是一條包含了P1, P2, P3 …… Pj的途徑;                   
            *        這條路徑可以分成2部分:遞減序列與遞增序列                                                                
            *        起點是Pi(1 <= i <= j),拐點是P1,終點是Pj, P[i, j]為其最小值;                                     
            *        狀態(tài)轉(zhuǎn)移方程為:                                                                                                                      
            *        b[1,2] = |P1P2|,                                                                                                                               
            *        i < j-1時, b[i,j] = b[i,j-1] + |Pj-1Pj|    點Pj-1在遞增序列中,                                                
            *        i = j-1時, b[i,j] = min{ b[k,j-1] + |PkPj|, 1<= k < j-1 }  點Pj-1在遞減序列中                      
            *        b[n,n] = b[n-1,n] + |Pn-1Pn|                                                                                                        
            *********************************************************************
            */


            #include 
            <stdio.h>
            #include 
            <math.h>
            #define INF 0x7fffffff
            #define N 201
            struct point{
                
            double x, y;
            }point[N];
            int n;
            double dis[N][N];

            double distant(int i, int j)
            {
                
            return sqrt((point[i].x - point[j].x)*(point[i].x - point[j].x) + (point[i].y - point[j].y)*(point[i].y - point[j].y));
            }

            double dp()
            {
                
            int i, j, k;
                
            double temp, b[N][N];

                b[
            1][2= dis[1][2];
                
            for (j=3; j<=n; j++)
                {
                    
            for (i=1; i<=j-2; i++)
                        b[i][j] 
            = b[i][j-1+ dis[j-1][j];

                    b[j
            -1][j] = INF;
                    
            for (k=1; k<=j-2; k++)
                    {
                        temp 
            = b[k][j-1+ dis[k][j];
                        
            if (temp < b[j-1][j])
                            b[j
            -1][j] = temp;
                    }
                }

                b[n][n] 
            = b[n-1][n] + dis[n-1][n];

                
            return b[n][n];
            }

            int main()
            {
                
            int i, j;
                
            double ans;
                
            while (scanf("%d"&n) > 0)
                {
                    
            for (i=1; i<=n; i++)
                        scanf(
            "%lf %lf"&point[i].x, &point[i].y);

                    
            for (j=2; j<=n; j++)
                        
            for (i=1; i<j; i++)
                            dis[i][j] 
            = distant(i,j); 

                    ans 
            = dp();

                    printf(
            "%.2lf\n", dp());
                }
            }

             


             

            posted on 2009-11-30 18:38 西風(fēng)蕭瑟 閱讀(6957) 評論(3)  編輯 收藏 引用 所屬分類: 動態(tài)規(guī)劃

            評論:
            # re: PKU2677,HDU2224 經(jīng)典DP之雙調(diào)旅行商(TSP) 2009-12-01 15:21 | 創(chuàng)意產(chǎn)品批發(fā)
            佩服佩服。。。  回復(fù)  更多評論
              
            # re: PKU2677,HDU2224 經(jīng)典DP之雙調(diào)旅行商(TSP) 2012-05-24 10:12 | aaa
            * b[1,2] = |P1P2|,
            * i = j-1時, b[i,j] = b[i,j-1] + |Pj-1Pj| 點Pj-1在遞增序列中,
            * i < j-1時, b[i,j] = min{ b[k,j-1] + |PkPj|, 1<= k < j-1 } 點Pj-1在遞減序列中
            * b[n,n] = b[n-1,n] + |Pn-1Pn|   回復(fù)  更多評論
              
            # re: PKU2677,HDU2224 經(jīng)典DP之雙調(diào)旅行商(TSP) 2012-10-09 22:43 | keli
            狀態(tài)轉(zhuǎn)移方程為:
            * b[1,2] = |P1P2|,
            * i < j-1時, b[i,j] = b[i,j-1] + |Pj-1Pj| 點Pj-1在遞增序列中,
            * i = j-1時, b[i,j] = min{ b[k,j-1] + |PkPj|, 1<= k < j-1 } 點Pj-1在遞減序列中
            * b[n,n] = b[n-1,n] + |Pn-1Pn|

            ==================
            當(dāng)i = j-1時,狀態(tài)轉(zhuǎn)移方程應(yīng)該是:
            b[i,j] = min{ b[j-1, k] + |PkPj|, 1 <= k < j-1 }吧,
            雖然b[j-1, k] == b[k, j-1],但是我上面寫的才是合理的吧?  回復(fù)  更多評論
              
            狠狠色丁香久久婷婷综合蜜芽五月| 国产精品亚洲美女久久久| 精品熟女少妇AV免费久久| 天天爽天天狠久久久综合麻豆| 国产一级做a爰片久久毛片| 色综合合久久天天给综看| 亚洲精品国产字幕久久不卡| 色综合久久中文色婷婷| 久久综合久久综合亚洲| 精品久久久久久亚洲| 婷婷久久五月天| 品成人欧美大片久久国产欧美 | 久久99中文字幕久久| 久久精品夜色噜噜亚洲A∨| 蜜臀久久99精品久久久久久小说| 99精品伊人久久久大香线蕉| 亚洲国产精品无码久久一线 | 久久亚洲精品无码VA大香大香| 东京热TOKYO综合久久精品| 尹人香蕉久久99天天拍| 91精品国产综合久久四虎久久无码一级| 久久中文字幕精品| 精品久久久久中文字| 99久久婷婷免费国产综合精品| 狠狠色综合网站久久久久久久高清 | 久久九九兔免费精品6| 久久国产三级无码一区二区| 久久精品无码专区免费青青| 思思久久好好热精品国产| 久久国产一区二区| 99久久精品毛片免费播放| 亚洲国产精品无码久久一线| 国产精品久久新婚兰兰| 久久久久国产一区二区三区| 99久久国产亚洲高清观看2024| 久久久久亚洲精品天堂| 99久久精品免费看国产一区二区三区| 久久久久久久亚洲精品| 亚洲国产高清精品线久久| 无码8090精品久久一区| 久久精品无码专区免费|