久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2687|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

關(guān)于尋求最短路徑的一種算法、附件為算法的C/C++實(shí)現(xiàn),歡迎下載

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:540551 發(fā)表于 2019-5-17 11:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最短路徑尋優(yōu)

(以下關(guān)于Dijstra的說明,是借用算法與數(shù)據(jù)結(jié)構(gòu)的發(fā)帖說明、侵權(quán)即刪)原帖鏈接最短路徑尋優(yōu)如上圖所示、如何尋求從 A 出發(fā)到 G 點(diǎn)的最短路徑呢?Dijstra算法就是要求出這個最短的路徑;

讓我們來演示一下迪杰斯特拉的詳細(xì)過程:        第1步,創(chuàng)建距離表。表中的Key是頂點(diǎn)名稱,Value是從起點(diǎn)A到對應(yīng)頂點(diǎn)的已知最短距離。        但是,一開始我們并不知道A到其他頂點(diǎn)的最短距離是多少,Value默認(rèn)是無限大:

第2步,遍歷起點(diǎn)A,找到起點(diǎn)A的鄰接頂點(diǎn)B和C。從A到B的距離是5,從A到C的距離是2。把這一信息刷新到距離表當(dāng)中:

第3步,從距離表中找到從A出發(fā)距離最短的點(diǎn),也就是頂點(diǎn)C。第4步,遍歷頂點(diǎn)C,找到頂點(diǎn)C的鄰接頂點(diǎn)D和F(A已經(jīng)遍歷過,不需要考慮!!!!!!!!!!代碼編寫中就需要注意這一點(diǎn))。從C到D的距離是6,所以A到D的距離是2+6=8;從C到F的距離是8,所以從A到F的距離是2+8=10。把這一信息刷新到表中:

接下來重復(fù)第3步、第4步所做的操作:第5步,也就是第3步的重復(fù),從距離表中找到從A出發(fā)距離最短的點(diǎn)(C已經(jīng)遍歷過,不需要考慮),也就是頂點(diǎn)B。第6步,也就是第4步的重復(fù),遍歷頂點(diǎn)B,找到頂點(diǎn)B的鄰接頂點(diǎn)D和E(A已經(jīng)遍歷過,不需要考慮)。從B到D的距離是1,所以A到D的距離是5+1=6,小于距離表中的8;從B到E的距離是6,所以從A到E的距離是5+6=11。把這一信息刷新到表中:

(在第6步,A到D的距離從8刷新到6,可以看出距離表所發(fā)揮的作用。距離表通過迭代刷新,用新路徑長度取代舊路徑長度,最終可以得到從起點(diǎn)到其他頂點(diǎn)的最短距離)第7步,從距離表中找到從A出發(fā)距離最短的點(diǎn)(B和C不用考慮),也就是頂點(diǎn)D。第8步,遍歷頂點(diǎn)D,找到頂點(diǎn)D的鄰接頂點(diǎn)E和F。從D到E的距離是1,所以A到E的距離是6+1=7,小于距離表中的11;從D到F的距離是2,所以從A到F的距離是6+2=8,小于距離表中的10。把這一信息刷新到表中:

第9步,從距離表中找到從A出發(fā)距離最短的點(diǎn),也就是頂點(diǎn)E。第10步,遍歷頂點(diǎn)E,找到頂點(diǎn)E的鄰接頂點(diǎn)G。從E到G的距離是7,所以A到G的距離是7+7=14。把這一信息刷新到表中:

第11步,從距離表中找到從A出發(fā)距離最短的點(diǎn),也就是頂點(diǎn)F。第10步,遍歷頂點(diǎn)F,找到頂點(diǎn)F的鄰接頂點(diǎn)G。從F到G的距離是3,所以A到G的距離是8+3=11,小于距離表中的14。把這一信息刷新到表中:

