国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Floyd算法實現(xiàn)實際問題——18個城市間最優(yōu)路線規(guī)劃

這篇具有很好參考價值的文章主要介紹了Floyd算法實現(xiàn)實際問題——18個城市間最優(yōu)路線規(guī)劃。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

離散數(shù)學大作業(yè)?

——利用Floyd算法計算兩城市間最優(yōu)路徑及距離?

代碼在最下面

一.提出問題

在交通網(wǎng)絡(luò)非常發(fā)達、交通工具和交通方式不斷更新的今天,人們在出差、旅游或做其他出行時,不僅關(guān)心節(jié)省交通費用,而且對里程和所需要的時間等問題也感興趣。對于這樣一個人們關(guān)心的問題,可用一個圖結(jié)構(gòu)來表示交通網(wǎng)絡(luò)系統(tǒng),利用計算機建立一個交通咨詢系統(tǒng)。圖中的頂點表示城市,邊表示城市之間的交通關(guān)系。這個交通系統(tǒng)可以回答出行旅客提出的各種路徑選擇問題。例如,問題之一:“一位旅客要從 A 城到 B 城,他希望選擇一條路徑最短。設(shè)計一個程序實現(xiàn)對兩個城市最短路徑的查詢

二.模型化

精力有限,顧及不到所有城市在地圖上選取了18個城市作為圖的結(jié)點,

?

代碼實現(xiàn)過程用漢字比較繁瑣,所以在此將18個城市標號0-17進行路徑問題的計算

Floyd算法實現(xiàn)實際問題——18個城市間最優(yōu)路線規(guī)劃

?

為了盡量體現(xiàn)Floyd算法的計算過程,在次假定只有結(jié)點周圍的且不超過1000km的城市有有向邊,邊的長度設(shè)為百度地圖所搜索到的最短路程,剩余的城市間距離設(shè)置為最大值5000km,即不可直接到達。

例如合肥的有向邊鏈接了鄭州南京、武漢、南昌雖然合肥離上海、杭州也很近,但在此為了突出Floyd算法,不賦予該兩座城市之間的邊而是借助南京這個結(jié)點到達。

Floyd算法實現(xiàn)實際問題——18個城市間最優(yōu)路線規(guī)劃

(人手搜索,按序號找,手敲的,真的累死我了啊啊啊啊啊啊?。?

之后通過Floyd算法計算各個城市間最短距離,并且記錄路徑,最后格式化輸出。

三.??編程實現(xiàn)

1、城市代號與名字匹配結(jié)構(gòu)體構(gòu)建

Floyd算法實現(xiàn)實際問題——18個城市間最優(yōu)路線規(guī)劃

?

結(jié)構(gòu)體Vnode,用于存儲城市名字字符串,之后再通過城市代號,達到輸出漢字的效果,使呈現(xiàn)更明確

2、靜態(tài)變量

Floyd算法實現(xiàn)實際問題——18個城市間最優(yōu)路線規(guī)劃

(啃了之前寫noj數(shù)據(jù)結(jié)構(gòu)實驗11題的老本)

int lu[maxnum][maxnum][maxnum]:第一個值設(shè)為a,第二個值設(shè)為b,第三個值設(shè)為c,a,b用于定位某個節(jié)點到某個節(jié)點,c用于記錄路線,即,數(shù)組用于記錄某個節(jié)點到各個節(jié)點最短路徑的途經(jīng)節(jié)點。
wei[maxnum][maxnum]:用于記錄lu[maxnum][maxnum][maxnum]數(shù)組的路徑最前端此時位于第幾個位置,便于更新途徑節(jié)點

3、主函數(shù)模塊

Floyd算法實現(xiàn)實際問題——18個城市間最優(yōu)路線規(guī)劃

?

函數(shù)調(diào)用關(guān)系如圖

4、城市名初始化函數(shù)模塊

Floyd算法實現(xiàn)實際問題——18個城市間最優(yōu)路線規(guī)劃

(沒選到的城市無意冒犯,全部省會弄下來我會死的????,隨便選了18個城市)

標號與城市名對應如圖

5、路徑距離初始化代碼

?

Floyd算法實現(xiàn)實際問題——18個城市間最優(yōu)路線規(guī)劃

(5000即不可直達)

6、路徑初始化函數(shù)模塊

Floyd算法實現(xiàn)實際問題——18個城市間最優(yōu)路線規(guī)劃

路徑初始都設(shè)為出發(fā)結(jié)點和到達結(jié)點,暫且不考慮不可達情況,不影響后續(xù)結(jié)果。

7、Floyd算法函數(shù)模塊

Floyd算法實現(xiàn)實際問題——18個城市間最優(yōu)路線規(guī)劃

for循環(huán)最里層在完成路徑長度的更新同時,完成了路徑途經(jīng)結(jié)點的更新,是Floyd函數(shù)的進化版本。

8、檢測輸入結(jié)點并輸出路徑長度及路徑模塊

Floyd算法實現(xiàn)實際問題——18個城市間最優(yōu)路線規(guī)劃

m記錄需要求多少條路徑。

temp1[maxnum],temp2[maxnum]分別記錄初末結(jié)點。

格式化輸出。

9、輸入輸出測試

先輸入整數(shù)n,表示要求多少組路徑

然后n行輸入a?b表示要求從a?->?b的路徑

Floyd算法實現(xiàn)實際問題——18個城市間最優(yōu)路線規(guī)劃

四.?形成結(jié)論文章來源地址http://www.zghlxwxcb.cn/news/detail-499675.html

  1. 成功利用Floyd算法、c語言程序?qū)崿F(xiàn)了對18個城市之間最短路徑及長度的計算以及格式化輸出。
  2. 缺點:初始的輸入因本人時間有限,沒能完成將輸入也改成漢字輸入,所以要求兩城市路徑要先看城市對應代號然后輸入。
  3. 通過這次大作業(yè),我更加深刻地理解了離散課上所教授的Floyd算法,實現(xiàn)了教學合一,而不是單純的聽老師講課或是機械地寫書上的習題,老師與別的班的不同教學任務富含特色,著實令我印象深刻,感謝老師栽培。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define maxnum 20
