電梯調度編程

題目

一棟10層的大樓(樓層編號1-10),設有一臺無限載重的電梯,初始時電梯停在1層。電梯移動1層的耗時爲1,在某一層停靠的耗時爲1(時間初始爲0)。爲了使得乘客等待的時間(電梯在目的層的停靠時刻 - 乘客發出請求時刻)總和最小,請你編寫一個程序來進行電梯調度。c++

輸入有5個請求,每一個請求一行,格式爲請求時刻 起始樓層數 去往方向,其中方向爲0表明向上去往10層,爲1表明向下去往1層。
輸出每次對應的決策,每一行的輸出格式爲xx時,停靠在x樓。其中,「xx時刻」指的是在某層樓停靠的時刻,且不算入在該層的停靠時間。如:git

1.當0時刻時,電梯此時在1層,輸入有0 1 0,那麼電梯從1層接客(1s)前往10層(9s),應輸出10時,停靠在10樓(1+9=10)。此時,該乘客等待時間爲(10-0=)10。
2.當0時刻,電梯此時在1層,輸入有0 2 0,那麼電梯從1層前往2層(1s),接上乘客(1s),前往10層(8s),應輸出10時,停靠在10樓(1+1+8=10)。此時,該乘客等待時間爲(10-0=)10s。
最後輸出完成5個請求(全部乘客都到達目的地)後,各乘客的等待時間總和。github

要求

請本身設計5組測試用例,且具備必定表明性,用以驗證程序是不是最小耗時。編程

編程語言選擇C或C++均可以,但須要符合編碼規範,且必需要有註釋。要求在github上創建一個倉庫,將本次做業代碼提交到該倉庫,並在博客開頭給出倉庫地址。注意:commit信息要遵照必定的git規範(可參看:git commit 規範指南),git必須使用命令行操做,不要使用github圖形界面(可參看:廖雪峯Git教程)。數組

寫一篇博客,在博客中描述在編碼過程當中,程序的不斷優化過程。並列出一張表格,記錄編寫程序的代碼行數、調試的bug數 、完成該次做業總耗時。編程語言

思路

引入時間變量time記錄總時間,運行到每一個點判斷向上和向下的請求數並執行較大者(向下的請求數=目標爲1樓的請求個數+此時電梯下方未上電梯的請求個數,向上的請求數同理。當某一請求的請求時刻>time或已經登上電梯時,該請求不歸入計算。),每次運行到請求點或目的地時再執行判斷,直到全部乘客都到達目的地。函數

實現方式

把5個請求(a,b,c)輸入到結構體變量數組request[5]中,並按起始樓層從低到高將數組排序。測試

代碼1.0(不完滿)

#include<stdio.h>
int main()
{
    
    struct request
        {   
            int a;  int b;  int c;  
        }
     request[5],temp;//定義結構體數組request和變量temp,用於於存入請求和暫存排序交換。 
    int i,j,down=0,up=0,time=0,sum_c=0,t[20],f[20],un_down=0,un_up=0,down_ac,up_ac,down_to_1=0,up_to_10=0,above=0,below=0,ac=0,f_now;
    //a[20]用來存目標樓層 
    for(i=0;i<5;i++)
        scanf("%d%d%d",&request[i].a,&request[i].b,&request[i].c);//輸入5個請求賦值到結構體變量數組中 。 
    for(i=1;i<5;i++)
        {
            sum_c+=request[i].c;
            if(request[i].b<request[i-1].b)
                {
                    temp=request[i];request[i]=request[i-1];request[i-1]=temp;
                }//按起始樓層從低到高排序數組。 
        }
    for(time=0; ;time++)
    {   for(i=0;i<5;i++)
        {
            if(request[i].b!=0)
            {
                if(request[i].b<f_now)
                    below++;//below記錄此時電梯下方且未上電梯的請求個數
                else
                    above++;//above記錄此時電梯上方且未上電梯的請求個數
            }
        }
        down=sum_c+below;//向下的請求數=目標爲1樓的請求個數+此時電梯下方且未上電梯的請求個數
        up=5-sum_c+5-below;//向下的請求數=目標爲10樓的請求個數+此時電梯上方且未上電梯的請求個數
        for(ac=1;;)
        {
            if(down>=up)
            {
                if(i==0)
                f_now=1;
                else
                f_now=request[i-1].b;
                if(f_now==1)
                    for(i=0;i<5;i++)
                    if(request[i].c==1)
                    {
                        request[i].b=0;down_to_1=1;//down_to_1=1表示向下到一樓的乘客已經到達 
                    }
                
            }
            else 
            {
                if(i=4)
                f_now=10;
                else
                f_now=request[i+1].b;
                if(f_now==10)
                    for(i=0;i<5;i++)
                    if(request[i].c==10)
                    {
                        request[i].b=0;up_to_10=1;
                    }
            }
            for(j=0;j<5;j++)
                if(request[j].b==f_now)
                {
                    t[ac]=time;f[ac]==f_now;ac++;//ac記錄電梯第幾回停靠,t[ac]記錄停靠時間,f[ac]記錄停靠樓層 
                }
                 
        } 
        if(down_to_1==1&&up_to_10==1) break;    
    }
    for(i=1;i<ac;i++)
    printf("%d時,停靠在%d樓",t[ac],f[ac]); 
    return 0; 
}

歷史思路(bug之路)

1.從電梯有幾種運行路線出發,分爲不回頭,回頭一次,回頭兩次...結果發現狀況太複雜,判斷條件太難寫,不可實現就捨棄了。
2.從逆向考慮,問題至關於電梯在一樓先載上全部人,而後再逐個卸下。而後最後發現並不能使問題簡單化。優化

待優化:

1.把一些函數從主函數中剝離出來,下降代碼的耦合度
2.代碼還未完成,有不少bug
3.還未創建git庫編碼

相關文章
相關標籤/搜索