最短路徑模型_第1頁
最短路徑模型_第2頁
最短路徑模型_第3頁
最短路徑模型_第4頁
最短路徑模型_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

裝訂線第十一屆西北工業(yè)大學數(shù)學建模競賽暨全國大學生數(shù)學建模競賽選拔賽題目(B)題密封號2010年5月4日剪切線密封號2010年5月4日機電工程學院第隊隊員1隊員2隊員3姓名葉鑫林馮士恒李棟班級040831640408311504083018送貨路線設計問題提綱:1.提出問題;2.模型分析和簡單摘要;3.模型假設;4.符號設定;5.模型建立和求解;6.模型評價和建議;7.附錄:程序以及結(jié)果。1.提出問題:現(xiàn)今社會網(wǎng)絡越來越普及,網(wǎng)購已成為一種常見的消費方式,隨之物流行業(yè)也漸漸興盛,每個送貨員需要以最快的速度及時將貨物送達,而且他們往往一人送多個地方,請設計方案使其耗時最少?,F(xiàn)有一快遞公司,庫房在圖1中的O點,一送貨員需將貨物送至城市內(nèi)多處,請設計送貨方案,使所用時間最少。該地形圖的示意圖見圖1,各點連通信息見表3,假定送貨員只能沿這些連通線路行走,而不能走其它任何路線。各件貨物的相關(guān)信息見表1,50個位置點的坐標見表2。假定送貨員最大載重50公斤,所帶貨物最大體積1立方米。送貨員的平均速度為24公里/小時。假定每件貨物交接花費3分鐘,為簡化起見,同一地點有多件貨物也簡單按照每件3分鐘交接計算?,F(xiàn)在送貨員要將100件貨物送到50個地點。請完成以下問題。1.假設將1~30號貨物送到指定地點并返回。設計最快完成路線與方式。給出結(jié)果。要求標出送貨線路。2.假定該送貨員從早上8點上班開始送貨,要將1~30號貨物的送達時間不能超過指定時間,請設計最快完成路線與方式。要求標出送貨線路。3.假設不需要考慮所有貨物送達時間限制(包括前30件貨物),現(xiàn)在要將100件貨物全部送到指定地點并返回。設計最快完成路線與方式。要求標出送貨線路,給出送完所有快件的時間。由于受重量和體積限制,送貨員可中途返回取貨??刹豢紤]中午休息時間。以上各問盡可能給出模型與算法。我們的核心算法就是迪杰斯特拉算法,我們自己基于javascript編寫的。2.模型分析和摘要:本文將貨點實體間的線路選擇抽象為圖論最短路模型采用0-1整數(shù)規(guī)劃表述。建立直達數(shù)據(jù)庫Q作為數(shù)據(jù)基庫,根據(jù)用戶需求建立不同目標的0-1規(guī)劃模型運用蟻群算法與迪杰斯特拉算法分別求解,最終方案即通過多限制條件下用javascript編程得到最優(yōu)效果輸出。第一問屬于典型VRP問題,在數(shù)據(jù)處理階段發(fā)現(xiàn)載重和體積均符合要求,總量不多于五十公斤,體積不大于單位1,不用考慮這兩方面限制條件,所以可以解決但是實際生活中可能出現(xiàn)有限制的條件,所以為了嚴謹我們考慮了限制條件。先建立站點至站點直達數(shù)據(jù)庫Q來描述兩兩可直達站點的所有線路,用到時,系統(tǒng)首先查詢Q,得到所有直達方案。由于三問都是類似條件下的VRPTW問題,所以我們之間利條件最強的模型,針對各問對約束條件的弱化和強化程度分別調(diào)用。建立模型,用迪杰斯特拉算法的衍生算法為核心來做,結(jié)合多個限制條件選出最優(yōu)解。對于各個小函數(shù)及用途在后面說明。為了能夠為用戶提供多種備選方案,我們首先使用基于迪杰斯特拉算法求解,得到不同目標下的多種優(yōu)化方案;然后用限制條件求得全局最優(yōu)解;兩種方法求解步驟見后文,其中解決方案為解決方案如下:<br>送貨路線:0=>18=>13=>19=>24=>27=>34=>40=>45=>42=>49=>42=>43=>38=>35=>32=>23=>17=>14=>21=>36=>31=>27=>26=>0=><br>總路程〔單位:米〕:53567<br>花費時間〔單位:分鐘〕:223<br>兩種求解方法的優(yōu)劣在后文中給出了詳細評價。第二問考慮有了時間限制,新的限制條件在模型一中,所以可以繼續(xù)用模型以來求解,而模型一中的時間限制為軟限制,既符合實際條件,也符合題目中的要求。結(jié)合實際,提出了本文的研究問題—有時間窗的送貨員路徑問題(VRPTW),建立了以送貨員容量和客戶需求等為約束條件,以配送運輸本錢為目標函數(shù)的VRPTW數(shù)學模型。在軟限制條件下的求解,因為實際情況下很難讓所有人都滿意,所以決策上只能找最優(yōu)解,可以根據(jù)客戶的重要程度權(quán)衡可以允許的延誤程度,在效勞本錢及客戶滿意度之間找到一個較為理想的平衡點。有軟時間窗的VRP允許發(fā)生延誤,但對延誤發(fā)生的程度和頻率有一定限制,這主要通過對延誤的懲罰程度來表達的。在建模時表現(xiàn)為目標函數(shù)增加了一項懲罰項,造成目標函數(shù)值的增加。第二問答案為:解決方案如下:<br>送貨路線:0=>18=>13=>19=>24=>27=>34=>40=>45=>42=>49=>42=>43=>38=>36=>31=>39=>31=>36=>38=>35=>32=>23=>17=>14=>21=>26=>0<br>總路程〔單位:米〕:61459<br>花費時間〔單位:分鐘〕:303<br>第三問因為時間有限,程序過于復雜且難于調(diào)試,故沒有求出最優(yōu)方案。Pi(Si):懲罰函數(shù)。假設送貨員在Eti前到達i,或送貨員在LTi之后到達,那么效勞延誤,需支付一定的罰金,因此p*(Si);設定如公式(3一8)所示Pi(Si)=ai(Eti-Si),Si<ETiPi(Si)=0,Eti≤Si≤Lti〔3——1〕Pi(Si)=bi(Si-LTi),Si>Ltiai,bi為懲罰系數(shù),對某些重要的顧客或者對時間要求比擬苛刻的顧客可能很大。第三問完全符合模型一,只是少了時間窗,即要求最大可能滿足〔體積和重量必須嚴格滿足〕的情況下路程最短。對于懲罰堵措施,由于時間關(guān)系沒做出來程序,但我們覺得這個很有必要,對公司的信譽度以及顧客的滿意程度都有很大的作用。最后我們給出了送貨員路徑問題的一些想法和建議,并提出了改良方案。關(guān)鍵字:貨物運送蟻群算法迪杰斯特拉算法送貨員路徑問題VRPTWjavascript3.模型假設:1.送貨員的效勞質(zhì)量一直相同;2.城市的交通沒有負擔,不會在路上耽誤時間;3.被配送的物資可混裝,不能混裝需單獨處理;4.流通中心有足夠的物資可配送;5.滿足所有任務點的品種、數(shù)量、規(guī)格需求;6.各配送路線的貨物量不得超過送貨員容積和載重量,否那么將會受罰;7.接貨點不會耽誤送貨員的時間;8.送貨員中途不會發(fā)生意外或者突發(fā)事件;9.每一個客戶的時間不是特別嚴格,允許出現(xiàn)一定概率的突發(fā)事件;10.送貨員在選好目的點之后會按照選出的最短路徑走;11.顧客不會因為提前貨物到達而責怪送貨員,是送貨員的信譽度降低;4.符號的約定:〔1〕對于蟻群算法變量和參數(shù)符號按如下定義:令G一(V,E)為一無向圖,V表示頂點集,E為邊集,頂點V1,V2,V3,……Vn為客戶,V0吃飯吃菜vcvvvcvcvcvvccv為配貨中心;K:k個送貨員,k;Cij:從i到j的運輸本錢;qi:客戶i的需求量;dij:從i到j的距離;W:送貨員的裝載能力;C:最大體積;tij:送貨員從i到j的行駛時間;Si:送貨員到達vi的時間;Ti:送貨員在vi處的卸貨時間;Xij:決策變量,表示車是否從i出發(fā)后開向j,如果是,Xij值為1,否那么,其值為0Eti,Lti:[ETi,LTi]為客戶i的時間窗口,其中,Eti是客戶要求到貨時間段的始點,Lti是客戶要求到貨時間段的終點;5.模型建立和模型求解:〔1〕數(shù)據(jù)分析:1.通過對貨物點坐標的分析,所有的貨物點坐標都在X坐標〔0-16000〕和Y坐標〔0-16000〕,且都在以O點為坐標的圓中;2.每一個貨物的重量都小于五公斤,且體積都小于單位一;3.位置關(guān)系表都明確,且兩點之間均可到達;由以上分析,建立本文所要解決的VRPTW數(shù)學模型如下:目標函數(shù):minZ=∑∑CijXij(i=1,2,3,…..n;j=1,2,3……n)約束條件:∑(di∑xij)≤q〔3-2〕ai<≤si≤bii∈n〔3-3〕∑xij=1(i∈nj=1,2,3......n)〔3-4〕∑x0j=1(j=1,2,3......n)〔3-5〕∑xih-∑xhj=0(h∈n,j=1,2,3......n,i=1,2,3,…..n)〔3-6〕∑xi,n+1=1〔3-7〕Sij+tij-K(1-xij)≤sj(I,j∈n)〔3-8〕Xij∈(0,1)(i,j∈n)〔3-9〕問題的目標是求總的送貨員路徑路程的最小值(3一1),約束條件主要是車載,時間窗的開始時間和最晚時間。VRPTW的一個可行解要效勞于所有的用戶并且送貨員不能超過送貨員的最大容量(3一2)或者是送貨員的時間限制(3一3),除此之外,每個用戶只能也僅只被一個送貨員所效勞(3一4),等式(3一5)一(3一7)確保每個過程都從節(jié)點0開始,截止于節(jié)點N+l;(3一8)表示在效勞完用戶i后仍然有時間趕上用戶j。每次送貨員都是從0點開始走?!?〕模型求解:1.問題一:本問題主要討論迪杰斯特拉算法在VRPTW的應用,綜合以最遠點為核心的最短路徑法,多限制條件下的最優(yōu)解法,在載重。體積和時間限制下的最短路徑,然后綜合蟻群算法對以上算法進行比擬○路徑最短且最優(yōu),行程載重和體積攜帶量最適宜;○懲罰度措施適宜;○求得最優(yōu)解;基于此,問題共分為四個局部:1.數(shù)據(jù)處理,將每個貨物的質(zhì)量體積和時間窗以及貨物點是否直達用表格給出;2.對于具體的數(shù)據(jù)進行分扇區(qū)處理,角度尋求最優(yōu)解,然后在每一個扇區(qū)中尋找最遠點,然后在時間窗優(yōu)先的條件下,對重量和體積進行篩選;3.所有路徑點確定之后,用迪杰斯特拉算法尋找最優(yōu)路徑;4.綜合蟻群算法進行比擬迪杰斯特拉的算法。1.數(shù)據(jù)處理:因為給的是貨物運送點以及目的地的坐標位置,以及目的地之間是否直達,所以制成表格之后在附錄中附有。通過在程序中建立關(guān)系對應表,把位置點和對應的坐標寫出來。2.具體分析:由于三個問題具有統(tǒng)一特征,所以我們只建立了一個模型,只是在這個模型中條件被要求的多少不同,既可以對某些條件弱化或者不考慮,綜上,所以將各個小函數(shù)的用途先表示出來:〔1.〕首先對圖中所有的坐標進行距離篩選,根據(jù)坐標由二次關(guān)系比擬求出圖中最遠的點,然后將這個點的地址傳出去,思想即為以此點和O點為中心線,建立扇區(qū)〔扇區(qū)確實定在下個函數(shù)中表達〕,然后進行篩選。1.//算兩點,兩點(忽略是否聯(lián)通)返回之間距離,否那么返回-1functiondistance(a,b){varmydistancea-=1b-=1;mydistance=Math.sqrt(((aim[a]._x-aim[b]._x)*(aim[a]._x-aim[b]._x))+((aim[a]._y-aim[b]._y)*(aim[a]._y-aim[b]._y)));return(mydistance);}2.//最遠點函數(shù)functionfarest(mygoods){varmygoods2varmyreturnmygoods2=mygoods.split("|")varmyfu=distance(mygoods2[0],0);varmysi=0;varmyreturn;for(vari=0;i<mygoods2.length;i++){if(distance(mygoods2[i],0)>=myfu){myfu=distance(mygoods2[i],0);mysi=i;}}myreturn=mygoods2[mysi]return(myreturn);}//將地址傳出去〔3〕首先將最遠點在沒有篩選條件下有〔1〕程序得到,然后有兩點即可以和等待帥選點求出篩選點距中心線的角度,和三十度角〔六十度的二分之一〕進行比擬,可以求出是否在規(guī)定扇區(qū)內(nèi)。如假設在既可以考慮此點,進行下一步。//i為等待篩選點,b為最遠點,出發(fā)點已定,來確定i和出發(fā)點的夾角。functionangel(i,b){varmya=distance(i,b);varmyb=distance(0,i);varmyc=distance(0,b);varmys=(myb*myb+myc*myc-mya*mya)/(2*myb*myc);varangel=Math.acos(mys);return(angel)}〔4〕根據(jù)角度函數(shù)篩選出來扇形區(qū)域內(nèi)的所有點,扇形角度暫定為60度,然后將扇區(qū)內(nèi)所有否合要求的點找出來,這些點即為合理點,然后對這些點在下一步進行條件限制。//根據(jù)角度函數(shù)篩選出來扇形區(qū)域內(nèi)的合理點,扇形角度暫定為60度functionmychoice(b){varmysi;varmycho;varmylast;for(i=0;i++;i<=50){if(angel(i,b)<=bigangle/2){mysi=i;//參加分隔符,但最后一個數(shù)還是”|“mycho+=String(mysi)+"|";}}mycho=mycho.substr(0,mycho.length-1);//來去除最后個分隔符,用length函數(shù)來判斷長度mycho[mycho.length-1]="";//這是篩選出的字符串。return(mycho);}〔5〕//篩選適宜的點;functionfit(mycho){varstring2;varmystring;varmystring1;myb=sortvolumn(mycho);varmyb1=myb.split("|");varmyweight=goods[myb1].weight; for(vari=0;i<myb1.length;i++) { if(mysum<=1) { mysum=mysum+myvolumn[i]; mynum=i; }//將滿足體積條件的點傳送到myvolumn1,點的個數(shù)即為mynum; myvolumn1[i]=myvolumn[i]; } for(varj=0;j<myvolumn1.length;j++) { if(mysum1<=50) { mysum1=myweight[j]+mysum1; mynum1=j; } } //將超出限制的最重點逐一刪除; while(mynum1<mynum) { for(varj=0;j<myvolumn1.length;j++) { if(mysum1<=50) { mysum1=myweight[j]+mysum1; mynum1=j; } myweight1[j]=myweight[j]; } mydot=heaviest(myweight1);//用最重的函數(shù),和baoremove來剔除掉限制條件外的點; string2=myvolumn1.baoremove(mydot); myum1=string2.length; } //將超出限制的點剔除后,得到數(shù)組string2,開始參加點; varmysum3=0; varmysum2=0; varmyweight3; varmyvolumn3; for(varj=0;j<string2.length;j++) { myweight3[j]=goods[string2[i]].weight; myvolumn3[j]=goods[string2[i]].volumn; }//算出總的體積和重量; for(vari=0;i<string2;i++) {mysum3=mysum3+myweight3[i]; mysum2=mysum2+myvolumn[i]; }//將string2轉(zhuǎn)化成字符串mycho=mycho.substr(0,mycho.length-1);;varstring3; for(varj=0;j<string2.length;j++) { string3+=String[string2[j]]+"|"; } string3=string3.substr(0,mycho.length-1); string3[string3.length-1]=""; vark=0; while(mysum3+goods[k].weight<=1&mysum2+goods[k]<=50) { for(varm=0;m<string2.length;m++) { if(k=string[m]){break;} } string3=string3+"k"; }returnfit(string3);}〔6〕下面的了兩個小函數(shù)是對體積和重量的限制條件的篩選,由于后面的主函數(shù)要調(diào)用,先給出兩個函數(shù)的程序。均在主構(gòu)架函數(shù)中返還數(shù)值。//排列體積,傳出體積由小到大的貨物號的字符串!functionsortvolumn(mycho){varmycho2=mycho.split("|");varmyreal;varmysortedv;varmysortedv1;for(varj=0;j<mycho2.length;j++){myreal[j]=goods[mycho2[j]].volumn;}//讓myreal的數(shù)組長度加一,目的是循環(huán)語句中myreal[mys]=1.myreal.length+=1;varmys=myreal.length-1;varmyone=1; for(vark=0;k<myreal.length-1;k++) {myreal[mys]=1; for(vari=0;i<myreal.length-1;i++) {if(myreal[i<myone]) { myone=myreal[i]; mys=i; } }//將貨物標號傳遞給數(shù)組mysorted中; mysortedv[k]=mys; } mysortedv1=mysortedv.join("|"); return(mysortedv1);}//該函數(shù)返回最重的貨物的編號functionheaviest(myweight){varmyweight1;varmyweight2;varmyzero=0;varmyaddress;for(vari=0;i<length.myweight;i++){myweight1[i]=goods[myweight[i]].weight;}//引用sort.numericvarmyweight2=myweight2.sort(sortNumber);myaddress=myweight2[myweight2.length-1];return(myaddress)}〔7.〕時間控制,此條件是在需要時間要求的條件下進行求解的。//時間排序函數(shù)functionchooseline_1(string3){ varmytime2=string3.split("|"); for(vari=0;i<string3.length;i++) { mytime2[i]=goods[string3[i]].time; } for(varj=0;j<string3.length;j++) { if(mytime2[j]=0) { mytime2[i]=Number.MAX_VALUE; } } varmyreal; varmysortedv; varmysortedv1; for(varj=0;j<mytime2.length;j++) { myreal[j]=goods[mycho2[j]].time; } //讓myreal的數(shù)組長度加一,目的是循環(huán)語句中 myreal.length+=1; varmys=myreal.length-1; varmyone=50; for(vark=0;k<myreal.length-1;k++) {myreal[mys]=1; for(vari=0;i<myreal.length-1;i++) {if(myreal[i<myone]) { myone=myreal[i]; mys=i; } } //將貨物標號傳遞給數(shù)組mysorted中; mysortedv[k]=mys; } mysortedv1=mysortedv.join("|"); }//將優(yōu)先級按時間排列的字符串傳出; return(chooseline=mystedv1);}〔8.〕決策函數(shù)。在沒有時間限制的條件下,此決策函數(shù)適合于一問和三文的情況。對此情況下,限制條件減弱,只要符合其他條件。//決策路線函數(shù)(無時間限制),返回扇區(qū)內(nèi)走完所以點的路線的字符串〔單用地杰斯特拉〕functionchooseline_0(mygoods){ vargoodsnum=mygoods.split("|"); varn=goodsnum.length; varlines=newArray(n); varmystart=0;varmychoose="0=>"; while(n!=0){ for(vari=0;i<n;i++){ lines[i]=linedistance(start,goodsnum[i]); } varminm varmindis=lines[0] for(vari=0;i<n;i++){ if(lines[i]<mindis){ minm=i; mindis=lines[i]; } } mystart=minm; goodsnum.baoremove(minm); n=goodsnum.length; if(n!=0){ mychoose+=String(mystart)+"=>"; }else{ mychoose+=String(mystart); } }return(mychoose); }〔9〕迪杰斯特拉算法://離a最近的直接聯(lián)通的點,s是不能包括的點,該函數(shù)效勞于“迪杰斯特拉算法”functionnearestgoods(a,s){varmym=newArray(4);vars2=s.split("|")//離a點距離最短的點的游標hvarm=0;varmymin;//先給mymin賦值〔不能是S里面的數(shù),也不能是自己本身〕for(varj=0;j<=aimnum;j++){//表示S中是否已有該點varexistornot="not";for(vari=0;i<s2.length;i++){if(s2[i]==j){existornot="yes";break;}}//如果存在跳出本次J的循環(huán)if(existornot=="yes"){continue;}if(pass[a][j]==1&a!=j){mymin=distance(a,j);m=j;break;}}//判斷是否存在最小值varnearby="no";if(mymin!=null){//找出最小值for(varj=0;j<=aimnum;j++){//表示S中是否已有該點existornot="not";for(vari=0;i<s2.length;i++){if(s2[i]==j){existornot="yes";break;}}//如果存在跳出本次J的循環(huán)if(existornot=="yes"){continue;}if(pass[a][j]==1&a!=j){nearby="yes"if(distance(a,j)<=mymin){mymin=distance(a,j);m=j;}}}}if(nearby=="yes"){if(s.length==0){s+=String(m);}else{s+="|"+String(m);}mym[0]=m;mym[1]=s;mym[2]=nearby;mym[3]=a;return(mym);}else{mym[0]=m;mym[1]=s;mym[2]=nearby;mym[3]=null;return(mym);}else{ mym[0]=m; mym[1]=s; mym[2]=nearby; mym[3]=null; return(mym); }}//迪杰斯特拉算法:選擇2點之間的最短(即最快)路徑,返回字符串functionfastway(a,b){//每個點來此的路線記錄如line[1]記錄的是1點來自哪個點 varline=newArray(); line[0]=a;//地杰斯特拉算法的S集合,記錄以求出最短距離的點 vars=""; varre; vars2; //最終返回記錄路線 varmyfastway; re=nearestgoods(a,s); if(re[0]==b){ myfastway=String(a)+"=>"+String(b); } else{ line[re[0]]=re[3]; while(re[0]!=b){ re=nearestgoods(a,s); if(re[0]!=null){ line[re[0]]=re[3]; s+="|"+String(s2min[s2minsign]); } if(re[2]=="no"){ //去S中的值做循環(huán) s2=s.split("|"); vars2min=newArray(); for(varj=0;j<s2.length;j++){ //開始=》求s2[j]點到哪個點距離最小〔要求S中不存在〕 varm=0; varmymin; for(varj4=0;j4<=aimnum;j4++){ if(pass(s2[j],j4)==1&s2[j]!=j4){ mymin=distance(s2[j],j4); } } if(mymin!=null){ for(varj2=0;j2<=aimnum;j2++){ //表示S中是否已有該點 varexistornot="not"; for(varj3=0;j3<s2.length;j3++){ if(s2[j3]==j2){ existornot="yes"; break; } } //求該點最短距離 if(pass(s2[j],j2)==1&j2!=s2[j]&existornot=="not"){ if(distance(j2,s2[j])<=mymin){ mymin=distance(j2,s2[j]); m=j2; } } } } //結(jié)束=》求s2[j]到哪個點距離最小 //取得記錄S2[J]的發(fā)散點中最短距離 s2min[j]=m; s2mindis[j]=distance(m,s2[j]); } vars2minsign=0; vars2minmin=s2mindis[0]; for(vari=0;i<s2.length;i++){ if(s2mindis[i]<s2minmin){ s2minmin=s2mindis[i]; s2minsign=i; } } s+=String(s2min[s2minsign])+"|"; s=s.substr(0,s.length-1); re[0]=s2min[s2minsign]; line[s2min[s2minsign]]=s2minsign; } //從B點出發(fā),用LINE數(shù)組往回尋找A,從而得出B到A的最短距離 varmystar=null; varmyend=b myfastway=String(b)+"<=" while(myend==b){ myend=line[myend]; if(myend==a){ myfastway+=String(myend) } else{ myfastway+=String(myend)+"=>" } } //翻轉(zhuǎn)開始〔原來的myfastway是倒敘的,現(xiàn)在翻轉(zhuǎn)字符串〕 myfastway2=myfastway.split("=>") varmyfastway3=newArray(myfastway2.length); varmymax=myfastway2.length-1; for(vari=0;i<myfastway2.length;i++){ myfastway3[i]=myfastway2[mymax]; mymax=mymax-1; } myfastway=null; for(i=0;i<myfastway2.length;i++){ if(i==myfastway2.length-1){ myfastway+=String(myfastway2[i]) } else{ myfastway+=String(myfastway2[i])+"=>" } } //翻轉(zhuǎn)結(jié)束 }return(myfastway);}〔10.〕架構(gòu)函數(shù),利用以上的小函數(shù)根據(jù)不同的限制條件,調(diào)用不同的函數(shù)進行求解。〔index.html的代碼〕<!DOCTYPE