#define maxlu 5000

typedef struct Vnode{
	char name[10];
}AdjList[maxnum];

AdjList cheng;

int lu[maxnum][maxnum][maxnum];
int wei[maxnum][maxnum];

void chu()
{
    strcpy(cheng[0].name,"北京");
    strcpy(cheng[1].name,"天津");
    strcpy(cheng[2].name,"太原");
    strcpy(cheng[3].name,"西寧");
    strcpy(cheng[4].name,"蘭州");
    strcpy(cheng[5].name,"西安");
    strcpy(cheng[6].name,"鄭州");
    strcpy(cheng[7].name,"成都");
    strcpy(cheng[8].name,"武漢");
    strcpy(cheng[9].name,"合肥");
    strcpy(cheng[10].name,"南京");
    strcpy(cheng[11].name,"上海");
    strcpy(cheng[12].name,"杭州");
    strcpy(cheng[13].name,"重慶");
    strcpy(cheng[14].name,"長沙");
    strcpy(cheng[15].name,"南昌");
    strcpy(cheng[16].name,"昆明");
    strcpy(cheng[17].name,"廣州");
}
  //  北,天,太,西,蘭,西,鄭,成,武,合,南,上,杭,重,長,南,昆,廣
int ans[18][18]=
{//  0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
    {0,137,519,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000},
    {134,0,540,5000,5000,5000,694,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000},
    {502,519,0,5000,601,433,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000},
    {5000,5000,5000,0,222,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000},
    {5000,5000,5000,218,0,626,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000},
    {5000,5000,600,5000,643,0,481,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000},
    {5000,709,433,5000,5000,479,0,5000,510,566,662,5000,5000,5000,5000,5000,5000,5000},
    {5000,5000,5000,5000,873,746,5000,0,5000,5000,5000,5000,5000,304,5000,5000,815,5000},
    {5000,5000,5000,5000,5000,5000,513,5000,0,377,533,5000,5000,5000,5000,5000,5000,5000},
    {5000,5000,5000,5000,5000,5000,569,5000,385,0,170,5000,5000,5000,5000,5000,5000,5000},
    {5000,5000,5000,5000,5000,5000,5000,5000,5000,169,0,305,280,5000,5000,5000,5000,5000},//南京
    {5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,308,0,178,5000,5000,5000,5000,5000},
    {5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,279,177,0,5000,5000,531,5000,5000},
    {5000,5000,5000,5000,5000,5000,5000,301,5000,5000,5000,5000,5000,0,888,5000,843,5000},
    {5000,5000,5000,5000,5000,5000,5000,5000,333,5000,5000,5000,5000,905,0,337,5000,5000},
    {5000,5000,5000,5000,5000,5000,5000,5000,342,437,5000,5000,523,5000,337,0,5000,780},
    {5000,5000,5000,5000,5000,5000,5000,815,5000,5000,5000,5000,5000,836,5000,5000,0,5000},
    {5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,5000,676,780,5000,0},
    };

