版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Python程序開發(fā)——信息管理部王輝——0103Python程序開發(fā)Python背景介紹02Python特色課程導(dǎo)航起源得名“1989年12月,我在尋找一門“課余”編程項(xiàng)目來打發(fā)圣誕節(jié)前后的時(shí)間。我的辦公室會(huì)關(guān)門,但我有一臺(tái)家用電腦,而且沒有太多其它東西。我決定為當(dāng)時(shí)我正構(gòu)思的一個(gè)新的腳本語言寫一個(gè)解釋器,它是ABC語言的后代,對(duì)UNIX/C程序員會(huì)有吸引力。作為一個(gè)略微有些無關(guān)想法的人,和一個(gè)蒙提·派森(MontyPython)的飛行馬戲團(tuán)的狂熱愛好者,我選擇了Python作為項(xiàng)目的標(biāo)題。”每個(gè)人都會(huì)ComputerProgrammingforEverybody1999年,Guido向DARPA
闡述Python語言的特性:
簡(jiǎn)單、直觀、強(qiáng)大
開源,以便任何人都可以為它做貢獻(xiàn)
代碼像純英語那樣容易理解
適用于短期開發(fā)的日常任務(wù)這些想法中的一些已經(jīng)成為現(xiàn)實(shí)。Python已經(jīng)成為一門流行的編程語言,尤其是在互聯(lián)網(wǎng)環(huán)境下。Python啟示錄Python崇尚優(yōu)美、清晰、簡(jiǎn)單,是一個(gè)優(yōu)秀并廣泛使用的語言。TIOBE語言排行第八,Google的第三大開發(fā)語言,Dropbox的基礎(chǔ)語言,豆瓣的服務(wù)器語言。0103Python程序開發(fā)Python背景介紹02Python特色課程導(dǎo)航特性交互式命令行(Interactiveconsole)不只是腳本強(qiáng)大易用的標(biāo)準(zhǔn)庫膠水語言(gluelanguage)收放自如(scalability)不要括號(hào)vsPerlvsRuby交互式命令行(Interactiveconsole)Python可以單步直譯運(yùn)行。運(yùn)行Python解釋器進(jìn)入交互式命令行的環(huán)境,你可以在提示符號(hào)>>>旁輸入代碼,按Enter鍵輸出結(jié)果:>>>print("Hello,Python!")Hello,Python!有點(diǎn)像Shell腳本的執(zhí)行方式。不只是腳本原因是“腳本語言”泛指僅作簡(jiǎn)單編程任務(wù)的語言,如Linuxshellscript、JavaScript等,它們只能處理簡(jiǎn)單的任務(wù)而Python是面向?qū)ο缶幊蹋∣OP)的,支持異常處理和類型檢查Python的支持者較喜歡稱它為一種高階動(dòng)態(tài)編程語言強(qiáng)大大易易用用的的標(biāo)標(biāo)準(zhǔn)準(zhǔn)庫庫核心心庫庫不不超超過過10MbHtml、Xml解析析::BeautifulSoup,Expat字符符串串處處理理::字字典典、、數(shù)數(shù)組組切切片片、、正正則則表表達(dá)達(dá)式式re單元測(cè)試:PyUnit代碼版本控制制:PySVN網(wǎng)絡(luò)訪問:urllib2圖形模塊:Tkinter、PyTCL、WxPython串行化、多線線程等擴(kuò)展標(biāo)準(zhǔn)庫十十分容易膠水語言(gluelanguage)Python經(jīng)常用作將不不同語言編寫寫的程序“粘粘”在一起的的膠水語言。。Google內(nèi)部的很多項(xiàng)項(xiàng)目使用C++編寫性能要求求極高的部分分,然后用Python調(diào)用相應(yīng)的模模塊。C/C++:Boost.Python使得Python和C++的類庫能互相相調(diào)用(.pyc)Java:Jython是用Java實(shí)現(xiàn)的Python,可同時(shí)使用用二者的類庫庫.NET:IronPython是Python在.NET平臺(tái)上的版本本。收放自如(scalability)不要括號(hào)Python使用縮進(jìn)而不不是括號(hào)來進(jìn)進(jìn)行代碼段標(biāo)標(biāo)識(shí),減少了了視覺上的混混亂,并且使使程序變短,,從而提高了了程序的可讀讀性。vs.Perl程序員的三大大美德懶惰:能讓人盡量減減少總能量支支出的美德。。它使你寫出出節(jié)省腦力、、可以重用的的代碼;也督督促你為程序序?qū)懽⑨尯臀奈臋n,那樣你你就不用回答答各種問題。。所以它是程程序員的第一一大美德。所所以有了這本本書。參見下下兩條。不耐煩:當(dāng)電腦想偷懶懶時(shí)你爆發(fā)的的怒氣.它使你寫的代代碼能主動(dòng)預(yù)預(yù)測(cè)、而非被被動(dòng)滿足用戶戶需求,至少少裝作是這樣樣。所以它是是程序員的第第二大美德。。參見懶惰和傲傲慢。傲慢:自傲到人神共共憤的程度,,也是一種品品質(zhì),能使你你編寫(維護(hù))的程序讓人無無可指摘。所所以它是程序序員的第三大大美德.參見前兩條。。觀點(diǎn)Perl之父LarryWall:“做一件事有有很多種方法法”Python資深開發(fā)者TimPeters:“做一件事,,應(yīng)該有一種種最直觀的方方法,而且最最好只有一種種。”Python之父GuidoVanRossum:“做一件事情情只有一種方方法”vs.RubyRuby:比Python更年輕的動(dòng)態(tài)態(tài)語言完全面向?qū)ο笙笾С终齽t表達(dá)達(dá)式整合了多種語語言的優(yōu)勢(shì)RubyonRails網(wǎng)站快速開發(fā)發(fā)工具松本行弘(“Matz”)“不要重復(fù)自自己”國(guó)籍語言作者作者國(guó)籍編程風(fēng)格PerlLarryWall美國(guó)隨性自由PythonGuidovanRossum荷蘭優(yōu)雅統(tǒng)一Ruby松本行弘(“Matz”)日本兼容并包用途腳本程序大型程序的原原型開發(fā)科學(xué)計(jì)算網(wǎng)絡(luò)應(yīng)用計(jì)算機(jī)圖形編編程知名的Python應(yīng)用GoogleAppsEngine“GoogleAppEngine可讓您在Google的基礎(chǔ)架構(gòu)上上運(yùn)行您的網(wǎng)網(wǎng)絡(luò)應(yīng)用程序序。AppEngine應(yīng)用程序易于于構(gòu)建和維護(hù)護(hù),并可根據(jù)據(jù)您的訪問量量和數(shù)據(jù)存儲(chǔ)儲(chǔ)需要的增長(zhǎng)長(zhǎng)輕松擴(kuò)展。。使用GoogleAppEngine,將不再需需要維護(hù)護(hù)服務(wù)器器:您只只需上傳傳您的應(yīng)應(yīng)用程序序,它便便可立即即為您的的用戶提提供服務(wù)務(wù)?!盤ython為GAE的數(shù)據(jù)存存儲(chǔ)區(qū)、、Google帳戶、網(wǎng)網(wǎng)址抓取取和電子子郵件服服務(wù)提供供了豐富富的PythonAPI。GAE還提供了了一個(gè)稱稱為webapp的簡(jiǎn)單Python網(wǎng)絡(luò)應(yīng)用用程序框框架,從從而可以以輕松開開始構(gòu)建建應(yīng)用程程序。GAE的的主要服服務(wù)動(dòng)態(tài)網(wǎng)絡(luò)絡(luò)服務(wù),,提供對(duì)對(duì)常用網(wǎng)網(wǎng)絡(luò)技術(shù)術(shù)的完全全支持持久存儲(chǔ)儲(chǔ)空間,,支持查查詢、分分類和事事務(wù)自動(dòng)擴(kuò)展展和負(fù)載載平衡用戶身份份驗(yàn)證和和使用Google帳戶發(fā)送送電子郵郵件的API一套在本本地模擬擬GAE的開發(fā)環(huán)環(huán)境用于在指指定時(shí)間間和定期期觸發(fā)事事件的計(jì)計(jì)劃任務(wù)務(wù)0103Python程序開發(fā)Python背景介紹紹02Python特色課程導(dǎo)航航HelloWorld例子子在hello.py中寫入如如下,并并保存:print('HelloWorld!')退出文本本編輯器器,然后后在命令令行輸入入:pythonhello.py可以看到到Python隨后輸出出:HelloWorld!基本本數(shù)數(shù)據(jù)據(jù)類類型型a=10#int整數(shù)數(shù)a=1.3#float浮點(diǎn)點(diǎn)數(shù)數(shù)a=True#真值值(True/False)a='Hello!'#字符符串串。。字字符符串串也也可可以以用用雙雙引引號(hào)號(hào)。。for循循環(huán)環(huán)for元元素素in序序列列:statement例子子::forain[3,4.4,'life']:printawhile循循環(huán)環(huán)while條件件:statement舉例例::whilei<10:printii=i+1sequence序列列sequence(序列列)是一一組組有有順順序序的的元元素素的的集集合合。。序列可可以包包含一一個(gè)或或多個(gè)個(gè)元素素,也也可以以沒有有任何何元素素。序列有有兩種種:tuple(美[t??pl]定值表表;也也有有翻譯譯為元元組))和和list(表)。tuple和list的主要要區(qū)別別在于于,一一旦建建立,,tuple的各個(gè)個(gè)元素素不可可再變變更,,而list的各個(gè)個(gè)元素素可以以再變變更。。s1=(2,1.3,'love',5.6,9,12,False)#s1是一個(gè)個(gè)tuples2=[True,5,'smile']#s2是一個(gè)個(gè)list序列元元素的的下標(biāo)標(biāo)從0開始print(s2[1])正則表表達(dá)式式正則表表達(dá)式式(regularexpression)主要功功能是是從字字符串串(string)中通過過特定定的模模式(pattern),搜索想想要找找到的的內(nèi)容容。在Python中使用用正則則表達(dá)達(dá)式需需要標(biāo)標(biāo)準(zhǔn)庫庫中的的一個(gè)個(gè)包re。importrem=re.search('[0-9]','abcd4ef')print(m.group(0))正則表表達(dá)式式m=re.search(pattern,string)#搜索整整個(gè)字字符串串,直直到發(fā)發(fā)現(xiàn)符符合的的子字字符串串。m=re.match(pattern,string)#從頭開開始檢檢查字字符串串是否否符合合正則則表達(dá)達(dá)式。。必須須從字字符串串的第第一個(gè)個(gè)字符符開始始就相相符。。正則表表達(dá)式式str=re.sub(pattern,replacement,string)#在string中利用用正則則變換換pattern進(jìn)行搜搜索,,對(duì)于于搜索索到的的字符符串,,用另另一字字符串串replacement替換。。返回回替換換后的的字符符串。。正則表表達(dá)式式re.split()#根據(jù)正正則表表達(dá)式式分割割字符符串,,將將分割割后的的所有有子字字符串串放在在一個(gè)個(gè)表(list)中返回re.findall()#根據(jù)正則則表達(dá)式式搜索字字符串,,將所有有符合的的子字符符串放在在一給表表(list)中返回正則表達(dá)達(dá)式正則表達(dá)達(dá)式的常常用語法法:1)單個(gè)字字符:.任意的一一個(gè)字符符a|b字符a或字符b[afg]a或者f或者g的一個(gè)字字符[0-4]0-4范圍內(nèi)的的一個(gè)字字符[a-f]a-f范圍內(nèi)的的一個(gè)字字符[^m]不是m的一個(gè)字字符\s一個(gè)空格格\S一個(gè)非空空格\d[0-9]\D[^0-9]\w[0-9a-zA-Z]\W[^0-9a-zA-Z]正則表達(dá)達(dá)式d2)重復(fù)緊跟在單單個(gè)字符符之后,,表示多多個(gè)這樣樣類似的的字符*重重復(fù)>=0次+重復(fù)>=1次?重復(fù)0或者1次{m}重復(fù)m次。比如如說a{4}相當(dāng)于aaaa,再比如如說[1-3]{2}相當(dāng)于[1-3][1-3]{m,n}重復(fù)m到n次。比如如說a{2,5}表示a重復(fù)2到5次。小于于m次的重復(fù)復(fù),或者者大于n次的重復(fù)復(fù)都不符符合條件件。正則表達(dá)達(dá)式正則表達(dá)達(dá)相相符符的字符符串舉例例[0-9]{3,5}9678a?bba+baaaaab正則表達(dá)達(dá)式正則表達(dá)達(dá)式的常常用語法法:1)單個(gè)字字符:.任意的一一個(gè)字符符a|b字符a或字符b[afg]a或者f或者g的一個(gè)字符[0-4]0-4范圍內(nèi)的一個(gè)個(gè)字符[a-f]a-f范圍內(nèi)的一個(gè)個(gè)字符[^m]不是m的一個(gè)字符\s一個(gè)空格\S一個(gè)非空格\d[0-9]\D[^0-9]\w[0-9a-zA-Z]\W[^0-9a-zA-Z]2)重復(fù)緊跟在單個(gè)字字符之后,表表示多個(gè)這樣樣類似的字符符*重重復(fù)
>=0
次+重重復(fù)
>=1
次?重重復(fù)
0或者者1
次{m}重重復(fù)m次。比比如說a{4}相當(dāng)于于aaaa,,再比如說[1-3]{2}相當(dāng)于于[1-3][1-3]{m,n}重重復(fù)m到n次次。比如說a{2,5}表示a重重復(fù)2到5次次。小于m次次的重復(fù),或或者大于n次次的重復(fù)都不不符合條件。。正則表達(dá)相相符符的字符串舉舉例[0-9]{3,5}9678a?bba+baaaaab兩個(gè)例子“集體智慧編編程”根據(jù)品味相似似度進(jìn)行電影影推薦(第2章)家族族旅旅行行問問題題的的最最優(yōu)優(yōu)化化算算法法(第5章)根據(jù)據(jù)品品味味相相似似度度進(jìn)進(jìn)行行電電影影推推薦薦基本本思思路路::從一一大大群群人人中中找找出出與與我我們們品品味味相相近近的的一一小小群群人人,,對(duì)對(duì)這這些些人人所所喜喜愛愛的的其其他他內(nèi)內(nèi)容容進(jìn)進(jìn)行行考考查查,,并并把把它它們們組組合合起起來來創(chuàng)創(chuàng)建建一一個(gè)個(gè)經(jīng)經(jīng)過過排排名名的的推推薦薦列列表表。。((協(xié)協(xié)作作過過濾濾CollaborativeFiltering)步驟驟::1.搜搜集集偏偏好好2.尋尋找找相相似似的的用用戶戶3.推推薦薦電電影影搜集集偏偏好好首先找到到一種表表示不同同人及其其偏好的的電影的的方法。??梢允褂糜萌藢?duì)幾幾部電影影的評(píng)分分來刻畫畫他們的的偏好,,評(píng)分從從1到5,分?jǐn)?shù)越高高,表示示某人對(duì)對(duì)該電影影越喜歡歡。如何建立立這種從從人到電電影的對(duì)對(duì)應(yīng)關(guān)系系?Python中有一個(gè)個(gè)很簡(jiǎn)單單的方法法來表示示這種數(shù)數(shù)據(jù)結(jié)構(gòu)構(gòu):使用嵌套的字字典。搜集偏好好創(chuàng)建名為為recommandations.py的數(shù)據(jù)文文件:critics={'LisaRose':{'LadyintheWater':2.5,'SnakesonaPlane':3.5,'JustMyLuck':3.0,'SupermanReturns':3.5,'You,MeandDupree':2.5,'TheNightListener':3.0},'GeneSeymour':{'LadyintheWater':3.0,'SnakesonaPlane':3.5,'JustMyLuck':1.5,'SupermanReturns':5.0,'TheNightListener':3.0,'You,MeandDupree':3.5}'Toby':{'SnakesonaPlane':4.5,'You,MeandDupree':1.0,'SupermanReturns':4.0}}}搜集偏好好我們可以以使用交交互控制制臺(tái)對(duì)字字典的數(shù)數(shù)據(jù)進(jìn)行行查詢和和修改::>>fromrecommendationsimportcritics>>critics['LisaRose']['LadyintheWater']2.5>>critics['Toby']['SnakesonaPlane']=4.5>>critics['Toby']{'SnakesonaPlane':4.5,'You,MeandDupree':1.0}尋找相似似的用戶戶收集了人人們的偏偏好數(shù)據(jù)據(jù)后,我我們需要要方法來來計(jì)算某某兩個(gè)人人電影品品味的相相似度。。有兩種基基本的方方法可以以實(shí)現(xiàn)這這個(gè)目的的:歐幾里得得距離皮爾遜相相關(guān)度歐幾里得得距離評(píng)評(píng)價(jià)以二維空空間中的的情形為為例:設(shè)設(shè)坐標(biāo)軸軸為人們都都評(píng)價(jià)過過的兩部部電影,,然后將將參與評(píng)價(jià)價(jià)的人根根據(jù)他們們對(duì)這兩兩部電影影的評(píng)分繪繪制到圖圖上,并并考察他他們彼此此間的距離離,如圖圖:圖中的點(diǎn)點(diǎn)距離越越近,表表明兩個(gè)個(gè)人的偏偏好越接接近。推推廣到多多維向量空間間,歐幾幾里得法法可表示示為:計(jì)計(jì)算每一一軸上兩兩點(diǎn)的差差值求平方,再再將各軸軸相加,,最后取取平方根根。歐幾里得得距離評(píng)評(píng)價(jià)如計(jì)算Toby和LaSalle的距離::>>frommathimportsqrt>>sqrt(pow(5-4,2)+pow(4-1,2))3.1622776601683795為了給偏偏好接近近的情況況給出較較大的值值,可取取該值的倒倒數(shù),并并+1避免除數(shù)數(shù)為0:>>1/(1+sqrt(pow(5-4,2)+pow(4-1,2)))0.2402530733520421歐幾里得得距離評(píng)評(píng)價(jià)使用這種種方法構(gòu)構(gòu)造出出如下相相似度函函數(shù):defsim_distance(prefs,person1,person2):#得到共同同的電影影si={}foriteminprefs[person1]:ifiteminprefs[person2]:si[item]=1#如果沒沒有共共同的的電影影則返返回0iflen(si)==0:return0#計(jì)算歐歐幾里里得距距離,,返回回相似似度Sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)foriteminprefs[person1]ifiteminprefs[person2]])return1/(1+sum_of_squares)皮爾遜遜相關(guān)關(guān)度皮爾遜遜相關(guān)關(guān)系數(shù)數(shù)是一一種更更復(fù)雜雜的方方法,,它通通過計(jì)計(jì)算兩兩組數(shù)數(shù)據(jù)與某一一直線線擬合合的程程度來來判斷斷它們們的相相似程程度。。該方法法有助助于克克服所所謂的的“夸夸大評(píng)評(píng)價(jià)””現(xiàn)象象對(duì)結(jié)結(jié)果的的影響響。右圖中中,雖雖然Jack對(duì)對(duì)電影影的評(píng)評(píng)價(jià)比Lisa更為為極端端(更更容易易給出出高分分和低分分),但這這個(gè)坐坐標(biāo)系系中的的點(diǎn)都都相當(dāng)靠靠近擬擬合曲曲線(圖中中虛線線),,可以說兩兩人的的品味味較為為相近近。皮爾遜相關(guān)度度使用如下函數(shù)數(shù)計(jì)算皮爾遜遜相關(guān)度,該函數(shù)返回一一個(gè)-1到1的值:defsim_pearson(prefs,p1,p2):#得到共同評(píng)價(jià)價(jià)的電影si={}foriteminprefs[p1]:ifiteminprefs[p2]:si[item]=1#如果沒有共同同評(píng)價(jià)的電影影,返回0iflen(si)==0:return0#將兩人的偏好好相加sum1=sum([prefs[p1][it]foritinsi])sum2=sum([prefs[p2][it]foritinsi])皮爾遜相關(guān)度度#計(jì)算平方和sum1Sq=sum([pow(prefs[p1][it],2)foritinsi])sum2Sq=sum([pow(prefs[p2][it],2)foritinsi])#計(jì)算對(duì)應(yīng)項(xiàng)的的乘積和pSum=sum([prefs[p1][it]*prefs[p2][it]foritinsi])#計(jì)算皮爾遜相相關(guān)度num=pSum-(sum1*sum2/n)den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))ifden==0:return0r=num/denreturnr皮爾遜相關(guān)度度在交互式控制制臺(tái)中使用上上述兩種計(jì)算算方法:>>>reload(recommendations)>>>recommendations.sim_distance(recommendations.critics,...'LisaRose','GeneSeymour')0.148148148148>>>recommendations.sim_pearson(recommendations.critics,...'LisaRose','GeneSeymour')0.396059017191給評(píng)論者打分分有了對(duì)兩個(gè)人人進(jìn)行比較的的函數(shù),下面面就可以找出出與某人品味味最接近的人了了,進(jìn)而,可可以根據(jù)這些些人的喜好來來推薦電影。。deftopMatches(prefs,person,n=5,similarity=sim_pearson):scores=[(similarity(prefs,person,other),other)forotherinprefsifother!=person]#對(duì)list排序,,相似似度最最高的的人排排在最最前scores.sort()scores.reverse()returnscores[0:n]在交互互控制制臺(tái)中中使用用該函函數(shù)::>>recommendations.topMatches(recommendations.critics,'Toby',n=3)[(0.99124070716192991,'LisaRose'),(0.92447345164190486,'MickLaSalle'),(0.89340514744156474,'ClaudiaPuig')]推薦薦電電影影我們們固固然然可可以以選選擇擇只只看看那那些些和和我我們們品品味味相相近近的的人人推推薦薦的的電電影影,,但但這這樣樣做做太太武武斷斷,,也也許許某某部部電電影影大大家家普普遍遍都都覺覺得得不不錯(cuò)錯(cuò),,而而恰恰好好與與我我們們最最相相近近的的那那個(gè)個(gè)人人沒沒有有看看過過。。所以以,,我我們們需需要要一一種種對(duì)對(duì)推推薦薦人人進(jìn)進(jìn)行行加加權(quán)權(quán)的的推推薦薦,,如如下下表表::給Toby的電電影影推推薦薦表表推薦薦電電影影S.X打頭頭的的列列是是經(jīng)經(jīng)過過加加權(quán)權(quán)的的電電影影評(píng)評(píng)分分。。下面面的的代代碼碼給給出出了了上上述述過過程程的的具具體體實(shí)實(shí)現(xiàn)現(xiàn)::defgetRecommendations(prefs,person,similarity=sim_pearson):totals={}simSums={}forotherinprefs:#不和自己比比ifother==person:continuesim=similarity(prefs,person,other)#忽略小于等等于0的評(píng)分ifsim<=0:continueforiteminprefs[other]:推薦電影#只計(jì)算我沒沒看過的電電影ifitemnotinprefs[person]orprefs[person][item]==0:#相似度乘以以得分totals.setdefault(item,0)totals[item]+=prefs[other][item]*sim#相似度求和和simSums.setdefault(item,0)simSums[item]+=sim#對(duì)結(jié)果進(jìn)行行歸一化rankings=[(total/simSums[item],item)foritem,totalintotals.items()]#排序并返回回結(jié)果rankings.sort()rankings.reverse()returnrankings推薦電影然后就可以以看結(jié)果了了:>>>reload(recommendations)>>>recommendations.getRecommendations(recommendations.critics,'Toby')[(3.3477895267131013,'TheNightListener'),(2.8325499182641614,'LadyintheWater'),(2.5309807037655645,'JustMyLuck')]>>>recommendations.getRecommendations(recommendations.critics,'Toby',...similarity=recommendations.sim_distance)[(3.5002478401415877,'TheNightListener'),(2.7561242939959363,'LadyintheWater'),(2.4619884860743739,'JustMyLuck')]結(jié)果顯示,,人們?yōu)門oby推薦了三部部電影,而而且用兩種種相似度地算方法法得到的列列表是一樣樣的??偨Y(jié)到此為止,,我們建立立了一個(gè)完完整的推薦薦系統(tǒng),它它適用于任任何的商品推薦以以及基于相相似度的數(shù)數(shù)據(jù)關(guān)系挖挖掘。。而這一切在在Python中,僅僅是是建立一個(gè)個(gè)涉及人、、商品以及及評(píng)價(jià)值的字典,,然后根據(jù)據(jù)某些相似似度算法得得出的人與與人的相似似度,就可以進(jìn)行行推薦了。。0103Python程序開發(fā)Python背景介紹02Python特色課程導(dǎo)航家族旅行問問題的最優(yōu)優(yōu)化算法問題描述::Glass一家住在美美國(guó)不同的的地方。他他們希望在在紐約相聚聚,在同一一天從各地地坐飛機(jī)到到紐約,幾幾天后再一一起離開。。每天有許許多往返的的航班,起起飛時(shí)間、、價(jià)格以及及飛行時(shí)間間都不相同同?,F(xiàn)在需要找找到一種好好的日程安安排,使得得大家的旅旅行花費(fèi)盡盡可能少、、等待親友友的時(shí)間盡盡可能短、、乘坐飛機(jī)機(jī)的時(shí)間盡盡可能短。。建立文件optimization.py,加入如下代代碼:people=[('Seymour','BOS'),('Franny','DAL'),('Zooey','CAK'),('Walt','MIA'),……('Buddy','ORD'),('Les','OMA')]#目的地:紐紐約LaGuardia機(jī)場(chǎng)destination='LGA'問題分析首先要找到一一種通用的表表示日程安排排方案的方法法。然后,為了描描述某種方案案的好壞,需需要定義某種種函數(shù)。在優(yōu)優(yōu)化問題中,這個(gè)個(gè)函數(shù)叫做代代價(jià)函數(shù)(costfunciton)。一一個(gè)方案越好,它的代價(jià)價(jià)函數(shù)值越小小。這樣找最最優(yōu)方案的問問題轉(zhuǎn)化為找找代價(jià)函數(shù)值最小小的方案的問問題。最后設(shè)法找出出具有最小代代價(jià)函數(shù)值的的方案,完成成優(yōu)化過程。。導(dǎo)入數(shù)據(jù)描述方案如何描述各種種方案呢?一一個(gè)通用的方方法是使用數(shù)數(shù)字列表,它使得之后描描述的優(yōu)化算算法并不依賴賴于具體的問問題。本例中,用數(shù)數(shù)字表示某人人乘坐當(dāng)天的的第幾趟航班班,0代表第一趟,1代表第二趟,,以此類推。。由于每個(gè)人都都要選擇往和和返兩趟班機(jī)機(jī),所以列表表的總長(zhǎng)是人數(shù)的兩倍。。例如:[1,4,3,2,7,3,6,3,2,4,5,3]該方案表示Seymour坐第2趟航班去紐約約,坐第5趟航班回回波士頓頓Franny坐第4趟航班去去紐約,,坐第3趟回達(dá)拉拉斯。代價(jià)函數(shù)數(shù)代價(jià)函數(shù)數(shù)的選取取是優(yōu)化化算法的的重要環(huán)環(huán)節(jié)。本例中,,可以綜綜合考慮慮如下因因素來構(gòu)構(gòu)造代價(jià)價(jià)函數(shù)::價(jià)格:所有航班班的總票票價(jià)旅行時(shí)間間:所有人人在飛機(jī)機(jī)上度過過的總時(shí)時(shí)間等待時(shí)間間:在機(jī)機(jī)場(chǎng)等待待其他成成員到達(dá)達(dá)的總時(shí)時(shí)間出發(fā)時(shí)間間:早晨晨太早起起飛的航航班有額額外的代代價(jià),因因?yàn)槁眯行姓咚呙卟蛔闫囎庥糜脮r(shí)間::如果集體體租車,,那么他他們最好好在某個(gè)個(gè)時(shí)間前前將車歸歸還,否否則會(huì)多多付租金金。代價(jià)函數(shù)數(shù)限于篇幅幅,就不不給出代代價(jià)函數(shù)數(shù)的全部部代碼了了,使用用方法如如下:>>>reload(optimization)>>>optimization.schedulecost(s)5285有了代價(jià)價(jià)函數(shù),,下面就就是找到到具有最最小函數(shù)數(shù)值的方方案了。。在這個(gè)例例子中有有16個(gè)航班、、每個(gè)航航班都有有9種可能,,所有的的可能數(shù)為為916,約3000億,所以以窮舉是是不現(xiàn)實(shí)實(shí)的。下面使用用兩種方方法實(shí)現(xiàn)現(xiàn)優(yōu)化::隨機(jī)優(yōu)化化爬山法隨機(jī)優(yōu)化化隨機(jī)生生成一一些方方案,,找出出其中中最好好的方方案。。defrandomoptimize(domain,costf):best=999999999bestr=Noneforiinrange(1000):#隨機(jī)生生成一一個(gè)方方案r=[random.randint(domain[i][0],domain[i][1])foriinrange(len(domain))]#計(jì)算代代價(jià)cost=costf(r)#與當(dāng)前前最優(yōu)優(yōu)方案案的代代價(jià)比比較ifcost<best:best=costbestr=rreturnr爬山法法隨機(jī)優(yōu)優(yōu)化的的不足足在于于,沒沒有充充分利利用已已有的的優(yōu)解解。爬山法法則以以一個(gè)個(gè)隨機(jī)機(jī)解開開始,,然后在鄰鄰近的的解集集中尋尋找更更好的的解,,這類似似于從從斜坡坡上往往下走走,如如圖。。下面的的代碼碼片段段描述述了如如何獲獲取已已有解解的鄰鄰近解解:neighbors=[]forjinrange(len(domain)):#兩個(gè)方方向ifsol[j]>domain[j][0]:neighbors.append(sol[0:j]+[sol[j]+1]+sol[j+1:])ifsol[j]<domain[j][1]:neighbors.append(sol[0:j]+[sol[j]-1]+sol[j+1:])爬山法法爬山法法雖然然利用用了已已經(jīng)找找到的的優(yōu)解,,但它它很容容易陷陷入所所謂的的局部最最優(yōu)解解,而而找不不到全全局最最優(yōu)解。。一種改改進(jìn)是是隨機(jī)重重復(fù)爬爬山法法,即從多多個(gè)隨隨機(jī)點(diǎn)點(diǎn)開始始運(yùn)行行爬山山法若若干次次,以以此希希望有有一個(gè)個(gè)解能能逼近全全局最最小。。此外,,模擬退退火算算法和遺傳算算法也能避避免陷陷入局局部最最小值值。查看結(jié)果在交互控制制臺(tái)中輸入入如下代碼碼,查看優(yōu)優(yōu)化結(jié)果::>>>reload(optimization)>>>domain=[(0,8)]*(len(optimization.people)*2)>>>s=optimization.randomoptimize(domain,optimization.schedulecost)>>>optimization.schedulecost(s)3328>>>optimization.printschedule(s)SeymourBoston12:34-15:02$10912:08-14:05$142FrannyDallas12:19-15:25$3429:49-13:51$229ZooeyAkron9:15-12:14$24715:50-18:45$243WaltMiami15:34-18:11$32614:08-16:09$232BuddyChicago14:22-16:32$12615:04-17:23$189LesOmaha15:03-16:42$1356:19-8:13$239查看結(jié)果>>>s=optimization.hillclimb(domain,optimization.schedulecost)>>>optimization.schedulecost(s)3063>>>optimization.printschedule(s)SeymourBOS12:34-15:02$10910:33-12:03$74FrannyDAL10:30-14:57$29010:51-14:16$256ZooeyCAK10:53-13:36$18910:32-13:16$139WaltMIA11:28-14:40$24812:37-15:05$170BuddyORD12:44-14:17$13410:33-13:11$132LesOMA11:08-13:07$17518:25-20:34$205總結(jié)在本例中,,首先使用用Python的列列表對(duì)不同同的方案進(jìn)進(jìn)行了數(shù)學(xué)學(xué)建模,然后后根據(jù)一些些指標(biāo)建立立了代價(jià)函函數(shù),最后后使用兩種種方法實(shí)現(xiàn)了優(yōu)化化過程。在整個(gè)過程程中,Python的簡(jiǎn)單易易用讓我們們能夠集中中精力解決決實(shí)際的問題題。而無需需過多關(guān)注注編程本身身。此外,Python的交互控控制臺(tái)使得得編程與調(diào)調(diào)試過程變變得自然順順暢。硬幣的另一一面限制Python發(fā)展的因素素缺乏預(yù)包裝裝的解決方方案數(shù)據(jù)庫訪問問層的局限限性文檔差距缺乏GUI和團(tuán)隊(duì)協(xié)作作工具限制Python發(fā)發(fā)展的因素素缺乏預(yù)包裝裝的解決方方案PHP在企業(yè)軟件件領(lǐng)域贏得得了輝煌的的成功,主主要原因就就在于其廣廣泛實(shí)用的的產(chǎn)品門類類,比如討討論板、聊聊天服務(wù)器器和分組日日歷以及即即時(shí)消息系系統(tǒng)等。相相比之下,,
溫馨提示
- 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海外國(guó)語大學(xué)《國(guó)畫人物繪本》2023-2024學(xué)年第一學(xué)期期末試卷
- 上海體育大學(xué)《傳感器實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 乘法和加減法的混合運(yùn)算教案孟坤
- 2025化工產(chǎn)品合同范文
- 印刷現(xiàn)狀評(píng)估報(bào)告范文
- 上海視覺藝術(shù)學(xué)院《危機(jī)傳播管理》2023-2024學(xué)年第一學(xué)期期末試卷
- 藥學(xué)專業(yè)業(yè)務(wù)報(bào)告范文
- 村鎮(zhèn)現(xiàn)場(chǎng)勘察報(bào)告范文
- 懷孕辭職報(bào)告范文簡(jiǎn)短
- 庫管的述職報(bào)告范文
- 中醫(yī)院醫(yī)生作風(fēng)建設(shè)工作方案(6篇)
- 2024-2025學(xué)年人教版數(shù)學(xué)五年級(jí)上冊(cè)期末檢測(cè)試卷(含答案)
- 【MOOC】犯罪心理學(xué)-中南財(cái)經(jīng)政法大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 【MOOC】商業(yè)銀行管理學(xué)-湖南大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 中華人民共和國(guó)統(tǒng)計(jì)法
- 工程設(shè)計(jì)-《工程勘察設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)》(2002年修訂本)-完整版
- 淺談脫口秀的語言幽默感——以《脫口秀大會(huì)第二季》為例
- 精校 (足本)《內(nèi)功真經(jīng)》真本全書
- [專業(yè)英語考試復(fù)習(xí)資料]專業(yè)八級(jí)分類模擬160
- 履帶式挖掘機(jī)安全技術(shù)操作規(guī)程
- 裝修購(gòu)銷合同
評(píng)論
0/150
提交評(píng)論