摘 要:智能決策支持系統中涉及到大量的計算和分析,會影響到系統的運行效率。在此提出將Matlab集成進智能決策支持系統,由它單獨負責數據計算,利用Matlab強大的計算能力提高系統運行效率,從而使系統設計與實現更加容易、使用更加方便。結合一個實例給出了集成Matlab的步驟和方法,具有一定的新穎性和實用性。
關鍵詞:集成Matlab;IDSS;BP神經網絡;人工智能
中圖分類號:TP183文獻標識碼:A
文章編號:1004-373X(2010)02-070-03
Study on Intelligence Decision Support System by Matlab Integration
GAO Huiying,NIE Chao,ZHU Guoxiang
(Artillery Academy of PLA,Hefei,230031,China)
Abstract:Intelligence Decision Support System (IDSS) involves lots of calculations and analysis,and this can affect the operational efficiency of the system.Integrating Matlab into the IDSS,and making it compute data alone,which can improve the efficiency of the system so that the system can be designed and implemented easily and more convenient to be used.An example is given in combination with Matlab integration steps and methods,and this method is novelty and practicality.
Keywords:Matlab integration;IDSS;BP neural network;artificial intelligence
0 引 言
智能決策支持系統是在普通決策支持系統的基礎上,集成人工智能研究領域內的專家系統而形成的一種新型決策支持系統,具備強大的數據信息處理能力和學習能力,以及更加符合人類智能的科學決策的能力。但是不可避免的,在系統設計過程中會涉及到大量計算和分析。而在實際工程應用中,一般軟件開發的智能決策支持系統在數據處理、分析和工程計算等方面效率不高,且算法較為復雜實現比較困難[1]。因此,在系統設計與實現更加容易、使用更加方便的基礎上,提高數據計算和分析能力,成為智能決策支持系統設計的關鍵。
在此提出將Matlab集成于智能決策支持系統中,由Matlab單獨負責數據分析和計算,可以較好地解決上述智能決策支持系統設計與實現中存在的困難。
1 集成Matlab技術
Matlab是一種用于算法開發、數據可視化、數據分析以及數值計算的高級技術計算語言和交互式環境,雖然Matlab也可直接用于智能決策支持,但不滿足智能決策支持系統人機交互性強、易用的特點,因為Matlab在端口操作和實時控制方面能力有限;另一方面,其他很多可視化軟件雖然可以比較容易地開發出人機交互、易用性強的應用程序,但是或在數據處理、分析和工程計算上效率不高,或在算法實現上比較困難。因此若將Matlab強大的計算能力集成進決策支持系統,由Matlab單獨負責系統的數據計算,則可以在很大程度上提高智能決策支持系統的易設計性、易實現性、人機交互性、易用性和計算能力。
目前,集成Matlab主要有三種方法[2]:
(1) 引擎集成。調用Matlab引擎庫函數。
(2) 文件集成。從Matlab中導出數據,并將數據存儲在以mat文件中,以應用程序讀取mat文件。
(3) 服務器集成。將Matlab作為服務器,智能決策支持系統作為客戶端,客戶端向服務器發送數據請求,服務器計算完成后將結果返回客戶端。
由于方法(2)靈活性不夠,方法(3)需要Matlab同時運行,會加重系統負擔,因此綜合考慮智能決策支持系統的特點,選用方法(1)。
2 集成Matlab的流程
2.1 建立BP神經網絡模型
BP神經網絡是一種基于誤差反向傳播神經網絡學習算法,能學習和存貯大量的輸入/輸出模式映射關系,而無需預先揭示描述這種映射關系的數學方程,具有運算速度快、容錯能力及動態適應能力強等特性,是目前應用最廣泛的神經網絡模型之一。智能決策支持系統的許多問題都可以由它來解決,因此可以用BP網絡構造系統模型。
BP算法由數據流的前向計算和差信號的反向傳播兩個過程構成。在正向傳播時,傳播方向為:輸入層→隱層→輸出層,每層神經元的狀態只影響下一層神經元。若輸出層得不到期望輸出,則轉向誤差信號的反向傳播流程[3]。通過這兩個過程的交替進行,在權向量空間執行誤差函數梯度下降策略,動態迭代搜索一組權向量,使網絡誤差函數達到最小,從而完成信息提取和記憶過程。
2.2 歸一化指標
影響智能決策的因素很多,但可從解決問題的實際情況出發,選取關鍵指標集作為神經網絡輸入,進而構造不同時間范圍和不同個體的樣本。關鍵指標的選取既可簡化過多的相關變量,又可提高網絡學習的效率。由于指標體系中的各個指標的量綱不同,在明確指標集后,需對指標數值大小進行歸一化處理,對指標數值進行標準化,建立統一的量化標準。神經網絡的輸出為各種決策,為了識別輸出,還必須建立一個相應的決策輸出數據集,對應于各種決策結果。
2.3 訓練網絡
Matlab軟件在數值計算上有強大的處理能力,利用其神經網絡的工具箱,可以簡化紛繁的運算工作[4]。通過大樣本的學習,不斷調整模型的權系數,使輸入樣本與輸出樣本相對應,最終達到良好的擬合及泛化能力,并且可以將模型保存成文件以便調用。綜上所述,集成智能決策支持系統的實現步驟如圖1所示。
圖1 智能決策支持系統的實現步驟
3 高校用戶文獻偏好智能決策支持系統
圖書館作為高等院校的文獻收藏機構,在高等教育中發揮著巨大作用,要辦好一流的大學,就要辦好一流的圖書館,而文獻的種類和數量是考察圖書館文獻收藏的重要指標[5]。由于經費有限,很多圖書館并不能購買所有需要文獻,如何在有限的經費條件下,使文獻收藏的種類和數量符合高校不同專業用戶的需求。其中一個重要的方法就是對高校不同專業用戶的文獻偏好數據進行長期、大量的統計和分析。以下是利用集成Matlab智能決策支持系統對高校用戶文獻偏好進行決策分析的實現過程。
3.1 讀入數據
讀入數據前應該注意所有的量化指標必須寫入到數據表中,數據庫的類型可以根據實際情況的不同自行選擇。讀入數據算法如下:
AnString s;file *fp;
int col=0,line=0;
s=Table1→FieldByName(\"BookMark\"+AnsiString(col))→AsString+\" \";
Tablel→Next();
if(col==Tablel→FieldCount)
{
col++;
line++;
fprintf(fp,\"%s\\\\",s);
s=\" \"}
在數據表中,每個字段用“BookMark1”,“BookMark2…”表示。通過上面的代碼首先把第一列數據讀取到字符串中,并寫入數據文件,當到達數據表末尾時,清空字符串,讀取下一列數據,寫入數據文件,依次類推,直到讀取數據表中所有的數據。
3.2 神經網絡學習
對BP神經網絡的訓練及檢驗過程主要由Matlab引擎庫中的函數完成,設計人員通過參數的設置及調整使模型達到滿意狀態[6,7]。神經網絡學習前應保證已經將Matlab引擎庫的頭文件engine.h加入了系統中,系統能夠正常的調用Matlab引擎庫中的函數。神經網絡學習代碼如下:
file *file-1,*file-2;
file-1=fopen (filepath);
file-2=fscanf(file-1,′%if′,[col,line]);
net = init(net);
net=newff(P,T,err_goal,spread);
net.trainParam.epochs=**;
net.trainParam.goal=**;
net=train(net,P,T)
訓練前饋網絡的第一步是建立網絡對象,在對網絡模型初始化后(init(net)),利用函數newff()即可建立一個可訓練的前饋網絡,它包括四個參數:P為R×2的矩陣,定義R個輸入向量的最小值和最大值;T為設定每層神經元個數的數組;err_goal是包含每層用到的傳遞函數名稱的細胞數組;spread是用到的訓練函數的名稱[8,9]。通過以上代碼即可進行神經網絡學習,從學習中得到高校不同專業用戶的偏好。
3.3 仿真運算與輸出
在應用輸入具體的量化指標后,調用Matlab引擎庫中的函數來進行仿真運算,最終得到合適的高校不同專業用戶的輸出,并將之寫入數據庫中。
Engine *myeng;mxArray *file_in,*file_out;
file_in=mxCreateDoubleMatrix(col,line,mxREAL);
memcpy((void*)mxGetPr(file_in),(void*)data,col*line*sizeof(double));
engPutVariable(myeng,\"para\",file_in);
engEvalString(myeng,\"filepath\");
engEvalString(myeng,\"target=sim(net,para);\");
file_out=engGetVariable(myeng,\"target\");
double *result=mxGetPr(file_out);
A=mxGetN(file_out) B=mxGetM(file_out);
for(int i=0;i