void luchu()
{
    for(int i=0;i<18;i++)
    for(int j=0;j<18;j++)
        wei[i][j]=1;
    for(int i = 0;i < 18;i++)
    {
        for(int j = 0;j < 18;j++)
        {
            lu[i][j][wei[i][j]]=i;
            wei[i][j]++;
            lu[i][j][wei[i][j]]=j;
            wei[i][j]++;
        }
    }
}
void floyd()
{
    int i,j,k;
    for(k = 0;k < 18;k++)
    {
        for(i = 0;i < 18;i++)
        {
            for(j = 0;j < 18;j++)
            {
                if(ans[i][j]>ans[i][k]+ans[k][j] )
                {
                    ans[i][j]=ans[i][k]+ans[k][j];
                    int w;
                    for(w=1;w<wei[i][k];w++)
                    {
                        lu[i][j][w]=lu[i][k][w];     
                    }
                    for(w=2;w<wei[k][j];w++)
                    {
                        lu[i][j][wei[i][k]+w-2]=lu[k][j][w];     
                    }
                    wei[i][j]=wei[i][k]+wei[k][j]-2;
                }
            }
        }
    }
}
 
void print(int m)               //待改
{
    int i;
    int x,y;
    scanf("%d",&m);
    int temp1[maxnum];
    int temp2[maxnum];
    for(i = 0;i < m;i++)
    {
        scanf("%d %d",&temp1[i],&temp2[i]);
    }
    printf("--------------------------------------------\n");
    for(i = 0;i < m;i++)
    {
        printf("%s -> %s 的最優(yōu)路徑長%dkm,最優(yōu)路徑為:\n",cheng[temp1[i]].name,cheng[temp2[i]].name,ans[temp1[i]][temp2[i]]);
        for(int j=1;j<maxnum;j++)
        {
            if(lu[temp1[i]][temp2[i]][j]!=temp2[i])
            printf("%s\n",cheng[lu[temp1[i]][temp2[i]][j]].name);
            else
            {
            printf("%s\n",cheng[lu[temp1[i]][temp2[i]][j]].name);
            printf("--------------------------------------------\n");
            break;
            }
        }
    }
}
int main()
{
    chu();
    int m;
    luchu();
    floyd();
    print(m);
    return 0;
}