就這樣,除終點(diǎn)以外的全部頂點(diǎn)都已經(jīng)遍歷完畢,距離表中存儲的是從起點(diǎn)A到所有頂點(diǎn)的最短距離。顯然,從A到G的最短距離是11。(路徑:A-B-D-F-G)
下面附上算法的C++實(shí)現(xiàn)
  1. // dijstra.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。
  2. //
  3. //利用狀態(tài)機(jī)來描述 dijstra算法
  4. //尋求最短路徑


  5. #include "pch.h"
  6. #include <iostream>

  7. using namespace std;

  8. typedef struct {
  9.         char nextPointName;
  10.         int  distance;
  11. }NEXT_POINT;

  12. typedef struct {
  13.         int                curVaule;
  14.         int                expandFlag;
  15.         char        name;
  16.         int                linkNum;
  17.         NEXT_POINT  nextPoint[5];
  18.         char        route[10] = {'A'};
  19. }POINT;

  20. POINT A = { 1000,0,'A' ,2,'B',5,'C',2};
  21. POINT B = { 1000,0,'B' ,2,'D',1,'E',6};
  22. POINT C = { 1000,0,'C' ,2,'D',6,'F',8};
  23. POINT D = { 1000,0,'D' ,2,'E',1,'F',2};
  24. POINT E = { 1000,0,'E' ,1,'G',7};
  25. POINT F = { 1000,0,'F' ,1,'G',3};
  26. POINT G = { 1000,0,'G' };


  27. void Dijkstra(POINT* startPoint, POINT* endPoint, POINT* piontArray, int pointNum);
  28. int main()
  29. {
  30.         POINT array[10] = { A,B,C,D,E,F,G };
  31.         Dijkstra(&A,&G,array,7);
  32.        
  33.         cout << "        最短路徑為        "<<G.route <<endl<<"        最短路徑長度為        "<< G.curVaule  << endl;
  34.         system("pause");
  35. }

  36. void Dijkstra(POINT* startPoint, POINT* endPoint, POINT* piontArray,int pointNum) {
  37.        
  38.         POINT unexpandPoint[20] = {0};
  39.        
  40.         int leftNum = pointNum;
  41.         POINT expandPoint=*(startPoint);       
  42.         int temp = 0;

  43.         for (int i = 0; i < pointNum; ++i) {
  44.                 unexpandPoint[i] = piontArray[i];
  45.         }
  46.         unexpandPoint[0].curVaule = 0;

  47.         while (1) {
  48.                 expandPoint = unexpandPoint[0];
  49.                 for (int i = 0; i < leftNum; ++i) {
  50.                         if (expandPoint.curVaule > unexpandPoint[i].curVaule) {
  51.                                 expandPoint = unexpandPoint[i];
  52.                                 temp = i;
  53.                         }
  54.                 }
  55.                 if (expandPoint.name == endPoint->name) {
  56.                         *(endPoint) = expandPoint;

  57.                         break;
  58.                 }       
  59.                 for (int i = 0; i < leftNum; ++i) {
  60.                         if (i > temp) {
  61.                                 unexpandPoint[i - 1] = unexpandPoint[i];
  62.                         }       
  63.                 }
  64.                 temp = 0;
  65.                 leftNum--;
  66.                 for (int i = 0; i < expandPoint.linkNum; ++i) {       
  67.                         for (int j = 0; j < leftNum; ++j) {
  68.                                 if (expandPoint.nextPoint[i].nextPointName == unexpandPoint[j].name) {
  69.                                         if (unexpandPoint[j].curVaule > expandPoint.nextPoint[i].distance + expandPoint.curVaule) {
  70.                                                 unexpandPoint[j].curVaule = expandPoint.nextPoint[i].distance+ expandPoint.curVaule;                                       
  71.                                         }
  72.                                         if (unexpandPoint[j].curVaule > 1000) {
  73.                                                 unexpandPoint[j].curVaule -= 1000;
  74.                                        
  75.                                         }

  76.                                         //路徑更新
  77.                                         for (int k = 0; k < 10; ++k) {
  78.                                                 unexpandPoint[j].route[k] = 0;                                                               
  79.                                         }
  80.                                         for (int k = 0; k < 10; ++k) {
  81.                                                 if (expandPoint.route[k] != 0) {
  82.                                                         unexpandPoint[j].route[k] = expandPoint.route[k];
  83.                                                 }
  84.                                                 else {
  85.                                                         unexpandPoint[j].route[k] = unexpandPoint[j].name;
  86.                                                         break;
  87.                                                 }
  88.                                         }                                                       
  89.                                 }                       
  90.                         }                                       
  91.                 }               

  92.         }
  93. }
  94. #if 0
  95. ##網(wǎng)上查找到的關(guān)于 dajstra 算法的較精簡的代碼例程

  96. #include<iostream>
  97. #include<cstring>
  98. #define INF 10000000
  99. using namespace std;
  100. int temp[2005][2005], dis[1005];
  101. void dijkstra(int n)
  102. {
  103.         int i, min, flag, j, vis[2005] = { 0 };
  104.         for (i = 1; i <= n; i++) dis[i] = temp[1][i];
  105.         for (i = 1; i < n; i++)
  106.         {
  107.                 min = INF;
  108.                 flag = 0;
  109.                 for (j = 2; j <= n; j++)
  110.                         if (min > dis[j] && !vis[j])
  111.                         {
  112.                                 min = dis[j];
  113.                                 flag = j;
  114.                         }
  115.                 vis[flag] = 1;
  116.                 for (j = 2; j <= n; j++)
  117.                 {
  118.                         if (dis[j] > min + temp[flag][j] && !vis[j])
  119.                                 dis[j] = min + temp[flag][j];
  120.                 }
  121.         }
  122. }
  123. int main()
  124. {
  125.         int t, i, n, k, m, diss;
  126.         while (cin >> t >> n)
  127.         {
  128.                 //memset(temp,INF,sizeof(temp));
  129.                 for (int i = 1; i <= 2000; i++) temp[i][i] = 0;
  130.                 for (int i = 1; i <= 2000; i++)
  131.                         for (int j = 1; j <= 2000; j++)
  132.                                 temp[i][j] = INF;
  133.                 for (int i = 1; i <= t; i++)
  134.                 {
  135.                         cin >> k >> m >> diss;
  136.                         if (diss < temp[k][m])
  137.                         {
  138.                                 temp[k][m] = diss;//雙向?qū)?
  139.                                 temp[m][k] = diss;
  140.                         }
  141.                 }
  142.                 dijkstra(n);
  143.                 //for(int i=1;i<=t;i++) cout<<dis[i]<<endl;
  144.                 cout << dis[n] << endl;
  145.         }
  146.         return 0;
  147. }
  148. #endif

  149. typedef struct {
  150.         float x[2];     /* state: [0]-angle [1]-diffrence of angle, 2x1 */
  151.         float A[2][2];  /* X(n)=A*X(n-1)+U(n),U(n)~N(0,q), 2x2 */
  152.         float H[2][2];     /* Z(n)=H*X(n)+W(n),W(n)~N(0,r), 1x2   */
  153.         float q[2];     /* process(predict) noise convariance,2x1 [q0,0; 0,q1] */
  154.         float r[2][2];        /* measure noise convariance */
  155.         float p[2][2];  /* estimated error convariance,2x2 [p0 p1; p2 p3] */
  156.         float gain[2][2];  /* 2x1 */
  157.         float B[2];
  158. } kalman2_state;

  159. //z軸kalman濾波初始化,初始化時用
  160. // kalman2_init(&BaroAlt_klm);
  161. //輸入氣壓計高度,速度和慣性坐標(biāo)下的加速度---------輸出高度和速度
  162. // kalman2_filter(&BaroAlt_klm, BaroAltoo, 0, az_c);

  163. void kalman2_init(kalman2_state *state)//, float *init_x, float (*init_p)[2]//×îºóÖ»Ðèµ÷ÊÔq[0],q[1];
  164. {
  165.         //    state->x[0]    = init_x[0];
  166.         //    state->x[1]    = init_x[1];
  167.         //    state->p[0][0] = init_p[0][0];
  168.         //    state->p[0][1] = init_p[0][1];
  169.         //    state->p[1][0] = init_p[1][0];
  170.         //    state->p[1][1] = init_p[1][1];
  171.         state->x[0] = 0;
  172.         state->x[1] = 0;
  173.         state->p[0][0] = 1;
  174.         state->p[0][1] = 0;
  175.         state->p[1][0] = 0;
  176.         state->p[1][1] = 1;
  177.         //          state->A       = {{1, 0.1}, {0, 1}};
  178.         state->A[0][0] = 1;
  179.         state->A[0][1] = 0.01;//1;//t¿É±ä  Á½¸öÎïÀíʱ¿ÌµÄ²î2ms      PID_PIT.I*0.27;//0.0027
  180.         state->A[1][0] = 0;
  181.         state->A[1][1] = 1;
  182.         //          state->H       = {1,0};
  183.         state->H[0][0] = 1;
  184.         state->H[0][1] = 0;//1
  185.         state->H[1][0] = 0;
  186.         state->H[1][1] = 0;
  187.         //    state->q       = {{10e-6,0}, {0,10e-6}};  /* measure noise convariance */               
  188.         state->q[0] = 5 * 10e-8;//5;//0.0001;//10e-7;//10e-7;
  189.         state->q[1] = 5 * 10e-8;//10e-6;//0.5;//0.0035;//5*10e-7;
  190.         state->r[0][0] = 1 * 10e-7;//10e-4;//52.4586;//0.1;//10e-3;//10e-7;  /* estimated error convariance */PID_ROL.D*
  191.         state->r[0][1] = 0;
  192.         state->r[1][0] = 0;
  193.         state->r[1][1] = 4 * 10e-4;
  194.         //    state->B               
  195.         state->B[0] = state->A[0][1] * state->A[0][1] / 2.0;
  196.         state->B[1] = state->A[0][1];
  197. }

  198. float kalman2_filter(kalman2_state *state, float x_weiyi, float x_speed, float a)//£¨¶þά¿¨¶ûÂüÂ˲¨£©Ö»±äÒ»¸ö£¬Ðè¸Ä½øÎ»ÒÆ¡¢ËÙ¶È,ÕæÕýµÄ¼ÓËÙ¶È£¨Ð޸ĺó£©
  199. {
  200.         float temp0 = 0.0f;
  201.         float temp1 = 0.0f;
  202.         float temp0_0 = 0.0f;
  203.         float temp0_1 = 0.0f;
  204.         float temp1_0 = 0.0f;
  205.         float temp1_1 = 0.0f;
  206.         float temp00 = 0.0f;
  207.         float temp01 = 0.0f;
  208.         float temp10 = 0.0f;
  209.         float temp11 = 0.0f;

  210.         /* Step1: Predict X(k+1)= A*X(k) +B*U(k)*/
  211.         state->x[0] = state->A[0][0] * state->x[0] + state->A[0][1] * state->x[1] + state->B[0] * a;//ת»»Íê×ø±ê·½¿ÉʹÓÃ
  212.         state->x[1] = state->A[1][0] * state->x[0] + state->A[1][1] * state->x[1] + state->B[1] * a;
  213.         /* Step2: Covariance Predict P(k+1)=A*P(k)*(A^T)+Q;*/
  214.         state->p[0][0] = (state->p[0][0] + state->p[1][0] * state->A[0][1]) + (state->p[0][1] + state->p[1][1] * state->A[0][1])*state->A[0][1] + state->q[0];
  215.         state->p[0][1] = state->p[0][1] + state->p[1][1] * state->A[0][1];//+state->q[0];
  216.         state->p[1][0] = state->p[1][0] + state->p[1][1] * state->A[0][1];//+state->q[1];
  217.         state->p[1][1] = state->p[1][1] + state->q[1];
  218.         /* Step3: Gain Measurement : gain = p * H^T * [r + H * p * H^T]^(-1), H^T means transpose.  µÚÈý¸ö¹«Ê½×ª»»*/
  219.         temp0_0 = (state->p[0][0] + state->r[0][0])*(state->p[1][1] + state->r[1][1]) - (state->p[0][1] + state->r[0][1])*(state->p[1][0] + state->r[1][0]);//ÕýÈ·//r¶Ô½ÇÕó
  220.         temp0_1 = (state->p[0][0] + state->r[0][0])*(state->p[1][1] + state->r[1][1]) - (state->p[0][1] + state->r[0][1])*(state->p[1][0] + state->r[1][0]);
  221.         temp1_0 = (state->p[0][0] + state->r[0][0])*(state->p[1][1] + state->r[1][1]) - (state->p[0][1] + state->r[0][1])*(state->p[1][0] + state->r[1][0]);
  222.         temp1_1 = (state->p[0][0] + state->r[0][0])*(state->p[1][1] + state->r[1][1]) - (state->p[0][1] + state->r[0][1])*(state->p[1][0] + state->r[1][0]);
  223.         temp00 = state->p[1][1] / temp0_0;
  224.         temp01 = -state->p[0][1] / temp0_1;
  225.         temp10 = -state->p[1][0] / temp1_0;
  226.         temp11 = state->p[0][0] / temp1_1;
  227.         state->gain[0][0] = state->p[0][0] * temp00 + state->p[0][1] * temp10;
  228.         state->gain[0][1] = state->p[0][0] * temp01 + state->p[0][1] * temp11;
  229.         state->gain[1][0] = state->p[1][0] * temp00 + state->p[1][1] * temp10;
  230.         state->gain[1][1] = state->p[1][0] * temp01 + state->p[1][1] * temp11;
  231.         /* Step4: Status Update : x(n|n) = x(n|n-1) + gain(n) * [z_measure - H(n)*x(n|n-1)]*/
  232.         state->x[0] = state->x[0] + state->gain[0][0] * (x_weiyi - state->x[0]) + state->gain[0][1] * (x_speed - state->x[1]); //ΪºÎÖ»ÓÃÒ»¸ö²ÎÊý
  233.         state->x[1] = state->x[1] + state->gain[1][0] * (x_weiyi - state->x[0]) + state->gain[1][1] * (x_speed - state->x[1]);
  234.         /* Step5: Covariance Update p: p(n|n) = [I - gain * H] * p(n|n-1)  ¸üÐÂp*/
  235.         temp0 = state->p[0][0];
  236.         temp1 = state->p[0][1];
  237.         state->p[0][0] = (1 - state->gain[0][0]) * state->p[0][0] - (state->gain[0][1] * state->p[1][0]);
  238.         state->p[0][1] = (1 - state->gain[0][0]) * state->p[0][1] - (state->gain[0][1] * state->p[1][1]);
  239.         state->p[1][0] = (1 - state->gain[1][1]) * state->p[1][0] - state->gain[1][0] * temp0;//state->p[0][0]
  240.         state->p[1][1] = (1 - state->gain[1][1]) * state->p[1][1] - state->gain[1][0] * temp1;//state->p[0][1]

  241.         return 1;
  242. }