html

PUBLIC

"-//W3C//DTD

XHTML

1.0

Transitional//EN"

":///TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html

xmlns=":///1999/xhtml">

<head>

<meta

-equiv="Content-Type"

content="text.html;

charset=gb2312"

/>

<title>2010年數(shù)學建模

題B</title>

</head>

<!--引用數(shù)據(jù)開始-->

<script

src="data1.js"

language="javascript"></script>

<script

src="data2.js"

language="javascript"></script>

<script

src="data3.js"

language="javascript"></script>

<!--引用數(shù)據(jù)結(jié)束-->

<!--引用函數(shù)開始-->

<!--角度函數(shù)-->

<script

src="angel.js"

language="javascript"></script>

<!--求最遠點函數(shù)-->

<script

src="farest.js"

language="javascript"></script>

<!--扇形區(qū)選點函數(shù)-->

<script

src="mychioce.js"

language="javascript"></script>

<!--體積排序函數(shù)-->

<script

src="sortvolumn.js"

language="javascript"></script>

<!--求最重貨物函數(shù)函數(shù)-->

<script

src="heaviest.js"

language="javascript"></script>

<!--無時間限制下的決策函數(shù)-->

<script

src="chooseline_0.js"

language="javascript"></script>

<!--有時間條件下的決策函數(shù)-->

