




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
.PAGE.數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告設(shè)計(jì)題目:學(xué)校超市選址問題專業(yè)班級(jí)學(xué)生學(xué)號(hào)指導(dǎo)教師起止時(shí)間年學(xué)期問題描述對(duì)于某一學(xué)校超市,其他各單位到其的距離不同,同時(shí)各單位人員去超市的頻度也不同。請(qǐng)為超市選址,要求實(shí)現(xiàn)總體最優(yōu)。1、需求分析核心問題:求最短路徑<選址的要求就是超市到各單位權(quán)值之和最少>數(shù)據(jù)模型〔邏輯結(jié)構(gòu):帶權(quán)有向圖<權(quán)值計(jì)算:距離*頻度>存儲(chǔ)結(jié)構(gòu):typedefstruct{ stringvexs[MAX_VERTEX_SIZE];intarcs[MAX_VERTEX_SIZE][MAX_VERTEX_SIZE]; intvexnum;//,arcnum;}MGraph;核心算法:Floyd算法<弗洛伊德算法-每一對(duì)頂點(diǎn)之間的最短路徑>輸入數(shù)據(jù):各單位名稱,距離,頻度,單位個(gè)數(shù).輸出數(shù)據(jù):所選單位名稱.總體思路:如果超市是要選在某個(gè)單位,那么先用floyd算法得出各頂點(diǎn)間的最短距離/最小權(quán)值。假設(shè)頂點(diǎn)個(gè)數(shù)有n個(gè),那么就得到n*n的一張表格,arcs<i,j>表示i單位到j(luò)單位的最短距離/最小權(quán)值,這張表格中和最小的那一行<假設(shè)為第t行>,那么超市選在t單位處就是最優(yōu)解。運(yùn)行環(huán)境DEV-C++2、概要設(shè)計(jì)Floyd算法利用動(dòng)態(tài)規(guī)劃思想,通過(guò)把問題分解為子問題來(lái)解決任意兩點(diǎn)見的最短路徑問題。設(shè)G=<V,E,w>是一個(gè)帶權(quán)有向圖,其邊V={v1,v2,…,vn}。對(duì)于k≤n,考慮其結(jié)點(diǎn)V的一個(gè)子集。對(duì)于V中任何兩個(gè)結(jié)點(diǎn)vi、vj,考慮從vi到vj的中間結(jié)點(diǎn)都在vk中的所有路徑,設(shè)是其中最短的,并設(shè)的路徑長(zhǎng)度為。如果結(jié)點(diǎn)vk不在從vi到vj的最短路徑上,則;反之則可以把分為兩段,其中一段從vi到vk,另一段從vk到vj,這樣便得到表達(dá)式。上述討論可以歸納為如下遞歸式:原問題轉(zhuǎn)化為對(duì)每個(gè)i和j求,或者說(shuō)求矩陣開始流程圖開始MMain〔輸入基本信息輸入基本信息GreatMgraph〔GhGreatMgraph〔Gh建立鄰接矩陣的存儲(chǔ)結(jié)構(gòu)建立鄰接矩陣的存儲(chǔ)結(jié)構(gòu)Floyd算法Floyd算法NNYA[i][j]==INF,i!=jYA[i][j]==INF,i!=ji到j(luò)不存在路徑i到j(luò)不存在路徑Floyed〔GhFloyed〔Gh輸出i->j的路徑和路徑長(zhǎng)度輸出i->j的路徑和路徑長(zhǎng)度輸出超市的最佳地址:i輸出超市的最佳地址:i結(jié)束結(jié)束詳細(xì)設(shè)置第一步,讓所有路徑加上中間頂點(diǎn)1,取A[i][j]與A[i][1]+A[1][j]中較小的值作A[i][j]的新值,完成后得到A<1>,如此進(jìn)行下去,當(dāng)?shù)趉步完成后,A〔k[i][j]表示從i到就且路徑上的中間頂點(diǎn)的路徑的序號(hào)小于或等于k的最短路徑長(zhǎng)度。當(dāng)?shù)趎-1步完成后,得到A〔n-1,A〔n-1即所求結(jié)果。A〔n-1[i][j]表示從i到j(luò)且路徑上的中點(diǎn)頂點(diǎn)的序號(hào)小于或等于n-1的最短路徑長(zhǎng)度,即A<n-1>[i][j]表示從i到j(luò)的最短路徑長(zhǎng)度。代碼表示如下:voidFloyed<Mgraph*G>//帶權(quán)有向圖求最短路徑floyd算法{ intA[MAXVEX][MAXVEX],path[MAXVEX][MAXVEX]; inti,j,k,pre; intcount[MAXVEX]; for<i=0;i<G->n;i++>//初始化A[][]和path[][]數(shù)組 for<j=0;j<G->n;j++>//置初值; { A[i][j]=G->dis[i][j]; path[i][j]=-1; count[i]=0; } for<k=0;k<G->n;k++>//k代表運(yùn)算步驟 { for<i=0;i<G->n;i++> for<j=0;j<G->n;j++> if<A[i][j]><A[i][k]+A[k][j]>>//從i經(jīng)j到k的一條路徑更短 { A[i][j]=A[i][k]+A[k][j]; path[i][j]=k; } } cout<<endl<<"Floyed算法求解如下:"<<endl; for<i=0;i<G->n;i++> for<j=0;j<G->n;j++> { if<i!=j> { cout<<""<<i<<"->"<<j<<";"; if<A[i][j]==INF> { if<i!=j> cout<<"不存在路徑"<<"\n"<<endl; } else { cout<<"路徑長(zhǎng)度為:"<<A[i][j]<<"\n"; cout<<"路徑為:"<<i<<"*"; pre=path[i][j]; while<pre!=-1> { cout<<pre<<"\n"; pre=path[pre][j]; } cout<<j<<endl; } } }//以下為選擇總體最優(yōu)過(guò)程,然后確址; for<i=0;i<G->n;i++> for<j=0;j<G->n;j++> { if<A[i][j]==INF> count[i]=0; else count[i]=1; } for<i=0;i<G->n;i++> if<count[i]> { for<j=0;j<G->n;j++> if<i!=j>A[i][i]+=A[j][i]; } k=0; for<i=0;i<G->n;i++> { if<count[i]> if<A[k][k]>A[i][i]> k=i; } cout<<"超市的最佳地址為:"<<G->vexs[k]<<endl;}4、調(diào)試分析測(cè)試數(shù)據(jù):輸入:?jiǎn)挝粋€(gè)數(shù)4單位間的路徑數(shù)6第0個(gè)單位名稱a第1個(gè)單位名稱b第2個(gè)單位名稱c第3個(gè)單位名稱d相通兩單位之間的距離0,131,222,320,330,241,31第0個(gè)單位去超市的頻率1第1個(gè)單位去超市的頻率2第2個(gè)單位去超市的頻率4第3個(gè)單位去超市的頻率3輸出:相通兩單位之間的路徑和他的長(zhǎng)度結(jié)果:附加程序#include<string.h>#include<stdio.h>#include<stdlib.h>#include<time.h>#include"malloc.h"#include<iostream.h>#defineTURE1#defineFALSE0#defineOK1#defineERROR0#defineOVERFLOW-1#defineINF32767constintMAXVEX=100;typedefcharVextype;//為復(fù)雜的聲明定義簡(jiǎn)單的別名typedefstruct{ Vextypevexs[MAXVEX][MAXVEX];//單位名稱〔頂點(diǎn)信息; intadj[MAXVEX][MAXVEX]; //單位之間的相通情況〔是否有邊; intdis[MAXVEX][MAXVEX]; //單位間距離〔邊的長(zhǎng)度; intf[MAXVEX]; //各單位去超市的頻率; intn; //頂點(diǎn)數(shù)和邊數(shù); inte;}Mgraph;voidCreatMgraph<Mgraph*G>//實(shí)現(xiàn)的是以鄰接矩陣存儲(chǔ)圖,并能將矩陣打印,同時(shí)實(shí)現(xiàn)了圖的深度遍歷{ inti,j,k; printf<"請(qǐng)輸入單位個(gè)數(shù):\n">; scanf<"%d",&<G->n>>; printf<"請(qǐng)輸入單位間的路徑數(shù):\n">; scanf<"%d",&<G->e>>; printf<"請(qǐng)輸入單位名稱:\n">; for<i=0;i<G->n;i++> { printf<"請(qǐng)輸入第%d個(gè)單位名稱:\n",i>; scanf<"%s",&G->vexs[i]>; } for<i=0;i<G->n;i++> //結(jié)構(gòu)體的初始化; for<j=0;j<G->n;j++> { G->adj[i][j]=0; G->dis[i][j]=0; G->f[i]=0; } for<k=0;k<G->e;k++> { printf<"請(qǐng)輸入相通的兩單位<輸入格式:i,j>:\n">; scanf<"%d,%d",&i,&j>;//在距離上體現(xiàn)為無(wú)向; printf<"請(qǐng)輸入相同兩個(gè)單位間的距離<格式:dis>:\n">; scanf<"%d",&<G->dis[i][j]>>; G->adj[i][j]=1; G->adj[j][i]=1; G->dis[j][i]=G->dis[i][j]; } for<k=0;k<G->n;k++> { printf<"請(qǐng)輸入第%d個(gè)單位去超市的相對(duì)頻率:\n",k>; scanf<"%d",&<G->f[k]>>; } for<i=0;i<G->n;i++> //以距離和頻率之積作為權(quán)值; for<j=0;j<G->n;j++> { G->dis[i][j]*=G->f[i];//最終權(quán)值非完全無(wú)向; if<G->adj[i][j]==0&&i!=j> G->dis[i][j]=INF; }}voidFloyed<Mgraph*G>//帶權(quán)有向圖求最短路徑floyd算法{ intA[MAXVEX][MAXVEX],path[MAXVEX][MAXVEX]; inti,j,k,pre; intcount[MAXVEX]; for<i=0;i<G->n;i++>//初始化A[][]和path[][]數(shù)組 for<j=0;j<G->n;j++>//置初值; { A[i][j]=G->dis[i][j]; path[i][j]=-1; count[i]=0; } for<k=0;k<G->n;k++>//k代表運(yùn)算步驟 { for<i=0;i<G->n;i++> for<j=0;j<G->n;j++> if<A[i][j]><A[i][k]+A[k][j]>>//從i經(jīng)j到k的一條路徑更短 { A[i][j]=A[i][k]+A[k][j]; path[i][j]=k; } } cout<<endl<<"Floyed算法求解如下:"<<endl; for<i=0;i<G->n;i++> for<j=0;j<G->n;j++> { if<i!=j> { cout<<""<<i<<"->"<<j<<";"; if<A[i][j]==INF> { if<i!=j> cout<<"不存在路徑"<<"\n"<<endl; } else { cout<<"路徑長(zhǎng)度為:"<<A[i][j]<<"\n"; cout<<"路徑為:"<<i<<"*"; pre=path[i][j]; while<pre!=-1> { cout<<pre<<"\n"; pre=path[pre][j]; } cout<<j<<endl; } } }//以下為選擇總體最優(yōu)過(guò)程,然后確址; for<i=0;i<G->n;i++> for<j=0;j<G->n;j++> { if<A[i][j]==INF> count[i]=0; else count[i]=1; } for<i=0;i<G->n;i++> if<count[i]> {
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 轉(zhuǎn)讓幾成股份合同范本
- 短視頻營(yíng)銷的視覺吸引力分析
- 平臺(tái)開發(fā)合同范本
- 社交活動(dòng)在老年生活中的作用及社區(qū)規(guī)劃
- 科技公司員工績(jī)效與激勵(lì)機(jī)制設(shè)計(jì)
- 廣告展位合同范本
- 電影產(chǎn)業(yè)國(guó)際化發(fā)展趨勢(shì)與挑戰(zhàn)
- 獸藥購(gòu)貨合同范本
- 工控維護(hù)合同范本
- 科技園區(qū)的消防技術(shù)創(chuàng)新與應(yīng)用推廣
- 新聞采訪與寫作課件第十九章融合報(bào)道
- 常用小學(xué)生詞語(yǔ)成語(yǔ)積累歸類大全
- 七種不同樣式的標(biāo)書密封條
- 全國(guó)水利工程監(jiān)理工程師培訓(xùn)教材質(zhì)量控制
- 中國(guó)傳統(tǒng)成語(yǔ)故事(英文版)
- 鑄造廠總降壓變電所及廠區(qū)配電系統(tǒng)設(shè)計(jì)
- 航拍中國(guó)優(yōu)秀課件
- 《做自己的心理醫(yī)生 現(xiàn)代人的心理困惑和自我療愈策略》讀書筆記思維導(dǎo)圖PPT模板下載
- 小學(xué)音樂組集體備課計(jì)劃
- 稿件修改說(shuō)明(模板)
- 血液透析安全注射臨床實(shí)踐專家共識(shí)解讀
評(píng)論
0/150
提交評(píng)論