尹忠杰 牛禮民 何遠(yuǎn)洋 詹軍 楊強(qiáng)(安徽工業(yè)大學(xué)機(jī)械工程學(xué)院)
混合動(dòng)力電動(dòng)汽車(HEV)具有高性能、低能耗和低污染的特點(diǎn)以及技術(shù)、經(jīng)濟(jì)和環(huán)境等方面的綜合優(yōu)勢,成為當(dāng)今最具實(shí)際開發(fā)意義的新型清潔汽車[1]。它采用傳統(tǒng)內(nèi)燃機(jī)和電動(dòng)機(jī)作為動(dòng)力源,通過熱能和電力2套系統(tǒng)開動(dòng)汽車,達(dá)到節(jié)省燃料和降低排氣污染的目的,具有排量小、速度高和續(xù)駛里程長等優(yōu)點(diǎn)[2]。要想實(shí)現(xiàn)提高整車燃油經(jīng)濟(jì)性,改善動(dòng)力性,降低排放的目標(biāo),則需要汽車根據(jù)不同的工況實(shí)現(xiàn)汽車內(nèi)各動(dòng)力源的智能協(xié)作。多智能體技術(shù)的應(yīng)用,可很好地實(shí)現(xiàn)智能協(xié)作,從而適應(yīng)各種復(fù)雜的工況,多智能體間的組網(wǎng)交互問題成為不可避免的研究熱點(diǎn)。文章對客戶端智能體(傳動(dòng)系)和服務(wù)器端智能體(發(fā)動(dòng)機(jī)和電動(dòng)機(jī))進(jìn)行建模,基于Visual Basic 6.0環(huán)境建立可視化交互界面,從而實(shí)現(xiàn)基于多智能體技術(shù)的HEV組網(wǎng)技術(shù)仿真研究。
多智能體系統(tǒng)(MAS)是由多個(gè)彼此間存在著協(xié)商、協(xié)調(diào)和通信等關(guān)系的智能體組成的系統(tǒng)[3],其中每個(gè)智能體是一個(gè)物理的或抽象的實(shí)體,能作用于自身和環(huán)境,并與其他智能體通訊[4]。多智能體技術(shù)是人工智能技術(shù)的一次質(zhì)的飛躍,該系統(tǒng)可以協(xié)調(diào)一組智能體的行為(知識、目標(biāo)、方法和規(guī)劃),以協(xié)同地完成一個(gè)任務(wù)或求解問題[5]。由于其具有較強(qiáng)的分布性、魯棒性和協(xié)調(diào)性[6],已經(jīng)成為分布式人工智能研究的一個(gè)重要分支,并在各個(gè)領(lǐng)域得到了廣泛應(yīng)用[7]。
因此,文章擬將發(fā)動(dòng)機(jī)和電動(dòng)機(jī)等動(dòng)力輸出裝置和傳動(dòng)系等動(dòng)力耦合裝置進(jìn)行單智能體建模,如圖1所示,通過組建局域網(wǎng)將各個(gè)單智能體之間聯(lián)系起來,從而實(shí)現(xiàn)基于多智能體技術(shù)的HEV組網(wǎng)技術(shù)仿真研究。
服務(wù)器端智能體(發(fā)動(dòng)機(jī)和電動(dòng)機(jī))產(chǎn)生的實(shí)時(shí)數(shù)據(jù)需要及時(shí)保存,而客戶端智能體(傳動(dòng)系)需要將接收到的實(shí)時(shí)數(shù)據(jù)通過查閱數(shù)據(jù)表格進(jìn)行反饋。而在數(shù)據(jù)表格軟件中,Excel具有可視化強(qiáng)的特點(diǎn),可以作為服務(wù)器端和客戶端的數(shù)據(jù)載體。但是由于Visual Basic 6.0與Excel是2款不同的軟件,所以首先需要實(shí)現(xiàn)Visual Basic 6.0與Excel表格之間的連接。
Visual Basic 6.0的一大功能就是可以通過勾選“工程”→“引用”中的選項(xiàng)與安裝在電腦里的其他程序相關(guān)聯(lián)。勾選其中的“Microsoft Excel 15.0 Object Library”選項(xiàng),就可以引用Excel類型庫。此外,還需要在通用聲明端將其賦給自己定義的變量,以便于在程序中使用:
Dim xlApp As Excel.Application‘定義xlApp為Excel對象
Dim xlBook As Excel.Workbook‘定義 xlBook為Excel工作簿
Dim xlSheet As Excel.Worksheet‘定義 xlSheet為Excel工作表。
服務(wù)器端智能體建模需要實(shí)現(xiàn)將智能體實(shí)時(shí)的數(shù)據(jù)導(dǎo)入、存儲和發(fā)送的功能。該多智能體仿真平臺主要有發(fā)動(dòng)機(jī)和電動(dòng)機(jī)2個(gè)智能體作為服務(wù)器端,以發(fā)動(dòng)機(jī)智能體為例,介紹如何在Visual Basic 6.0中實(shí)現(xiàn)其建模:
發(fā)動(dòng)機(jī)智能體的參數(shù)主要為轉(zhuǎn)速和ETC開度。首先,需要定義2個(gè)變量來存放即將導(dǎo)入進(jìn)來的轉(zhuǎn)速和ETC開度:
DimZhuanSuAsInteger‘定義ZhuanSu為整型變量
DimETCAs Single‘定義ETC為單精度型變量
在服務(wù)器端窗口創(chuàng)建一個(gè)標(biāo)簽lblinfo,對于導(dǎo)入了以后的轉(zhuǎn)速和ETC開度數(shù)據(jù),可以在這個(gè)標(biāo)簽上顯示出來,如圖2所示,方便用戶了解實(shí)時(shí)的發(fā)動(dòng)機(jī)的工作狀況:
lblinfo.Caption="發(fā)動(dòng)機(jī)的轉(zhuǎn)速為:"&ZhuanSu&"r/min"&Visual Basic 6.0CrLf&"ETC開度為:"&ETC&"V"&Visual Basic 6.0CrLf
接下來,先打開待存放數(shù)據(jù)的Excel表格:
Set xlApp=CreateObject("Excel.Application")‘創(chuàng)建Excel對象
Set xlBook=lApp.Workbooks.Open(App.Path&"發(fā)動(dòng)機(jī)實(shí)時(shí)轉(zhuǎn)速、節(jié)氣門開度表.xls")‘打開創(chuàng)建的Excel工作薄文件
xlApp.Visible=True‘設(shè)置Excel對象可見
Set xlSheet=xlBook.Worksheets("Sheet1")‘設(shè)置sheet1為當(dāng)前工作表
打開工作表后,就開始向里面寫入數(shù)據(jù)。如果是第1次保存數(shù)據(jù),需要向表格中添加表頭,否則就在上一次保存的數(shù)據(jù)后一行追加寫入。此外,為了表格美觀整齊,在寫入數(shù)據(jù)的同時(shí),可以調(diào)整其對齊格式,統(tǒng)一保留小數(shù)位數(shù),為表格加上邊框,自動(dòng)適應(yīng)列寬:
If xlSheet.Cells(i,1)=""Then‘判斷是否第一次保存數(shù)據(jù)
If i=2 Then xlSheet.Cells(2,1)="時(shí)間"‘創(chuàng)建時(shí)間表頭
xlSheet.Cells(2,2)="發(fā)動(dòng)機(jī)轉(zhuǎn)速(r/min)"‘創(chuàng)建轉(zhuǎn)速表頭
xlSheet.Cells(2,3)="ETC開度(V)"‘創(chuàng)建 ETC開度表頭
Else
xlSheet.Cells(i,1)=Date&""&Time‘寫入時(shí)間
xlSheet.Cells(i,2)=ZhuanSu‘寫入轉(zhuǎn)速
xlSheet.Cells(i,3)=ETC‘寫入ETC開度
For j=2 Toi
xlSheet.Cells(j,3).NumberFormatLocal="0.0"‘ETC開度統(tǒng)一保留小數(shù)一位
xlSheet.Cells(m,n).HorizontalAlignment=xlCenter‘所有表格水平居中對齊
xlSheet.Cells(m,n).VerticalAlignment=xlCenter‘所有表格豎直居中對齊
xlSheet.Cells(m,n).Borders.LineStyle=1‘為表格加上邊框
xlSheet.Cells.EntireColumn.AutoFit‘自動(dòng)適應(yīng)列寬。
將數(shù)據(jù)寫入以后,保存Excel文件并將Excel文件關(guān)閉,同時(shí)結(jié)束Excel對象的使用:
xlBook.Save‘保存工作簿
xlBook.Close‘關(guān)閉工作薄
xlApp.Quit‘結(jié)束 Excel對象
最終生成的Excel表格,如圖3所示。
服務(wù)器端通過winsock控件的senddata方法將轉(zhuǎn)速和ETC開度發(fā)送給客戶端,并且在其可視化窗口中的“聊天記錄”中顯示,便于用戶查看,如圖4所示。
客戶端智能體從服務(wù)器端智能體接收數(shù)據(jù),通過查閱一個(gè)由Map圖得出的數(shù)據(jù)表格,反饋給服務(wù)器端一個(gè)合適的數(shù)據(jù)并且實(shí)現(xiàn)在服務(wù)器端進(jìn)行保存。以如何反饋給發(fā)動(dòng)機(jī)智能體在一定轉(zhuǎn)速和ETC開度條件下合適的轉(zhuǎn)矩為例,介紹如何在Visual Basic 6.0中實(shí)現(xiàn)其建模:
客戶端智能體在接收數(shù)據(jù)之前,也同樣需要定義變量來存放服務(wù)器端發(fā)送過來的轉(zhuǎn)速和ETC開度:
Dim ZhuanSu As Integer‘定義ZhuanSu為整型變量
DimETCAs Single‘定義ETC為單精度型變量
客戶端通過winsock控件的getdata方法接收服務(wù)器端發(fā)送的數(shù)據(jù),并且把它存放在臨時(shí)變量tempS里,在判斷發(fā)送過來的數(shù)據(jù)是轉(zhuǎn)速還是ETC開度之后,存儲在剛才定義好的變量里,并且通過與服務(wù)器端智能體建模類似的方式,顯示在界面上,如圖5所示。
在接收到服務(wù)器端發(fā)送的轉(zhuǎn)速和ETC開度后,客戶端根據(jù)查詢它們與轉(zhuǎn)矩關(guān)系的表格,查詢到與此時(shí)發(fā)動(dòng)機(jī)轉(zhuǎn)速和ETC開度所對應(yīng)的轉(zhuǎn)矩,存放在定義的ZhuanJu變量里,顯示在lblinfo標(biāo)簽上,如圖6所示,并且通過局域網(wǎng)發(fā)送回服務(wù)器端:
Dim ZhuanJu As Single‘定義ZhuanJu為單精度型變量
lblinfo.Caption=lblinfo.Caption&"發(fā)動(dòng)機(jī)的轉(zhuǎn)矩為:"&ZhuanJu&"N·m"&Visual Basic 6.0CrLf‘顯示轉(zhuǎn)矩
wskserver.SendData Str(ZhuanJu)‘發(fā)送轉(zhuǎn)矩
服務(wù)器端在收到轉(zhuǎn)矩之后,把其存在服務(wù)器端定義的ZhuanJu變量里,加到聊天記錄里面,顯示在lblinfo標(biāo)簽上,保存在另一個(gè)Excel工作表里,如圖7所示,存儲數(shù)據(jù)的方式與服務(wù)器端智能體建模時(shí)類似,唯一的區(qū)別是增加一列接收到的轉(zhuǎn)矩的數(shù)據(jù)。
在單智能體建模完成后,需要組建多智能體局域網(wǎng)。此時(shí)需將工具欄→“部件”→“控件”中的“Microsoft Winsock Control 6.0”控件(簡稱winsock控件)添加到窗口,并且將其名稱改為“wskclient”和“wskserver”。
通過按下客戶端的“連接”按鈕,客戶端首先向服務(wù)器端發(fā)起連接的需求:
DimIP As String‘定義IP為字符型變量
IP=InputBox("請輸入要連接的IP","輸入的IP",""‘輸入要連接的服務(wù)器的IP
wskclient.RemoteHost=IP‘設(shè)置通訊對方的IP
wskclient.RemotePort=1024‘設(shè)置通訊的端口號
wskclient.Connect‘向?qū)Ψ桨l(fā)出連接請求
然后在服務(wù)器端的wskserver的ConnectionRequest事件中接受客戶端的連接需求:
wskserver.Close‘關(guān)閉控件以防報(bào)錯(cuò)
wskserver.Accept requestID‘接收客戶端的連接請求
此時(shí)彈出對話框“組網(wǎng)成功!”,即完成了多智能體局域網(wǎng)的組建。
在完成對于服務(wù)器端智能體和客戶端智能體的建模之后,可以進(jìn)行模擬仿真,發(fā)動(dòng)機(jī)端和客戶端用戶界面,如圖8和圖9所示,從而實(shí)現(xiàn)混合動(dòng)力汽車的研究。
通過Visual Basic 6.0的平臺,生成了一款面向用戶的可視化軟件,該軟件建立了客戶端和服務(wù)器端智能體模型,通過仿真目前可以實(shí)現(xiàn)發(fā)動(dòng)機(jī)轉(zhuǎn)速、ETC開度參數(shù)的導(dǎo)入、顯示及保存,以及通過局域網(wǎng)連接獲得對應(yīng)的轉(zhuǎn)矩,制定出混合動(dòng)力汽車的一套智能控制策略,從而為混合動(dòng)力汽車的仿真研究提供了一種新的途徑。