<script

src="chooseline_1.js"

language="javascript"></script>

<!--對選定的扇區(qū)內(nèi)的貨物以一次載最多為原那么進行篩選-->

<script

src="fit.js"

language="javascript"></script>

<!--求剩余目的地,和物品-->

<script

src="rest.js"

language="javascript"></script>

<!--求兩點距離函數(shù)〔不考慮是否直接聯(lián)通〕-->

<script

src="distance.js"

language="javascript"></script>

<!--兩點距離函數(shù),考慮是否直接聯(lián)通-->

<script

src="linedistance.js"

language="javascript"></script>

<!--迪杰斯科拉算法函數(shù)-->

<script

src="dijkstra.js"

language="javascript"></script>

<!--數(shù)組移除元素函數(shù)-->

<script

src="baoremove.js"

language="javascript"></script>

<!--引用函數(shù)結(jié)束-->

<script

language="javascript">

//定義目的地的個數(shù)

var

aimnum=50;

//定義扇形角度大小

var

bigangel=60;

//貨物員行駛速度〔米/小時〕

var

speed=24*1000;

//架構(gòu)函數(shù)

sendgoods為需要配送的貨物,

limit為決策條件:

0無時間限制,1有時間限制

function

index(sendgoods,limit){

//重要變量

//需要發(fā)送的全部物品

var

allsendgoods;

//貨物的目的地集合

var

allaim

//剩余的貨物的目的

var

restaim

//最遠點

var

farestpoint;

//需要發(fā)送的物品中,按照最遠點和扇形原那么,選擇點

var

mychiocestr;

//該扇形中可以一次帶走的點

var

sendnow;

//物品的發(fā)送路線

var

sendline;

//路線具體行走方法

var

linedetail;

//路線長度

var

linelength=0;

//路線時間花費時間

var

linetime;

//定義扇區(qū)個數(shù)

var

howmany=0;

//輔助變量

//物品的發(fā)送路線的數(shù)組

var

sendline2;

//路線具體行走方法的數(shù)組

var

linedetail2;

//初始化

allsendgoods=sendgoods;

restsendgoods=allsendgoods;

//需要發(fā)送的貨物中需要經(jīng)過的目的集集合

restaim=chooseaim(restsendgoods)

document.write("解決方案如下:<br>");

while(restaim.length!=0){

howmany+=1

farestpoint=farest(restaim);

mychiocestr=mychoice(farestpoint,allsendgoods);

sendnow=fit(mychiocestr);

restaim=rest(restaim,sendnow);

//判斷決策條件

if(limit==0){

sendline=chooseline_0(mygoods);

}

else

if(limit==1){

sendline=chooseline_1(mygoods);

}

sendline2=sendline.split("=>")

for(var

i=1;i<sendline2.length;i++){

linedetail+=fastway(sendline2[i-1],sendline2[i])+"=>";

}

linedetail=linedetail.substr(0,myb2.length-2);

linedetail2=linedetail.split("|");

for(var

i=1;i<linedetail2.length;i++){

linelength+=distance(linedetail2[i-1]+linedetail2[i]);

}

document.write("送貨路線:"+String(linedetail)+"<br>");

}

document.write("總路程〔單位:米〕:"+String(round(linelength))+"<br>");

document.write("總時間〔單位:分鐘〕:"+String(round(mytime(linelength)))+"<br>");

return(false);

}

