溫州大學數學與信息科學學院 石珍妮 竺賽棟 張克林
層次分析法(Analytic Hierarchy Process簡稱AHP)是將與決策總是有關的元素分解成目標、準則、方案等層次,在此基礎之上進行定性和定量分析的決策方法。
層次分析法的主要流程分為四步:一是建立層次分析結構模型,二是構造成對比矩陣并計算權向量,三是做一致性檢驗,四是計算組合權向量(作組合一致性檢驗)。
層次分析法的基本思想是把復雜問題分解為若干層次,在最底層次通過兩兩對比得出各因素權重,通過由低到高的層層分析計算,最后計算出各方案對總目標的權數,權數最大的方案即為最優方案。
決策的實質是進行比較,通過比較做出選擇,但是對于缺乏公度性的多目標決策問題來說,由于無法用統一尺度去衡量比較各個不同目標,因此,唯一可行的辦法是進行兩兩比較。通過將兩兩比較后的結果填入判斷矩陣的特征和特征向量,然后確定各目標重要性的加權值。
層次分析方法的基本假設是層次之間存在遞進結構,即從高到低或從低到高遞進。當復雜系統中某一層次既可直接地影響其他層次,同時又直接及間接受其他層次影響時,就不屬于層次分析范圍,需要用網絡模型來描述。
層次分析的基本方法是建立層次結構模型。建立層次模型,首先要對所解決問題有明確的認識,弄清它涉及哪些因素,如目標、分目標、部門、約束、可能情況和方案等,以及因素相互之間的關系。其次,將決策問題層次化。將決策問題劃分為若干個層次,第一層是總目標層,即要想達到的目標;中間層常稱為分目標層、標準層、部門層、約束層、準則層等;最底層一般是解決問題的方案或者與問題有關的可能情況,常稱為方案層或者措施層。
建立層次模型之后,可以在各層元素中進行兩兩比較,構造出判斷矩陣。判斷矩陣是定性過渡到定量的重要環節,再通過求解判斷矩陣的特征向量,并對判斷矩陣的一致性進行檢驗,檢查決策者在構造判斷矩陣時判斷思維是否具有一致性。
通過一致性檢驗后,便可按歸一化處理已經處理過的特征向量作為某一層次的加權值,然后從高層次到低層次逐層計算排序加權值,得出層次總排序。
最后是對總排序的一致性檢驗,通過檢驗,則其結果可以用于決策;否則,就需要重新調整判別矩陣。
雖然利用Matlab的程序語句命令也能實現層次分析法,但是不夠簡潔直觀。結合Matlab GUI設計。編寫應用程序,并設計相應的用戶界面來實現層次分析法,可以使使用者更加方便快捷的應用層次分析法。
軟件算法流程:開始→輸入層數N→輸入判別矩陣→一致性檢驗→(通過)輸入準則層與方案層的關聯→計算組合權向量→根據組合權向量決策→結束
注:若一致性檢驗不通過,則直接結束。
2.2.1 寫入txt文件
由于層次分析法需要處理很多矩陣,如果一個個輸入會相對比較麻煩,我們采取單獨的txt文件形式進行保存。將所有結果保存為txt文件。
關鍵代碼如下:
string=get(handles.edit11,'string');
[name,path]=uiputfile({‘*.txt’},’保存’);
str=[path name];
[nrows,~]=size(string);
fid=fopen(char(str),'wt');
for row=1:nrows
fprintf(fid,'%s ',string{row,:});
end
fclose(fid);
2.2.2 寫入數據
寫入所有操作的數據,以便層次分析法操作。
關鍵代碼如下:
function writejuzhen(juzhen,filename)
fid=fopen(filename,'a');
leng=size(juzhen);
fprintf(fid,'%c','[');
for i=1:leng(1)
for j=1:leng(2)
fprintf(fid,'%d',juzhen(i,j));
if j~=leng(2)
fprintf(fid,'%c',',');
end
end
if i~=leng(1)
fprintf(fid,'%c',';');
end
end
fprintf(fid,'%c ',']');
fclose(fid);
2.2.3 輸入矩陣
由于層次分析法需要處理很多矩陣,當矩陣階數小于7時,可以手動輸入矩陣;
當矩陣階數大于7時,可以導入excel文件。
關鍵代碼如下:
t=findobj('tag','uitable1');
set(t,'visible','off');
num=get(handles.edit1,'string');
num1=str2num(num);
if num1<7
XX=cell(1,num1);
h=findobj('tag','uitable1');
set(h,'visible','on');
set(handles.uitable1,'data',XX);else
[n a m e,p a t h]=u i g e t f i l e(‘*.xls’,’選擇文件’);
[num,txt,raw]=xlsread(strcat(path,name));
h=findobj('tag','uitable1');
set(h,'visible','on');
set(handles.uitable1,'columnname',raw(1,:),'data',raw(2:end,:));
End
根據1中的“選擇旅游地”模型,繼續求解,
得到準則層的判別矩陣:

最大特征值:λmax=5.073
權向量(特征向量):
w=(0.263,0.475,0.055,0.090,0.110)T
隨機一致性指標RI=1.12(查表)
一致性比率CR=0.018/1.12=0.016<0.1
結論:通過一致性檢驗。
最后用本軟件輸入數據,得到的結果如圖1所示:

圖1 輸出結果界面圖
本文應用實際例子,結合Matlab強大的數學算法功能和GUI的界面設計功能,來解決數學建模過程中的層次分析法問題。由于層次分析法的運用范圍極廣,如經濟計劃和管理,能源政策和分配,人才選拔和評價,生產決策,交通運輸,科研選題,產業結構,教育,醫療,環境,軍事等,說明該軟件的應用前景很好。同時,我們的MatlabGUI設計存在著一些優點和不足。不足有:界面設計不夠美觀、代碼不夠精煉等。而優點則有:數據多時,矩陣可以利用Excel導入,避免了輸入的繁雜;對數據采用文本錄入方式,具備存儲能力和糾錯能力,這點還可以深入探討。
[1]蔣難得.基于MATLAB_GUI層次分析法軟件實現及其實例應用[J].物流工程與管理,2012(9).
[2]邱金蕙,李振全.基于Matlab/GUI的新型界面開發方式[J].河北工業科技,2008(7):25.
[3]宗節保,段柳云,王瑩.基于Matlab GUI軟件制作方法的研究和實現[J].電子設計工程,2010(7):18.
[4]王玉林.新型界面開發工具_MATLAB_GUI[J].工程及實踐應用技術,2008(6).