2008年9月6日 星期六

模糊邏輯

我善於用‘陰力’。何謂‘陰力’?就是適當控制力度的大小。例如,收緊螺絲,在大部份情況都不是越緊越好的,能做到恰到好處便是陰力。

若你不是一個DIYer,上例可能比較難理解。那麼便請想想一個機械人學上的難題。這就是以金屬機械手(不可以有軟膠)來拿起一隻盛了水的薄玻璃杯。可以想像,力輕了少許,杯便會拿不穩,但重了便會壓爛水杯。

要做得到,最少要解決兩個問題,首先就是機械手上要有適當的感應器,然後,有一個適當算法(algorithm)去處理資料,指揮最合適的力度。

使用一般用途(general purpose)的程序語言,處理這類問便比較麻煩,原因便是它們都是設計來處理清晰精確,或是二分的事情。例如,所有一般用途程序語言都會有類似if ……then……else的控制結構。這即是說,電腦會檢查某一特定條件,符合便做一事,不符合便做另一事。例如,

if income > 20000 then tax = income * 0.15 else tax = 0; (註一)

這是一個簡單化的計稅程序,收入少於或等如20000便無須納稅,若高於20000便要納稅百份之十五。

但回到機械手拿起水杯的問題,用上述的思路,就十分難處理。首先,力何謂大,何謂小,並沒有一個清晰的標準。你想想自己是如何拿起水杯的?你永遠都不會想,我要用100N的力。事實上,力要用多大取決於非常多的條件,例如,杯的表面光滑程度,杯裝有多少水,以至當時的溫度和濕度都對應施多少力都有影響。

上世紀五十年代,電子工程師就開始研究一種非二分化的邏輯,後來便由數學家總結出一門名為模糊邏輯(fuzzy logic)的新科學。二千多年前,希臘哲學家便為邏輯思維定下了一些基本法則。其中第三條便是排中律(law of excluded middle),簡單來說就是,若不是A便是非A。反之亦然。如上例,收入就祗可能是大於20000或不大於20000。並不可能是同時大於又非大於20000(留意,非大於20000包括等如20000)。這不是常識嗎?是,但邏輯就不是常識!所以,必需定好甚麼東西可以接受,甚麼不能。一般用途的電腦程序語言便是建基於排中律!

但我們很多習以為常的概念都不是這樣的。例如:‘今天很熱!’這句話實在是甚麼意思呢?或我們會說:‘若很熱,便開啟空調。’我們都很清楚這句在說甚麼,但若要把這句變成電腦程式,這就‘無能為力’了!我們可以寫

If temperature > 32 then turn_on_air_conditioner();

但是32度就是很熱嗎?

句中的‘很熱’並不單是說溫度,這還有‘濕度’、‘文化’、‘生活習慣’以至‘性別’和‘心情’等等……的考慮!

有一種叫‘去模糊化’(defuzzification)的算法,容許使用一般用途的程序語言去處理有關問題。但永不及使用模糊邏輯來得簡單直接和方便。

由於不能使用正統的數學和邏輯語言,我並不能精準描述模糊邏輯的技巧,而祗可以給大家一個印象,但千萬不要以為這就是模糊邏輯的全部。就好像不要以為萬有引力定律就是規定物體會下跳啊!

就以‘熱’為例,傳統邏輯必需以一些條件清晰地界定為‘熱’與‘非熱’。若‘熱’的溫度標準定於攝氏30度,高於30度的便是熱,相反便是‘非熱’。但模糊邏輯並不會肯定的說是‘熱’還是‘非熱’,而會表達成一個介乎0與1的數字。0代表‘完全非熱’,而1代表‘完全熱’,但 0和1都鮮有發生。例如,30度可能是0.75而20度就可能是0.25。同理,當我們把濕度考慮在內時,不同的濕度便會對應一個介乎0與1間的數字。接著,‘生活習慣’、‘文化’、‘心情’等等都可以用類似的方法處理。

當這些數字按一定的法則結合,便可以得出對‘熱’的一個模糊理解,電腦便可以按這個理解去作出相應的行動。

最近我買了一個模糊邏輯(註二)電飯煲,它的表現確實令我滿意,它就好像‘很有智慧’地處理如米種、米量、水量、濕度、環境溫度等等的問題。 

很多先進的集體運輸系統都是由‘電腦’駕駛的,香港的地下鐵路便是一個好例子(註三),單是列車的準確停站(註四),就一點也不簡單了。能做得到今天的水平,模糊邏輯就功不可沒!


註一:例子是pseudo code,並非任何特定語言。

註二:模糊邏輯給人的印象不好,所以商人把模糊邏輯改成‘快思邏輯’。

註三:地下鐵路是香港鐵路的前身,在和九廣鐵路合併前的名稱。注意,九廣鐵路主要是人手駕車,而地鐵由一開始便是自動駕駛。

註四:特別是地鐵加上了月台膜門後,其停車準確度的要求更大為提高。

沒有留言:

網誌存檔