A. 如何使用深度優先搜索、廣度優先搜索和迭代搜索演算法來解決城市最短路徑問題
若需對vector, string, deque, 或 array容器進行全排序,你可選擇sort或stable_sort;
若只需對vector, string, deque, 或 array容器中取得top n的元素,部分排序partial_sort是首選.
若對於vector, string, deque, 或array容器,你需要找到第n個位置的元素或者你需要得到top n且不關系top n中的內部順序,nth_element是最理想的;
若你需要從標准序列容器或者array中把滿足某個條件或者不滿足某個條件的元素分開,你最好使用partition或stable_partition;
若使用的list容器,你可以直接使用partition和stable_partition演算法,你可以使用list::sort代替sort和stable_sort排序。若你需要得到partial_sort或nth_element的排序效果,你必須間接使用。正如上面介紹的有幾種方式可以選擇。
B. 地鐵最小換乘和最短路線怎麼算
最小換乘是根據資料庫的。這個演算法很簡單就是一個遞歸函數而已。如這里有地鐵站A和B。我們要打A->B的最小換乘。第一步:看A所在的每個路線里是否存在B,如A站有線路a,b,檢查線路a,b中是否含B,如果含就取出結果。否則進入第二步。;第二步:對A站所在的所有線路的站點進行第一步那樣搜索,如a線路第一站為C,則又找C->B的。 就這樣不停的遞歸就行了。。。
有必要說明的是任何演算法都要建立在實際的基礎上,如果不符合實際再精妙的演算法也是不好的。。換乘的法,一般到兩次就行了,,換乘次數多了明顯是不符合實際的。。所以你不必寫出完整的演算法,只需單獨寫出換乘一次,二次的就行了。。很簡單的。。
最短路徑,我建議建立「圖」吧。讓每條邊的權重為它的長度,然後用圖相關的演算法就可以實現了。。
我建議先找到二次以內的換乘方案。然後再計算每一次換乘的距離,最終取出路徑最小的方案。。如果用上面哪種方法的話,可以得到最短路徑,,但可能要換乘很多次,那樣也不符合實際.
我刻我當初在做公交查詢時就給每個站點和它們之間的路徑建立一個網路,,最終分析這個幾何網路得到最短路徑..可結果很遺憾,,,最短路徑是得到了..可是換乘大多..太不符合實際了...
希望能幫到你~~
C. "最短路徑優先演算法"的優缺點
這個演算法一般出現在網路中,用於路由器的路由定址,我也只了解這方面的優缺點。如果不對,LZ就別看了。
所謂最短路徑,實際上說的是跳數。比如從一條路走會經過三個路由器,而從另一條路走,會經過兩個路由器,那麼此演算法會判斷2跳比3跳要短,但具體每一跳會花多長時間,經過多長路程,它不會考慮的。所以不一定演算法的最短路徑就是真實的最短。因為很多因素演算法沒有考慮,比如通信質量,網線長度……
C語言我只看過一個模擬現實的例子,大概是說公車走什麼路線長度最短,那個演算法考慮的是路線的長短,而不是跳數,優點當然就是路線的絕對最短,缺點就是沒考慮到其他現實因素,比如是否堵車(相當於網路通信質量)之類。
總之不管什麼演算法,考慮到的因素就是它的優點,反過來說,缺點往往就是演算法忽略的因素。
補充一下,如果說的不是演算法本身的優劣,而是細節的實現方面,那就是從時間復雜度和空間復雜度兩個方面去考慮了,希望對LZ有用。
D. 什麼是路徑搜索演算法
舉個例子你大概就明白了,假設從上海東方明珠電視塔到北京天安門有N條線路,可以上海-天津-北京,上海-南京-北京,上海-廣州-西藏-北京等等等,選擇一條需要的線路這就是路徑搜索,用來實現該選擇的演算法是路徑搜索演算法,可以選擇最短路徑,關鍵路徑,如果有費用(權值)就可以選擇最便宜路徑(權最小),如果有路徑需用時(飛機、火車,有些地方只有單一交通工具)就可以選擇時間最短路徑
用於計算機中的路徑搜索就比較廣泛了,但大體就是根據上述情況變化來得
E. 如果要尋找兩個公交站之間最佳的換乘路徑用哪種數據結構比較好
你想的太簡單了。
首先,站之間相隔站點最少 不一定就是路徑最短。
其次,線路換乘的問題要考慮多條線路交叉選擇 絕對不是線性表可以解決的。
用圖解決不是理論上的問題,這是一個常識問題。
你這樣隨口回答人家,除非你補充出你特殊的理由,不然絕對會被人當成門外漢對待的。
F. 求數據結構公交線路咨詢的代碼用java,其中求最短路徑用Floyd演算法
不知道你想怎麼搞 反正感覺A*演算法也可以,網上一大堆,還有就是Dijkstra演算法
G. 最短路徑演算法
Dijkstra演算法,A*演算法和D*演算法
Dijkstra演算法是典型最短路演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。Dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。
Dijkstra演算法是很有代表性的最短路演算法,在很多專業課程中都作為基本內容有詳細的介紹,如數據結構,圖論,運籌學等等。
Dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用OPEN, CLOSE表方式,Drew為了和下面要介紹的 A* 演算法和 D* 演算法表述一致,這里均採用OPEN,CLOSE表的方式。
大概過程:
創建兩個表,OPEN, CLOSE。
OPEN表保存所有已生成而未考察的節點,CLOSED表中記錄已訪問過的節點。
1. 訪問路網中里起始點最近且沒有被檢查過的點,把這個點放入OPEN組中等待檢查。
2. 從OPEN表中找出距起始點最近的點,找出這個點的所有子節點,把這個點放到CLOSE表中。
3. 遍歷考察這個點的子節點。求出這些子節點距起始點的距離值,放子節點到OPEN表中。
4. 重復2,3,步。直到OPEN表為空,或找到目標點。
提高Dijkstra搜索速度的方法很多,常用的有數據結構採用Binary heap的方法,和用Dijkstra從起始點和終點同時搜索的方法。
A*(A-Star)演算法是一種啟發式演算法,是靜態路網中求解最短路最有效的方法。
公式表示為: f(n)=g(n)+h(n),
其中f(n) 是節點n從初始點到目標點的估價函數,
g(n) 是在狀態空間中從初始節點到n節點的實際代價,
h(n)是從n到目標節點最佳路徑的估計代價。
保證找到最短路徑(最優解的)條件,關鍵在於估價函數h(n)的選取:
估價值h(n)<= n到目標節點的距離實際值,這種情況下,搜索的點數多,搜索范圍大,效率低。但能得到最優解。
如果 估價值>實際值, 搜索的點數少,搜索范圍小,效率高,但不能保證得到最優解。
估價值與實際值越接近,估價函數取得就越好。
例如對於幾何路網來說,可以取兩節點間歐幾理德距離(直線距離)做為估價值,即f=g(n)+sqrt((dx-nx)*(dx-nx)+(dy-ny)*(dy-ny));這樣估價函數f在g值一定的情況下,會或多或少的受估價值h的制約,節點距目標點近,h值小,f值相對就小,能保證最短路的搜索向終點的方向進行。明顯優於Dijstra演算法的毫無無方向的向四周搜索。
conditions of heuristic
Optimistic (must be less than or equal to the real cost)
As close to the real cost as possible
主要搜索過程:
創建兩個表,OPEN表保存所有已生成而未考察的節點,CLOSED表中記錄已訪問過的節點。
遍歷當前節點的各個節點,將n節點放入CLOSE中,取n節點的子節點X,->算X的估價值->
While(OPEN!=NULL)
{
從OPEN表中取估價值f最小的節點n;
if(n節點==目標節點) break;
else
{
if(X in OPEN) 比較兩個X的估價值f //注意是同一個節點的兩個不同路徑的估價值
if( X的估價值小於OPEN表的估價值 )
更新OPEN表中的估價值; //取最小路徑的估價值
if(X in CLOSE) 比較兩個X的估價值 //注意是同一個節點的兩個不同路徑的估價值
if( X的估價值小於CLOSE表的估價值 )
更新CLOSE表中的估價值; 把X節點放入OPEN //取最小路徑的估價值
if(X not in both)
求X的估價值;
並將X插入OPEN表中; //還沒有排序
}
將n節點插入CLOSE表中;
按照估價值將OPEN表中的節點排序; //實際上是比較OPEN表內節點f的大小,從最小路徑的節點向下進行。
}
A*演算法和Dijistra演算法的區別在於有無估價值,Dijistra演算法相當於A*演算法中估價值為0的情況。
動態路網,最短路演算法 D*A* 在靜態路網中非常有效(very efficient for static worlds),但不適於在動態路網,環境如權重等不斷變化的動態環境下。
D*是動態A*(D-Star,Dynamic A*) 卡內及梅隆機器人中心的Stentz在1994和1995年兩篇文章提出,主要用於機器人探路。是火星探測器採用的尋路演算法。
主要方法:
1.先用Dijstra演算法從目標節點G向起始節點搜索。儲存路網中目標點到各個節點的最短路和該位置到目標點的實際值h,k(k為所有變化h之中最小的值,當前為k=h。每個節點包含上一節點到目標點的最短路信息1(2),2(5),5(4),4(7)。則1到4的最短路為1-2-5-4。
原OPEN和CLOSE中節點信息保存。
2.機器人沿最短路開始移動,在移動的下一節點沒有變化時,無需計算,利用上一步Dijstra計算出的最短路信息從出發點向後追述即可,當在Y點探測到下一節點X狀態發生改變,如堵塞。機器人首先調整自己在當前位置Y到目標點G的實際值h(Y),h(Y)=X到Y的新權值c(X,Y)+X的原實際值h(X).X為下一節點(到目標點方向Y->X->G),Y是當前點。k值取h值變化前後的最小。
3.用A*或其它演算法計算,這里假設用A*演算法,遍歷Y的子節點,點放入CLOSE,調整Y的子節點a的h值,h(a)=h(Y)+Y到子節點a的權重C(Y,a),比較a點是否存在於OPEN和CLOSE中,方法如下:
while()
{
從OPEN表中取k值最小的節點Y;
遍歷Y的子節點a,計算a的h值 h(a)=h(Y)+Y到子節點a的權重C(Y,a)
{
if(a in OPEN) 比較兩個a的h值
if( a的h值小於OPEN表a的h值 )
{ 更新OPEN表中a的h值;k值取最小的h值
有未受影響的最短路經存在
break;
}
if(a in CLOSE) 比較兩個a的h值 //注意是同一個節點的兩個不同路徑的估價值
if( a的h值小於CLOSE表的h值 )
{
更新CLOSE表中a的h值; k值取最小的h值;將a節點放入OPEN表
有未受影響的最短路經存在
break;
}
if(a not in both)
將a插入OPEN表中; //還沒有排序
}
放Y到CLOSE表;
OPEN表比較k值大小進行排序;
}
機器人利用第一步Dijstra計算出的最短路信息從a點到目標點的最短路經進行。
D*演算法在動態環境中尋路非常有效,向目標點移動中,只檢查最短路徑上下一節點或臨近節點的變化情況,如機器人尋路等情況。對於距離遠的最短路徑上發生的變化,則感覺不太適用。
H. 公交路線查詢系統中查詢時用到的演算法,如最短路徑演算法,如何用jsp實現呢求各位幫忙!
我有C++的演算法
JSP我不懂啊,看看能不能對你有幫助啊,是和JS一樣的東西嗎
我懂JS,asp.net,C#不知道這里邊有沒有JSP的東西啊.
下面代碼的核心演算法在CAL這個函數裡面
#include<iostream>
using namespace std;
const int MAX=1000;
const int INF=1000000000;
class SPFA
{
public: int n;//表示圖裡面的點數
public: int path[MAX][MAX];//定義鏈接矩陣最多是1000個點
public: int dis[MAX];//定義源點到其他點的距離
public: int src;//定義源點
public:void Cal()
{
int i,j,k;
bool used[MAX]={false};//定義點是否訪問過了,初始化為未訪問
for(i=0;i<n;i++)//初始化一下到各個點的距離
{
dis[i]=path[src][i];
}
dis[src]=0;
int min_=INF;
for(i=0;i<n;i++)
{
k=-1;
min_=INF;
for(j=0;j<n;j++)
{
if(dis[j]<min_&&!used[j])
{
min_=dis[j];
k=j;
}
}
if(k==-1)//已經找不到有路可走的點
{
return;
}
used[k]=true;
for(j=0;j<n;j++)
{
if(!used[j]&&dis[j]>min_+path[k][j])//如果從k點走到j點的路很比原來的要短,那麼更新
{
dis[j]=min_+path[k][j];
}
}
}
}
};
//int _tmain(int argc, _TCHAR* argv[])
int main()
{
//按照下面的數據格式輸入,-1表示沒有路,自己到自己是0
/*
3
0 -1 -1
3 0 -1
3 4 0
3
0 100 1
3 0 -1
3 4 0
3
0 1 2
3 0 -1
3 4 0
*/
SPFA* a=new SPFA();
cin>>a->n;
int i,j;
for(i=0;i<a->n;i++)
{
for(j=0;j<a->n;j++)
{
//scanf("%d",&a->path[i][j]);
cin>>a->path[i][j];
if(a->path[i][j]==-1)
{
a->path[i][j]=INF;
}
}
}
a->src=0;//源點暫時定為0,你自己改吧
a->Cal();
for(i=0;i<a->n;i++)
{
//printf("dis[%d]=%d\n",i,a->dis[i]);
cout<<"dis";
cout<<"[";
cout<<i;
cout<<"]=";
cout<<a->dis[i];
cout<<"\n";
}
return 0;
}
I. 公交線路最優演算法
可以理解,如果某條公交車線路是從A地到E地的最短路徑,則其子路也必是最短的。即如果最短路徑為A→B→C→D→E,那麼C→D→E必是C到E的最短路徑。否則用反證法,必可找到一條更短的路線,就與前面矛盾了。最短路徑的上述特性,啟發我們從終點開始,從後向前逐步遞推,求出各站到目的地E的最短子路,最後求出從A站到E站的最短路徑。