</script>

<body>

<br><br>

<form

id="form1"

name="form1"

method="post"

action="">

點擊查看解決方案:<label>

<input

type="submit"

name="button2"

id="button2"

value="

"

style="width:130px;

height:40px;"

onclick="index('1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30',0)"

/>

</label>

<label>

<input

type="submit"

name="button3"

id="button3"

value="

"

style="width:130px;

height:40px;"

onclick="index('1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30',1)"

/>

</label>

<label>

<input

type="submit"

name="button"

id="button"

value="

"

style="width:130px;

height:40px;"

onclick="index('1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100',0)"

/>

</label>

</form>

</body>

</html>3.尋找最優(yōu)解:〔1〕迪杰斯特拉算法簡介:首先,引進一個輔助向量D,它的每個分量D表示當前所找到的從始點v到每個終點vi的最短路徑的長度。如D[3]=2表示從始點v到終點3的路徑相對最小長度為2。這里強調(diào)相對就是說在算法過程中D的值是在不斷逼近最終結(jié)果但在過程中不一定就等于最短路徑長度。它的初始狀態(tài)為:假設從v到vi有弧,那么D為弧上的權(quán)值;否那么置D為∞。顯然,長度為D[j]=Min{D|vi∈V}的路徑就是從v出發(fā)的長度最短的一條最短路徑。此路徑為(v,vj)。那么,下一條長度次短的最短路徑是哪一條呢?假設該次短路徑的終點是vk,那么可想而知,這條路徑或者是(v,vk),或者是(v,vj,vk)。它的長度或者是從v到vk的弧上的權(quán)值,或者是D[j]和從vj到vk的弧上的權(quán)值之和。一般情況下,假設S為已求得最短路徑的終點的集合,那么可證明:下一條最短路徑〔設其終點為X〕或者是弧(v,x),或者是中間只經(jīng)過S中的頂點而最后到達頂點X的路徑。因此,下一條長度次短的最短路徑的長度必是D[j]=Min{D|vi∈V-S}其中,D或者是弧(v,vi)上的權(quán)值,或者是D[k](vk∈S)和弧(vk,vi)上的權(quán)值之和。迪杰斯特拉算法描述如下:1〕arcs表示弧上的權(quán)值。假設不存在,那么置arcs為∞〔在本程序中為MAXCOST〕。S為已找到從v出發(fā)的最短路徑的終點的集合,初始狀態(tài)為空集。那么,從v出發(fā)到圖上其余各頂點vi可能到達的最短路徑長度的初值為D=arcs[LocateVex(G,v),i]vi∈V2〕選擇vj,使得D[j]=Min{D|vi∈V-S}3〕修改從v出發(fā)到集合V-S上任一頂點vk可達的最短路徑長度?!?〕最優(yōu)解的獲得:通過各問對貨物運送問題限制條件的強弱不同,調(diào)用不同的小函數(shù)來對條件進行限制,以求得最優(yōu)解。4.對算法進行比擬。迪杰斯特拉算法的原理已經(jīng)在上面說明,優(yōu)越度也是很明顯的,對于蟻群算法,來源于對螞蟻群體搜索行為的追蹤研究,其基于信息索的正反應特性有助于快速找到最優(yōu)解,但蟻群算法也有缺乏之處,主要表現(xiàn)在當問題和規(guī)模較大時,容易陷入局部最優(yōu)化而導致算法過早停滯。所以各有優(yōu)點。6.模型檢驗和評價:物流配送中,送貨員的效勞質(zhì)量取決于用戶的滿意程度,基于迪杰斯特拉算法的尋求最優(yōu)解問題是在重量體積綜合限制條件下的解決方法。有時間窗的VRP問題簡稱為VRPTW(vihicleRoutingProblemwithTimewindows),它是在VRP的根底上提出的,一般可定義為::對于一系列貨物需求點(或稱客戶),己知每個客戶的需求量及位置,用多個送貨員從配送中心到達這批客戶。要求必須在其時間窗內(nèi)為每個客戶效勞,如果送貨員提前到了客戶所在地,也必須等待,直到被允許為該客戶效勞為止或者向此題中的軟時間限制,只要在要求時間前到達就行了。每個送貨員的載重量一定,每條線路不超過該車的載重量送貨員。每個客戶的需求必須且只能由送貨員來提供。目標是使總的送貨員行走距離和所需的送貨員數(shù)目最小。這里,將貨員行走距離作為第一目標,貨員為第二目標。對于此題而言送貨員限制不存在,即只要一名?;谏厦娴姆椒ǎ诟鞣N篩選條件中選出最優(yōu)解。在物流問題中應用最廣的還是蟻群算法,但通過我們研究認為對于多目標的配送問題,更適合于用迪杰斯特拉來尋找短徑的最優(yōu)解。這對實踐生活有很大的意義和幫助。附錄:附錄一文件安排格局第一題運行截圖第二題運行截圖附錄二:vargoods=newArray(101);MyStruct=function(n,a,w,v,t){this.n=n;this.aim=a;this.weight=w;this.volumn=v;this.time=t;}functionInputdata(n,a,w,v,t){goods[n]=newMyStruct(n,a,w,v,t);}Inputdata(1.0000,13.0000,2.5000,0.0316,9.0000);Inputdata(2.0000,18.0000,0.5000,0.0354,9.0000);Inputdata(3.0000,31.0000,1.1800,0.0240,9.5000);Inputdata(4.0000,26.0000,1.5600,0.0350,12.0000);Inputdata(5.0000,21.0000,2.1500,0.0305,12.0000);Inputdata(6.0000,14.0000,1.7200,0.0100,12.0000);Inputdata(7.0000,17.0000,1.3800,0.0109,12.0000);Inputdata(8.0000,23.0000,1.4000,0.0426,12.0000);Inputdata(9.0000,32.0000,0.7000,0.0481,12.0000);Inputdata(10.0000,38.0000,1.3300,0.0219,10.2500);Inputdata(11.0000,45.0000,1.1000,0.0287,9.5000);Inputdata(12.0000,43.0000,0.9500,0.0228,10.2500);Inputdata(13.0000,39.0000,2.5600,0.0595,12.0000);Inputdata(14.0000,45.0000,2.2800,0.0301,9.5000);Inputdata(15.0000,42.0000,2.8500,0.0190,10.2500);Inputdata(16.0000,43.0000,1.7000,0.0782,10.2500);Inputdata(17.0000,32.0000,0.2500,0.0412,12.0000);Inputdata(18.0000,36.0000,1.7900,0.0184,12.0000);Inputdata(19.0000,27.0000,2.4500,0.0445,12.0000);Inputdata(20.0000,24.0000,2.9300,0.0420,9.0000);Inputdata(21.0000,31.0000,0.8000,0.0108,9.5000);Inputdata(22.0000,27.0000,2.2500,0.0018,12.0000);Inputdata(23.0000,26.0000,1.5700,0.0210,12.0000);Inputdata(24.0000,34.0000,2.8000,0.0103,9.5000);Inputdata(25.0000,40.0000,1.1400,0.0155,9.5000);Inputdata(26.0000,45.0000,0.6800,0.0382,9.5000);Inputdata(27.0000,49.0000,1.3500,0.0144,10.2500);Inputdata(28.0000,32.0000,0.5200,0.0020,12.0000);Inputdata(29.0000,23.0000,2.9100,0.0487,12.0000);Inputdata(30.0000,16.0000,1.2000,0.0429,12.0000);Inputdata(31.0000,1.0000,1.2600,0.0250,0);Inputdata(32.0000,2.0000,1.1500,0.0501,0);Inputdata(33.0000,3.0000,1.6300,0.0483,0);Inputdata(34.0000,4.0000,1.2300,0.0006,0);Inputdata(35.0000,5.0000,1.4100,0.0387,0);Inputdata(36.0000,6.0000,0.5400,0.0067,0);Inputdata(37.0000,7.0000,0.7000,0.0129,0);Inputdata(38.0000,8.0000,0.7600,0.0346,0);Inputdata(39.0000,9.0000,2.1400,0.0087,0);Inputdata(40.0000,10.0000,1.0700,0.0124,0);Inputdata(41.0000,11.0000,1.3700,0.0510,0);Inputdata(42.0000,12.0000,2.3900,0.0428,0);Inputdata(43.0000,13.0000,0.9900,0.0048,0);Inputdata(44.0000,14.0000,1.6600,0.0491,0);Inputdata(45.0000,15.0000,0.4500,0.0209,0);Inputdata(46.0000,16.0000,2.0400,0.0098,0);Inputdata(47.0000,17.0000,1.9500,0.0324,0);Inputdata(48.0000,18.0000,2.1200,0.0554,0);Inputdata(49.0000,19.0000,3.8700,0.0262,0);Inputdata(50.0000,20.0000,2.0100,0.0324,0);Inputdata(51.0000,21.0000,1.3800,0.0419,0);Inputdata(52.0000,22.0000,0.3900,0.0001,0);Inputdata(53.0000,23.0000,1.6600,0.0502,0);Inputdata(54.0000,24.0000,1.2400,0.0534,0);Inputdata(55.0000,25.0000,2.4100,0.0012,0);Inputdata(56.0000,26.0000,1.2600,0.0059,0);Inputdata(57.0000,27.0000,0.4200,0.0224,0);Inputdata(58.0000,28.0000,1.7200,0.0580,0);Inputdata(59.0000,29.0000,1.3400,0.0372,0);Inputdata(60.0000,30.0000,0.0600,0.0402,0);Inputdata(61.0000,31.0000,0.6000,0.0274,0);Inputdata(62.0000,32.0000,2.1900,0.0503,0);Inputdata(63.0000,33.0000,1.8900,0.0494,0);Inputdata(64.0000,34.0000,1.8100,0.0325,0);Inputdata(65.0000,35.0000,1.0000,0.0055,0);Inputdata(66.0000,36.0000,1.2400,0.0177,0);Inputdata(67.0000,37.0000,2.5100,0.0361,0);Inputdata(68.0000,38.0000,2.0400,0.0110,0);Inputdata(69.0000,39.0000,1.0700,0.0440,0);Inputdata(70.0000,40.0000,0.4900,0.0329,0);Inputdata(71.0000,41.0000,0.5100,0.0094,0);Inputdata(72.0000,42.0000,1.3800,0.0455,0);Inputdata(73.0000,43.0000,1.3100,0.0121,0);Inputdata(74.0000,44.0000,1.2600,0.0005,0);Inputdata(75.0000,45.0000,0.9800,0.0413,0);Inputdata(76.0000,46.0000,1.3500,0.0241,0);Inputdata(77.0000,47.0000,2.1200,0.0230,0);Inputdata(78.0000,48.0000,0.5400,0.0542,0);Inputdata(79.0000,49.0000,1.0100,0.0566,0);Inputdata(80.0000,50.0000,1.1200,0.0284,0);Inputdata(81.0000,25.0000,0.7900,0.0011,0);Inputdata(82.0000,46.0000,2.1200,0.0492,0);Inputdata(83.0000,32.0000,2.7700,0.0034,0);Inputdata(84.0000,23.0000,2.2900,0.0054,0);Inputdata(85.0000,20.0000,0.2100,0.0490,0);Inputdata(86.0000,25.0000,1.2900,0.0088,0);Inputdata(87.0000,19.0000,1.1200,0.0249,0);Inputdata(88.0000,41.0000,0.9000,0.0038,0);Inputdata(89.0000,46.0000,2.3800,0.0434,0);Inputdata(90.0000,37.0000,1.4200,0.0020,0);Inputdata(91.0000,32.0000,1.0100,0.0300,0);Inputdata(92.0000,33.0000,2.5100,0.0133,0);Inputdata(93.0000,36.0000,1.1700,0.0020,0);Inputdata(94.0000,38.0000,1.8200,0.0308,0);Inputdata(95.0000,17.0000,0.3300,0.0345,0);Inputdata(96.0000,11.0000,0.3000,0.0172,0);Inputdata(97.0000,15.0000,4.4300,0.0536,0);Inputdata(98.0000,12.0000,0.2400,0.0056,0);Inputdata(99.0000,10.0000,1.3800,0.0175,0);Inputdata(100.0000,7.0000,1.9800,0.0493,0);pass=newArray(51);pass[0]=newArray(51);pass[1]=newArray(51);pass[2]=newArray(51);pass[3]=newArray(51);pass[4]=newArray(51);pass[5]=newArray(51);pass[6]=newArray(51);pass[7]=newArray(51);pass[8]=newArray(51);pass[9]=newArray(51);pass[10]=newArray(51);pass[11]=newArray(51);pass[12]=newArray(51);pass[13]=newArray(51);pass[14]=newArray(51);pass[15]=newArray(51);pass[16]=newArray(51);pass[17]=newArray(51);pass[18]=newArray(51);pass[19]=newArray(51);pass[20]=newArray(51);pass[21]=newArray(51);pass[22]=newArray(51);pass[23]=newArray(51);pass[24]=newArray(51);pass[25]=newArray(51);pass[26]=newArray(51);pass[27]=newArray(51);pass[28]=newArray(51);pass[29]=newArray(51);pass[30]=newArray(51);pass[31]=newArray(51);pass[32]=newArray(51);pass[33]=newArray(51);pass[34]=newArray(51);pass[35]=newArray(51);pass[36]=newArray(51);pass[37]=newArray(51);pass[38]=newArray(51);pass[39]=newArray(51);pass[40]=newArray(51);pass[41]=newArray(51);pass[42]=newArray(51);pass[43]=newArray(51);pass[44]=newArray(51);pass[45]=newArray(51);pass[46]=newArray(51);pass[47]=newArray(51);pass[48]=newArray(51);pass[49]=newArray(51);pass[50]=newArray(51);pass[01][03]=1;pass[01][08]=1;pass[02][20]=1;pass[02][04]=1;pass[03][08]=1;pass[03][04]=1;pass[05][15]=1;pass[05][02]=1;pass[06][01]=1;pass[07][18]=1;pass[07][01]=1;pass[08][12]=1;pass[09][14]=1;pass[09][10]=1;pass[10][18]=1;pass[10][07]=1;pass[11][12]=1;pass[12][13]=1;pass[12][25]=1;pass[12][15]=1;pass[13][18]=1;pass[13][19]=1;pass[13][11]=1;pass[14][18]=1;pass[14][16]=1;pass[14][17]=1;pass[14][21]=1;pass[15][22]=1;pass[15][25]=1;pass[16][23]=1;pass[17][23]=1;pass[18][31]=1;pass[19][24]=1;pass[20][22]=1;pass[21][26]=1;pass[21][36]=1;pass[21][17]=1;pass[24][31]=1;pass[25][41]=1;pass[25][19]=1;pass[25][29]=1;pass[27][31]=1;pass[28][33]=1;pass[29][22]=1;pass[30][28]=1;pass[30][41]=1;pass[31][26]=1;pass[31][34]=1;pass[32][35]=1;pass[32][23]=1;pass[33][46]=1;pass[33][28]=1;pass[34][40]=1;pass[35][38]=1;pass[36][45]=1;pass[36][27]=1;pass[37][40]=1;pass[38][36]=1;pass[39][27]=1;pass[40][34]=1;pass[40][45]=1;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論