![用貪心法求解船舶裝卸問題(python版)_第1頁](http://file1.renrendoc.com/fileroot_temp2/2020-6/22/80458bad-ce70-4223-a5cc-f0f8e65b8c42/80458bad-ce70-4223-a5cc-f0f8e65b8c421.gif)
![用貪心法求解船舶裝卸問題(python版)_第2頁](http://file1.renrendoc.com/fileroot_temp2/2020-6/22/80458bad-ce70-4223-a5cc-f0f8e65b8c42/80458bad-ce70-4223-a5cc-f0f8e65b8c422.gif)
![用貪心法求解船舶裝卸問題(python版)_第3頁](http://file1.renrendoc.com/fileroot_temp2/2020-6/22/80458bad-ce70-4223-a5cc-f0f8e65b8c42/80458bad-ce70-4223-a5cc-f0f8e65b8c423.gif)
![用貪心法求解船舶裝卸問題(python版)_第4頁](http://file1.renrendoc.com/fileroot_temp2/2020-6/22/80458bad-ce70-4223-a5cc-f0f8e65b8c42/80458bad-ce70-4223-a5cc-f0f8e65b8c424.gif)
![用貪心法求解船舶裝卸問題(python版)_第5頁](http://file1.renrendoc.com/fileroot_temp2/2020-6/22/80458bad-ce70-4223-a5cc-f0f8e65b8c42/80458bad-ce70-4223-a5cc-f0f8e65b8c425.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1、 課題名稱 用貪心法求解船舶裝卸問題二、課題內(nèi)容和要求 設(shè)計(jì)要求:學(xué)習(xí)算法設(shè)計(jì)中貪心法的思想,設(shè)計(jì)算法編程解決如下現(xiàn)實(shí)問題:碼頭上有n艘船舶同時(shí)等待裝卸,而碼頭每次只能裝卸一艘船舶。船舶i需要裝卸的時(shí)間為ti,1in。應(yīng)如何安排這n艘船舶的裝卸次序才能使得總的等待時(shí)間達(dá)到最小?(總的等待時(shí)間是每艘船舶的等待時(shí)間的總和) (1)給出求解此問題的貪心算法; (2)說明你所給出的算法的時(shí)間復(fù)雜性。三、需求分析功能分析: 貪心算法是指,在對(duì)問題求解時(shí),總是做出在當(dāng)前看來是最好的選擇。也就是說,不從整體最優(yōu)上加以考慮,他所做出的僅是在某種意義上的局部最優(yōu)解。貪心算法不是對(duì)所有問題都能得到整體最優(yōu)解,
2、但對(duì)范圍相當(dāng)廣泛的許多問題他能產(chǎn)生整體最優(yōu)解或者是整體最優(yōu)解的近似解。1. 本程序要求使用的算法為貪心法,那么我們就要對(duì)它有一定的認(rèn)識(shí)和了解。因求解問題是總是要做出當(dāng)前看來是最好的選擇,所以我們就要有一個(gè)約束條件來對(duì)符合要求的解進(jìn)行甄選。2.尋找最優(yōu)解:假設(shè)有n條船停在碼頭,每艘船的編號(hào)分別是1i(1=i t2 t3 . tn-2 tn-1下面證明上面的猜測(cè):(用反證法)如果讓t1 和 t2 的位置互換,即T總 1= n*0 + (n-1)*t2 + (n-2)*t1 + (n-3)*t3 + . + 2*tn-2 + tn-1 + 0*tn此時(shí) T總 1 - T總 =((n-1)*t2 +
3、(n-2)*t1)- ((n-1)*t1 + (n-2)*t2) = t2 - t1 0所以 T總 1 - T總 0 ,即 T總 1 T總 同理:任意交換ti和tj,總能得到 T總 1 T總 ,所以可以證明猜測(cè)成立。所以可以得到篩選函數(shù)的算法,即:每次挑選需要卸載時(shí)間ti最短的船進(jìn)行卸載,此時(shí)全部船舶的總等待時(shí)間最短。4、 概要設(shè)計(jì)(使用Python語言實(shí)現(xiàn))1.定義船舶類:class Boat(object): def _init_(self,bNum,tNeed,tWait): self.boatNum = bNum self.timeNeed = tNeed self.timeWait
4、= tWait2.等待船舶列表初始化為空: boatWaitList = 3.結(jié)束卸貨船舶列表初始化為空: boatFinishList = 開始4.算法流程圖:初始化船舶信息,其中船舶卸貨需要的時(shí)間tn為隨機(jī)產(chǎn)生for i in range(NUM): boatWaitList.append(Boat(i,randint(1,MAXTIME),0)i = 0遍歷NUM次boatWaitList,每次找出最小卸貨時(shí)間,并添加到boatFinishList中。然后刪除此船舶信息,并把等待的船舶加上此船的卸貨時(shí)間for i in range(NUM): temp = NUM + 1 minTime
5、 = MAXTIME for j in range(len(boatWaitList): if boatWaitListj.timeNeed minTime: minTime = boatWaitListj.timeNeed temp = ji NUMYESNO遍歷結(jié)束卸貨列表boatFinishList,求出每艘船的等待時(shí)間和所有穿的總等待時(shí)間for i in range(NUM): timeSum += boatFinishListi.timeWait結(jié)束五、詳細(xì)設(shè)計(jì)#-*- coding:gbk -*-from random import randint#給出船舶總數(shù)NUM = 20#預(yù)
6、定一個(gè)最大卸貨時(shí)間MAXTIME = 20#總等待時(shí)間初始值為零timeSum = 0#-初始化船舶信息-#定義Boat類,它有三個(gè)成員變量,分別為:船舶編號(hào)boatNum,卸貨需要的時(shí)間timeNeed,#卸貨前需要等待的時(shí)間timeWaitclass Boat(object): def _init_(self,bNum,tNeed,tWait): self.boatNum = bNum self.timeNeed = tNeed self.timeWait = tWait#定義正在正待的船舶列表boatWait = #定義已經(jīng)完成卸貨的船舶列表boatFinish = print n全部%
7、s艘船需要的時(shí)間分別為:%NUM#初始化所有船舶的信息,編號(hào)從0到NUM-1,需要時(shí)間從1到MAXTIME中間隨機(jī),等待時(shí)間設(shè)為0for i in range(NUM): boatWait.append(Boat(i,randint(1,MAXTIME),0) print 第%s艘船需要%s分鐘.%(boatWaiti.boatNum+1,boatWaiti.timeNeed) #-開始卸貨-#print n船舶卸貨的順序?yàn)椋?遍歷NUM次等待船舶列表boatWaitfor i in range(NUM): #temp值為記錄當(dāng)前等待船舶列表boatWait中,卸貨需要的時(shí)間最短的船舶在當(dāng)前b
8、oatWait中的位置 temp = NUM + 1 #minTime記錄當(dāng)前boatWait列表中,卸貨所需的最短時(shí)間 minTime = MAXTIME #遍歷當(dāng)前第i次遍歷的等待船舶列表boatWait for j in range(len(boatWait): #從0號(hào)船舶開始,如果當(dāng)前船舶卸貨所需的時(shí)間小于minTime,則把它的時(shí)間值賦給minTime #同時(shí)記錄下此船在當(dāng)前boatWait中的位置 if boatWaitj.timeNeed = minTime: minTime = boatWaitj.timeNeed temp = j #第i次遍歷boatWait后,把卸貨時(shí)間
9、最短的船舶boatWaittemp加到完成卸貨船舶列表boatFinish中 boatFinish.append(boatWaittemp) #在第i次遍歷的bootWait列表中刪除上面找出的最短時(shí)間船舶 del boatWaittemp #對(duì)等待船舶列表中的所有船舶,加上上面找出的最短等待時(shí)間minTime for k in range(len(boatWait): boatWaitk.timeWait += minTime #-卸貨完成-# #遍歷卸貨完成船舶列表boatFinish,求出船舶總等待時(shí)間for i in range(NUM): timeSum += boatFinishi
10、.timeWait print 第%s艘船,它等待了%s分鐘.%(boatFinishi.boatNum+1,boatFinishi.timeWait)print n所有船舶的總等待時(shí)間為:%s分鐘,平均等待時(shí)間為%s分鐘%(timeSum,timeSum/NUM)六、測(cè)試數(shù)據(jù)及其結(jié)果分析對(duì)NUM和MAXTIME去不同的值,可以獲得不同級(jí)別的模擬結(jié)果: 1.設(shè)置NUM = 20,MAXTIME = 20 2.設(shè)置NUM = 20,MAXTIME = 10 3.設(shè)置NUM = 10,MAXTIME = 20 4.設(shè)置NUM = 10, MAXTIME = 10七、調(diào)試過程中的問題最初的想法很簡(jiǎn)單,既然每次都要找到卸貨時(shí)間最短的船,那不如在程序開始之前,就把船的序號(hào)按照卸貨時(shí)間的長(zhǎng)短進(jìn)行排序,這樣一來只用遍歷這個(gè)有序列表即可。后來在做的過程中發(fā)現(xiàn)這樣并不是很簡(jiǎn)單,因?yàn)檫@樣做只是在每次取值的時(shí)候變得簡(jiǎn)便,如果需要計(jì)算每艘船
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 家族公有住宅租賃合同范本
- cif進(jìn)口合同范本
- 人入干股合同范例
- 999玫瑰買賣合同范本
- 共同合租合同范例
- 商務(wù)房屋租賃合同范本
- 保健內(nèi)衣購(gòu)銷合同范本
- 住宿預(yù)定服務(wù)合同范本
- 貨物出口貿(mào)易合同范本
- 中空鋼化玻璃銷售合同范本
- 醫(yī)療器械法規(guī)培訓(xùn)
- 2023中華護(hù)理學(xué)會(huì)團(tuán)體標(biāo)準(zhǔn)-注射相關(guān)感染預(yù)防與控制
- 《數(shù)字電子技術(shù)》課程說課課件
- 2024河南省鄭州市公安局輔警招聘2024人歷年高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- -精益與智能工廠三年規(guī)劃
- 2024年高素質(zhì)農(nóng)民職業(yè)技能大賽(農(nóng)業(yè)經(jīng)理人)賽項(xiàng)考試題庫(kù)-下(多選、判斷題)
- 北師大版數(shù)學(xué)八年級(jí)上冊(cè)1.1探索勾股定理 同步練習(xí)【基礎(chǔ)版】(附答案解析)
- 開發(fā)商物業(yè)維修合同
- 德育教育教案8篇-范本兩篇
- JBT 14685-2023 無油渦旋空氣壓縮機(jī) (正式版)
- 行政倫理學(xué)教程(第四版)課件 第6章?行政良心
評(píng)論
0/150
提交評(píng)論