復(fù)制代碼
全部資料51hei下載地址:
Dijstra.rar (3 KB, 下載次數(shù): 9)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:540551 發(fā)表于 2019-5-17 11:26 | 只看該作者
想不到編輯之后、會亂成這個樣子
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本久久网 | 精品九九久久 | 久久久久国产 | 亚洲一区二区三区观看 | 精品国产一区二区三区久久久蜜月 | 亚洲成av人影片在线观看 | 波多野结衣中文字幕一区二区三区 | 日韩欧美在线观看 | 成人午夜免费福利视频 | 日韩理论电影在线观看 | 亚洲永久| 欧美精品一二三 | 色综合99 | 久久精品成人一区 | 欧美日韩在线观看一区 | 午夜日韩 | 国产第1页 | 天天拍天天草 | 免费在线观看av网站 | 国产精品久久久久久 | www97影院| 欧美黄色片 | 一区二区视频在线 | 亚洲91精品| 欧美啊v在线观看 | 国产精品久久久久久久久大全 | 欧美一区2区三区4区公司 | 91精品国产91久久综合桃花 | 夜夜摸天天操 | 国产精品色一区二区三区 | 欧美精品一区三区 | 欧美日韩一区二区电影 | 99精品免费视频 | 久久久久中文字幕 | 日韩欧美在线视频 | 国产综合第一页 | 日韩精品一区二区三区四区 | 久久av一区| 黄色综合 | av在线免费观看网址 | 日日日操 |