智慧型控制 Intelligent Control

用程式建立 FIS

不開任何圖形工具,完全用程式建立一個 FIS(老師錄製的操作示範):

程式 CreateFIS.m

a=newfis('mytipper');                                   % 新建 FIS(預設 Mamdani)
a=addvar(a,'input','service',[0 10]);                    % 第 1 個輸入與範圍
a=addmf(a,'input',1,'poor','gaussmf',[1.5 0]);
a=addmf(a,'input',1,'good','gaussmf',[1.5 5]);
a=addmf(a,'input',1,'excellent','gaussmf',[1.5 10]);

a=addvar(a,'input','food',[0 10]);                       % 第 2 個輸入
a=addmf(a,'input',2,'rancid','trapmf',[-2 0 1 3]);
a=addmf(a,'input',2,'delicious','trapmf',[7 9 10 12]);

a=addvar(a,'output','tip',[0 30]);                       % 輸出
a=addmf(a,'output',1,'cheap','trimf',[0 5 10]);
a=addmf(a,'output',1,'average','trimf',[10 15 20]);
a=addmf(a,'output',1,'generous','trimf',[20 25 30]);

rulelist=[...                                            % 每列一條規則
        1 1 1 1 2
        2 0 2 1 1
        3 2 3 1 2];
a=addrule(a,rulelist);

b=evalfis([1 2],a);                                      % b = 5.5586
c=evalfis([3 5;2 7],a);                                  % c = [12.2184; 7.7885]
writefis(a,'mytipper');
▶ 在 Colab 開啟原課程的 MATLAB 程式已改寫成 Python 筆記本(第 4 節 CreateFIS.m),可以直接在瀏覽器執行、修改參數。⬇ 下載 Fuzzy_toolbox.ipynb

rulelist 每一列代表一條規則,前面幾欄依序是各輸入、各輸出使用第幾個歸屬函數(0 表示不使用,負數表示 NOT),接著是權重,最後一欄是連接詞(1 = AND、2 = OR)。例如第一列 1 1 1 1 2:服務第 1 個(poor)、食物第 1 個(rancid)、小費第 1 個(cheap)、權重 1、以 OR 連接——即「若服務差或食物難吃,則小費少」。(說明為補充)

食物的兩個梯形把頭尾延伸到範圍外(−2、12),在 0~10 之內和 tipper.fis 的結果完全相同。

編註:原講義的程式與截圖把輸出的第一個歸屬函數拼成 'cheep',存好的 MyTipper.fis 則是 cheap;名稱不影響計算,這裡統一寫成 cheap。下一步:刪除歸屬函數、變數與規則。

附檔:CreateFIS.m

原圖對照
原圖