歐曄
(閩江師范高等??茖W(xué)校計(jì)算機(jī)系 福建省福州市 350108)
由于小車的充電半徑遠(yuǎn)大于簇的作用半徑,所以小車在駛到簇節(jié)點(diǎn)位置時(shí)可以同時(shí)給簇內(nèi)節(jié)點(diǎn)充電。由于小車給簇內(nèi)節(jié)點(diǎn)同時(shí)開始充電,所以充電時(shí)間就是簇內(nèi)能量最低的節(jié)點(diǎn)充滿電量所花費(fèi)的時(shí)間,因此在充電時(shí)只要找到這個(gè)能量最弱的節(jié)點(diǎn)就可以算出該簇的充電時(shí)間。之后小車按照基站所規(guī)劃的充電路徑駛到下一個(gè)簇節(jié)點(diǎn),按照上面的方式重新開始充電,并把充電后的簇狀態(tài)信息傳回給基站,然后繼續(xù)按步就搬地移到下一個(gè)簇節(jié)點(diǎn),這樣直到小車的電量耗費(fèi)殆盡,至此這輛小車的工作任務(wù)就順利完成,然后回到基站后再由基站根據(jù)接收回的傳感數(shù)據(jù)信息處理后規(guī)劃好下一輛小車的充電過程。
基于非均勻分簇的充電策略設(shè)計(jì),主要從兩方面進(jìn)行研究:
(1)減少充電路徑;
(2)縮短充電時(shí)間。
其中過分追求最短路徑會(huì)忽視節(jié)點(diǎn)的剩余生存時(shí)間,導(dǎo)致小車還未到來,節(jié)點(diǎn)就已死亡。為了能兼顧到非均勻分簇的節(jié)點(diǎn)充電問題,筆者采用節(jié)點(diǎn)轉(zhuǎn)發(fā)的技術(shù)把隨機(jī)分布的傳感器上采集回來的能量數(shù)據(jù)信息傳送到基站,再由基站根據(jù)一定的算法設(shè)定出充電小車的行駛路徑,讓小車沿行駛路徑對(duì)盡可能多的簇進(jìn)行充電,以便讓簇內(nèi)節(jié)點(diǎn)能夠在自身能量耗盡前及時(shí)得到充電,能夠盡可能延長無線傳感網(wǎng)絡(luò)的維持時(shí)間,使得傳感網(wǎng)絡(luò)能夠盡可能協(xié)調(diào)一致地運(yùn)行下去。當(dāng)然由于簇?cái)?shù)量眾多,一輛小車是完成不了充電任務(wù)的,因此基站就根據(jù)網(wǎng)絡(luò)的實(shí)時(shí)運(yùn)行狀態(tài)不斷地更新行駛路線,不斷地派出小車去維持充電任務(wù)以使網(wǎng)絡(luò)能有效地運(yùn)行維持下去。
首先輸入math庫,因?yàn)橐玫絣en,sqrt,和Pow函數(shù),分別是求字符串長度,求平方根和求平方函數(shù)。
接著設(shè)置各個(gè)簇內(nèi)節(jié)點(diǎn)的最短剩余生存時(shí)間數(shù)組的下標(biāo),由于python代碼的數(shù)組下標(biāo)是從0開始算起,又因?yàn)闀r(shí)間數(shù)組的第一個(gè)元素是代表基站,所以下標(biāo)變量a的初始值從1開始算。k是反映小車數(shù)量的變量,并且充電小車至少從一輛開始算,所以k的初始值為1。
接著初始化時(shí)間數(shù)組,為了調(diào)試方便,僅輸入4個(gè)元素,同時(shí)設(shè)置變量l為獲取時(shí)間數(shù)組的長度。
然后設(shè)置一個(gè)while循環(huán)判斷l(xiāng)值是否大于1,如果小于等于1表示時(shí)間數(shù)組已被處理完畢,多輛小車的充電任務(wù)已完成結(jié)束。如果l大于1表示小車正在為簇內(nèi)節(jié)點(diǎn)充電。首先輸入為當(dāng)前簇充電所需的等待時(shí)間,為了調(diào)試方便,同時(shí)輸出當(dāng)前簇的最短剩余生存時(shí)間和等待時(shí)間。如果最短剩余生存時(shí)間大于等待時(shí)間且小于600+ (math.sqrt(math.pow(100, 2) + math.pow((200 + l), 2))) / 2這個(gè)變量值的話,那么就意味著小車為當(dāng)前簇充完電還有剩余的電量,還可以為下一個(gè)簇繼續(xù)充電,那么簇?cái)?shù)組指針下標(biāo)就移到下一個(gè)元素繼續(xù)處理。否則意味著還沒等到小車來充電,當(dāng)前簇內(nèi)最少剩余生存時(shí)間對(duì)應(yīng)的節(jié)點(diǎn)就已經(jīng)死亡了,那么這輛小車的充電使命就提前結(jié)束了,需要把從第一個(gè)簇到當(dāng)前簇的前一個(gè)簇的這些簇元素從數(shù)組中刪除掉,并把小車數(shù)量加一(等待下一輛小車的到來)。因?yàn)楫?dāng)前簇的下一個(gè)簇還要等待新一輛小車來為它充電,所以a值重新設(shè)為2,接著重新計(jì)算數(shù)組的長度l,如果l等于2就設(shè)置l等于1,意味著循環(huán)結(jié)束,該輪的充電小車數(shù)量已算出來了。因此充電任務(wù)正式結(jié)束。
小車每次都是充滿一定量的能量,且它的充電速度是一定的,這也意味著它的充電周期是一定的,即T值是固定的。在T值是固定的前提下,由于它的行駛路徑和不同簇內(nèi)的節(jié)點(diǎn)剩余生存時(shí)間不一樣,導(dǎo)致它為之服務(wù)的簇的類別和數(shù)量也不一樣,所以在一個(gè)T周期內(nèi)一輛小車有可能為一個(gè)簇充電,也可能為多個(gè)簇充電,并且一輛小車還有可能不能完成[1]全部的充電任務(wù),要多輛小車才可以。因此充電的前提條件是動(dòng)態(tài)的,導(dǎo)致筆者要采取仿真的形式來求解充電小車的數(shù)量以滿足不一樣的前提條件下環(huán)境所需的充電小車的數(shù)量是不一樣的這個(gè)先決條件。并且只有通過仿真的形式,筆者才可能得到逼近實(shí)際環(huán)境的充電效果,從而所求得的充電小車的數(shù)量才是比較準(zhǔn)確的。
3.4.1 最少剩余生存時(shí)間數(shù)組的設(shè)置思路
由于小車的充電半徑遠(yuǎn)大于簇內(nèi)半徑,因此可以認(rèn)為小車可同時(shí)為簇內(nèi)的所有節(jié)點(diǎn)充電,在同時(shí)充電的前提下,簇內(nèi)的哪一個(gè)節(jié)點(diǎn)它的剩余生存時(shí)間最小,也就意味著它所需要的充電時(shí)間就越長,
S = [0, 270, 380, 490, 510]因?yàn)槭峭瑫r(shí)充電,所以充電時(shí)間最長的簇內(nèi)節(jié)點(diǎn)它的充電時(shí)間就等同于該簇的充電時(shí)間,因此讓該節(jié)點(diǎn)的充電時(shí)間值出現(xiàn)在最少剩余生存時(shí)間數(shù)組當(dāng)中就意味著該簇的充電時(shí)間信息已提供出來了,直接在程序中運(yùn)用就可以了。
3.4.2 運(yùn)算符的意義與作用
if (S[a] > tj) and (S[a] < 600 + (math.sqrt(math.pow(100, 2) + math.pow((200 + l), 2))) / 2)要使用’and’邏輯運(yùn)算符表示必須同時(shí)滿足下面兩個(gè)條件:條件(1).每一個(gè)簇中最容易失效的節(jié)點(diǎn)都比等待小車過來充電的時(shí)間長,可保證數(shù)組S中每一個(gè)相應(yīng)子隊(duì)列中的各個(gè)簇都在各自規(guī)定的tj時(shí)間內(nèi)完成充電,從而不需要新增充電車輛并根據(jù)子隊(duì)列的數(shù)量算出小車的數(shù)量;條件(2).右側(cè)的運(yùn)算符’<‘表示每個(gè)子隊(duì)列都有相應(yīng)的充電周期T,且在充電周期內(nèi)各自[2]完成充電,不需要新增車輛。如果不同時(shí)滿足上述兩個(gè)條件就需要新增車輛,這樣可把所有可能的充電情況都考慮在內(nèi),有利于更加完整準(zhǔn)確地計(jì)算所需充電小車的數(shù)量。通過這樣設(shè)置運(yùn)算符,充電任務(wù)能滿足所有可能情況的發(fā)生。
由于小車給簇充電的隨機(jī)性很大,等待時(shí)間tj的給予不通過固定的公式計(jì)算得到,而是通過手動(dòng)輸入得到,這樣更可把控各個(gè)情況的發(fā)生,準(zhǔn)確性更高。等待時(shí)間的手動(dòng)輸入代碼如下:
tj=float(input("請(qǐng)輸入對(duì)當(dāng)前簇充電所需要的等待時(shí)間:"))
3.5.1 仿真的效果
仿真既不失準(zhǔn)確性又簡(jiǎn)化了項(xiàng)目運(yùn)營流程,容易讓更多的人理解其中的原理和項(xiàng)目運(yùn)行規(guī)律,并能拓展應(yīng)用領(lǐng)域范圍,做到舉一反三,聞一知十。而且采用仿真手段能夠簡(jiǎn)化操作流程,能夠讓新手盡快熟悉上手。因此仿真的意義重大。再回到無線傳感充電小車這個(gè)項(xiàng)目,通過仿真手段基本能反映出所需的充電小車的實(shí)際數(shù)量并讓仿真的效果能貼近實(shí)際。圖1是代碼仿真的結(jié)果圖。
圖1
上面S數(shù)組有4個(gè)簇節(jié)點(diǎn)序列,當(dāng)?shù)谝粋€(gè)簇的最少剩余生存時(shí)間大于等待充電時(shí)間時(shí),那么第一輛小車就可以順利地完成對(duì)其充電任務(wù)而無需新增一輛小車;接下來剩余的三個(gè)簇節(jié)點(diǎn)如果其各自的最少剩余生存時(shí)間也是大于等待小車充電時(shí)間的話,那么也就意味著完成一輪充電只需要一輛小車就夠了,如果某個(gè)簇節(jié)點(diǎn)最少剩余生存時(shí)間小于等待時(shí)間的話,那么就需要新增一輛小車來為接下來的簇節(jié)點(diǎn)進(jìn)行充電,圖2反映該代碼邏輯思路的運(yùn)行結(jié)果。
圖2
如果對(duì)充電小車充電再提出優(yōu)先度算法,加入對(duì)節(jié)點(diǎn)剩余工作時(shí)間的考慮,便能夠更加準(zhǔn)確的反映節(jié)點(diǎn)充電的緊急度,以便使充電小車能夠及時(shí)為節(jié)點(diǎn)進(jìn)行能量補(bǔ)充,避免了盲目的充電,同時(shí)減少了節(jié)點(diǎn)充電次數(shù)。
3.5.2 仿真在實(shí)際應(yīng)用當(dāng)中的意義
根據(jù)實(shí)際項(xiàng)目在應(yīng)用當(dāng)中的變量和參數(shù)眾多的情況,可以化繁為簡(jiǎn),減少參數(shù)和動(dòng)態(tài)變量的配置,降低應(yīng)用門檻,只給出必要的信息,從簡(jiǎn)單入手,先弄懂項(xiàng)目的運(yùn)用流程和工作原理,然后再逐步展開,貼近實(shí)際,這樣就有一個(gè)學(xué)習(xí)和掌握的過程,并且這是自然而然形成的,最終把整個(gè)項(xiàng)目消化吸收并能應(yīng)用自如。在項(xiàng)目學(xué)習(xí)中是這樣,學(xué)習(xí)其他知識(shí)也是這樣。仿真幫助降低筆者的學(xué)習(xí)難度,增強(qiáng)應(yīng)用拓展的自信心。
仿真是模擬實(shí)際環(huán)境但還不是實(shí)際環(huán)境,要想真正掌握實(shí)際環(huán)境運(yùn)行規(guī)律,必須建立仿真模型并不斷改進(jìn)這個(gè)模型,唯一的出路是不斷調(diào)配設(shè)置模型參數(shù),不斷運(yùn)行這個(gè)模型以得出更加精準(zhǔn)的實(shí)際成果。這就應(yīng)驗(yàn)了那句話“從實(shí)踐中得到,又應(yīng)用與實(shí)踐”,就是說先從實(shí)際中摸索出模型構(gòu)造,再嘗試更新這個(gè)模型構(gòu)造,再應(yīng)用與實(shí)踐,再從實(shí)踐中獲取經(jīng)驗(yàn)值,再豐富完善模型最終得到理想的結(jié)果。放到筆者這個(gè)項(xiàng)目構(gòu)造的無線充電小車數(shù)量求解仿真的應(yīng)用中,筆者先要設(shè)置簡(jiǎn)單的充電簇節(jié)點(diǎn)剩余生存時(shí)間子序列數(shù)組,然后根據(jù)原理及思路構(gòu)造出小車充電模型(即小車的充電路徑和小車的充電數(shù)量),并用公式模擬這個(gè)模型進(jìn)而推導(dǎo)出結(jié)果,最后驗(yàn)證這個(gè)結(jié)果看與實(shí)際結(jié)果有什么差錯(cuò)出路,有的話繼續(xù)調(diào)配參數(shù)以及修改模型,沒有的話就根據(jù)這個(gè)模型做進(jìn)一步深入拓展直至得到最終的正確結(jié)果。因此說仿真是手段,是過程,結(jié)果是目的,而一切都是為目的服務(wù)。
仿真設(shè)計(jì)是求解無線傳感充電小車數(shù)量的一種方式和手段,雖然這并不是什么新鮮事物,但舊貌換新顏,舊瓶換新酒,還是在解決新生問題之時(shí)給大家耳目一新的感覺。因此筆者懂得利用仿真手段為自己開辟一條解決傳感網(wǎng)絡(luò)無線充電非均勻分簇問題的一條新路。當(dāng)然筆者也不能過分夸大仿真設(shè)計(jì)的作用,因?yàn)檫@畢竟離實(shí)際求解問題答案還有一段距離,因此應(yīng)該理性看待仿真設(shè)計(jì),合理利用,讓它為筆者披荊斬棘,一往無前為求解項(xiàng)目課題而開辟一條又新又活的新路。