到了這里,關(guān)于Floyd算法實現(xiàn)實際問題——18個城市間最優(yōu)路線規(guī)劃的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 集貨運輸優(yōu)化:數(shù)學建模步驟,Python實現(xiàn)蟻群算法(解決最短路徑問題), 蟻群算法解決旅行商問題(最優(yōu)路徑問題),節(jié)約里程算法

    目錄 數(shù)學建模步驟 Python實現(xiàn)蟻群算法(解決最短路徑問題) ?蟻群算法解決旅行商問題(最優(yōu)路徑問題)

    2024年02月09日
    瀏覽(93)
  • Floyd算法求解各頂點之間最短路徑問題

    Floyd算法求解各頂點之間最短路徑問題

    一、Floyd算法 概述 Floyd算法,也稱為Floyd-Warshall算法,是一種用于求解圖中所有節(jié)點之間最短路徑的算法。Floyd算法可以處理負權(quán)邊的情況,但是不能處理負權(quán)環(huán)。 Floyd算法基于動態(tài)規(guī)劃思想,通過一個二維數(shù)組記錄從一個節(jié)點到另一個節(jié)點的最短路徑長度。算法的核心思想是

    2024年02月05日
    瀏覽(23)
  • 弗洛伊德(Floyd)算法求個頂點之間最短路徑問題(詳解+圖解)

    弗洛伊德(Floyd)算法求個頂點之間最短路徑問題(詳解+圖解)

    具體來說,弗洛伊德算法通過求解所有點對之間的最短路徑來實現(xiàn)。在算法開始時,我們假設(shè)圖中的所有節(jié)點之間都是不聯(lián)通的,即它們之間的距離為無窮大。然后,我們對圖進行“松弛”操作,即嘗試更新每個節(jié)點之間的距離估計值,以尋找更短的路徑。具體來說,對于圖

    2024年02月08日
    瀏覽(24)
  • 最優(yōu)傳輸問題與Sinkhorn算法

    最優(yōu)傳輸問題與Sinkhorn算法

    最近看到一篇特征匹配相關(guān)的論文,思想是將特征匹配問題轉(zhuǎn)化為最優(yōu)傳輸問題求解,于是我去學習了一下最優(yōu)傳輸問題。 本文主要是對博文 Notes on Optimal Transport 的學習做一個記錄總結(jié),該博文寫的不錯,推薦閱讀。 文章作者以一個簡單的甜點分配例子引入了最優(yōu)傳輸問題

    2024年02月03日
    瀏覽(22)
  • Floyd_Warshall算法詳解及實現(xiàn)(多源最短路徑)

    Floyd_Warshall算法詳解及實現(xiàn)(多源最短路徑)

    小明要去這樣的城市旅游(城市交通圖如下),為了減輕經(jīng)濟負擔,小明想知道任意兩個城市之間的最短路徑。 從圖中,可以得到:小明打算去4個城市(節(jié)點數(shù))旅游,而這4個城市之間有8條公路(邊數(shù))連通,公路上的數(shù)字(權(quán)重)表示這條公路的長短。 現(xiàn)在需要設(shè)計一

    2023年04月17日
    瀏覽(20)
  • 最優(yōu)化:建模、算法與理論(典型優(yōu)化問題

    最優(yōu)化:建模、算法與理論(典型優(yōu)化問題

    4.1.1 基本形式和應用背景 再次說明一下,其實這本書很多的內(nèi)容之前肯定大家都學過,但是我覺得這本書和我們之前學的東西的出發(fā)角度不一樣,他更偏向數(shù)學,也多一個角度讓我們?nèi)ダ斫?線性規(guī)劃問題的一般形式如下: min ? x ∈ R n c T x s . t . A x = b G x ≤ e (4.1.1) min_{x{

    2024年02月09日
    瀏覽(26)
  • 計算機算法分析與設(shè)計(14)---貪心算法(會場安排問題和最優(yōu)服務次序問題)

    計算機算法分析與設(shè)計(14)---貪心算法(會場安排問題和最優(yōu)服務次序問題)

    ?假設(shè)在足夠多的會場里安排一批活動,并希望使用盡可能少的會場。設(shè)計一個有效的貪心算法進行安排。 數(shù)據(jù)輸入: 第 1 1 1 行中有一個整數(shù) n n n ,表示有 n n n 個待安排的活動。接下來的 n n n 行中,每行有 2 2 2 個正整數(shù),分別表示 n n n 個待安排的活動的開始時間和結(jié)束

    2024年02月02日
    瀏覽(19)
  • 【算法設(shè)計與分析】C++獨立任務最優(yōu)調(diào)度問題

    一、問題描述: ? 用2臺處理機A和B處理n個作業(yè)。設(shè)第i個作業(yè)交給機器A處理時需要時間ai,若由機器B來處理,則需要時間bi。由于各作業(yè)的特點和機器的性能關(guān)系,很可能對于某些i,有aibi,而對于某些j,j≠i,有ajbj。既不能將一個作業(yè)分開由2臺機器處理,也沒有一臺機器能同

    2024年02月11日
    瀏覽(19)
  • 深度學習求解稀疏最優(yōu)控制問題的并行化算法

    問題改編自論文An FE-Inexact Heterogeneous ADMM for Elliptic Optimal Control Problems with L1-Control Cost { min ? y ( μ ) , u ( μ )

    2024年02月07日
    瀏覽(21)
  • Java使用遺傳算法,尋找十滴水問題的最優(yōu)解

    Java使用遺傳算法,尋找十滴水問題的最優(yōu)解

    近期某手游出了個活動,經(jīng)確認發(fā)現(xiàn)本質(zhì)為十滴水游戲。 簡單說一下規(guī)則,棋盤大小通常為6x6,在游戲開始時,棋盤隨機有若干水珠,其大小范圍為1-4。點擊棋盤內(nèi)的一格,會消耗玩家持有的1個小水滴,同時使得該單元格的水珠大小+1。如果水珠大小超過4,則水珠發(fā)生爆炸

    2024年02月20日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包