第二章 研究背景及目的
第一節 研究背景
偽幣問題最早是由誰提出來的,大概已經是不可考的問題了。有一說是在很 久以前的時代,所羅門王命令鑄錢師鑄造出十二枚純金的金幣,來展示他的國 威,但是這個鑄錢師卻偷工減料,把其中一枚硬幣偷偷的用銀作為原料,再鍍上 黃金,想要藉此騙過所羅門王,然而,最後所羅門王展現了他的智慧,只用了一 把天秤,秤了三次就把偽幣找了出來。
後來隨著時間的演進,這個問題也有了很多種不同的類型。例如,不知道偽 幣的數量,或者是不知道偽幣的輕重,當然,問題所給定的限制條件越少,所需 的秤量次數將會越多。因此我們將對各種不同條件所形成的不同問題類型,分別 的加以討論,在這邊所提到的偽幣所指的就是與正常硬幣重量不相等的那些硬 幣,而一般說來那些佔少數的硬幣,就被我們稱之為偽幣。
若是依照一開始秤量時所知的條件:偽幣數是否已知、是否知道偽幣較正常 硬幣是輕或是重,則我們就可以把此問題分為四大類。在秤量者已經知道偽幣數 量時,可以依照是否已知偽幣較正常硬幣輕或是重,來將此類問題加以分類,本 論文就是針對此類型來討論。另外在偽幣數不能確切知道的情形下,我們將不會 討論此類問題。
事實上我們也可以把偽幣問題看成是一種演繹遊戲(Deductive games),也 就是以特定的方法做測試,然後從測試的結果中得到某些資訊(在偽幣問題中,
就是經由秤量的過程,得知一堆硬幣和另一堆硬幣間的輕重關係),而玩家(或 稱推論者)則藉由這些資訊去推論出其背後所隱藏的資訊(在偽幣問題中就是找 出那些和正常硬幣重量不同的偽幣,以及那些偽幣較正常硬幣輕還是重)。
其他著名的演繹遊戲有 Mastermind【11】、AB Game【11】以及 Ulam's game
【8】等。
第二節 一般化問題的相關研究
最早研究一般化問題(General case)的 Hu、Chen、Hwang 三人【9】,曾提 出一個秤量的標準來比較秤量硬幣演算法的優劣,我們在此將做個簡單的介紹。
在他們的論文中定義了幾個表示秤量次數的函數:其中定義W( )n,d 表示從 n
枚硬幣之中找出 d 枚較重的偽幣,所需的最少秤量次數;另外也定義了W(n:d)表 示秤量者並不知道 d 是多少的情形下,從 n 枚硬幣之中,找出 d 枚較重偽幣,所 需的最少秤量次數。這是因為我們目前尚未有一最佳的演算法來從各種情況,在 最少的次數內找出偽幣,所以就不知最少次數是多少,因而使用此函數來表示最 少次數。從這邊我們可以很直覺的看出W(n:d)≥W( )n,d 。
另外也定義了WG(n:d)則是以某個演算法 G,來從 n 枚硬幣中找出 d 枚偽 幣,而在一開始時又不知道偽幣數目,所需的最少秤量次數。最後得到如下的式 子:
對於所有 d 而言,WG(n:d)≤c*W(n:d)+b,其中 b、c 均為常數
其中 c 這個常數是用來比較各演算法間好壞的主要因素,可以看出假如 c 越小,則表示此演算法 G 所需的秤量次數也越少,就代表這個演算法越好。這個 表示法在本論文中也會使用到。
除此之外我們也會引用到他們論文中的一些表示法:假設有一堆硬幣 A,|A|
表示 A 這堆硬幣中的硬幣個數,||A||則表示 A 這堆硬幣的總重量。
第三節 一枚偽幣問題的相關研究
在偽幣數目只有一枚時,且偽幣較正常硬幣是輕還是重也是已知的情形下,
這方面沒有人特別提出論文,因為這類問題大家都能以最直覺的「三分法」來找 出偽幣,這個方法是在一開始把硬幣分成三堆,將其中兩堆放到天秤去秤量,假 如秤出來的結果是有一堆較重,那代表偽幣是存在於較重的那堆裡面,若是秤出 來的結果是等重的,那代表偽幣是不在天秤上的那兩堆中,然後我們就可以再把
三分之一,也因此我們可以得到這個關係式:W( )n,1 =⎡log3n⎤。
而在偽幣跟正常硬幣的重量關係未知的情形下,在「演算法的天空」一書【12】
中,對此類問題提出了演算法(由於其中的演算法頗為複雜,有興趣的讀者可以 在「演算法的天空」【12】找到詳細的說明)。
假如我們以之前的表示法來表示秤量次數的話:
若偽幣較正常硬幣重則秤量次數為W( )n,1 若偽幣較正常硬幣輕則秤量次數為W(n,n−1)
在此我們針對偽幣較正常硬幣輕或重為未知的情形,沿用了李立中【10】的 定義方式:S( )n,d 表示在偽幣較正常硬幣輕或重為未知的情形下,從 n 枚硬幣 中,找出 d 枚偽幣,所需的最少秤量次數。
依此定義方式,我們可以把「演算法的天空」一書【12】中所提到的演算法 的秤量次數表示成SA( )n,1。在網站【13】中提出了SA( )n,1 和 n 之間關係的分析,
他假設在秤量 k 次後能在一堆硬幣,硬幣數為T( )k,中找出一枚不知輕重的偽幣:
( )2 =3; k >2, T( )k =3(T(k−1)+1)
T
由這個關係式我們可以推得:SA( )n,1 =⎡log3(2n+3)⎤
另外在 Lorenz 跟 Noebert 的一篇論文【4】中,在偽幣數為一枚,偽幣較正 常硬幣輕或是重為未知,但有多個天秤可同時秤量的情形下,提出了下面的關係 式:
( )
b b n
w
− −
≤ +
2 1 1 2
其中 n 為硬幣總數、b 為天秤個數、w 為秤量次數 當我們把 b 設成 1 時,可得到如下關係式:
( )
⎡log3 2n 3⎤ S ( )n,1
w≤ + = A
所以我們可以看出「演算法的天空」一書【12】中所提出的演算法,已經幾乎跟 理論上的 lower bound ⎡log32n⎤ 相等了(在本論文第四章第二節有討論)。
第四節 兩枚偽幣問題的相關研究
在兩枚偽幣,且知道偽幣輕重的情形下,在 Pyrich【3】的網站中,有提出 解決此類問題的演算法,他的演算法主要是先把硬幣分成三堆,A、B、C,其中 它們的個數關係為:|A|=|B|, |(|A|-|C|)| = 1,也就是說 C 堆可能比 A、B 兩堆多一個或者少一個,再依照該演算法取找出偽幣。在這裡我們不詳細說明 Pyrich【3】的演算法,只列出此演算法的秤量次數(有興趣的讀者可以參考 Pyrich
【8】的網站或者是李立中【10】的論文中有詳細的說明),依照李立中【10】對 Pyrich【3】的演算法所做的分析,可以得出下列式子:
( )
⎡ n⎤
n W n
W n W n
Max n
WPyrich Pyruch
3
3 2 2 log
log 3 2 2 1 3, 2
2 1 3, 2 , 2 2 3, 2
,
=
⎥⎥+
⎢⎢ ⎤
= ⎡
⎟+
⎠
⎜ ⎞
⎝
= ⎛
⎩⎨
⎧
⎭⎬ + ⎫
⎟⎠
⎜ ⎞
⎝ + ⎛
⎟⎠
⎜ ⎞
⎝
= ⎛
在兩枚偽幣,且未知偽幣輕重的情形下,李立中對此類問題提出了「交錯秤 量法」【10】,他的演算法的主要概念是:交錯的把硬幣分成兩堆(二分法)或者 是三堆(三分法),並把現有已知的演算法(一枚硬幣已知/未知輕重、兩枚硬幣 已知輕重)套入其中,在此我們也不詳細說明此演算法(有興趣的讀者可以參考 李立中【10】的論文),此演算法的秤量次數分析如下:
( )
( )
⎡ ⎤
{ ⎡ ⎤
⎡log ⎤ 3
2
2 3 2 log ,3 2 3 log 2 , 2 2 log 2
, 2 2 log 2 , 2 3 log log
, 2 1 log 2 , 2 1 log 3
log
5 1 6, 1
12, , 5 2 3, ,
4 2 6, ,
4 1 6, 2
, 5 1 6, 1
3, , 3 2 6, ,
1 1 2, 1
2, 2
,
3
3 3
3
3 3
3 3
3 3
+
=
⎭⎬ + ⎫
⎥⎥⎤
⎢⎢⎡
⎥⎥+
⎢⎢ ⎤ + ⎡
⎥⎥⎤
⎢⎢⎡
⎥⎥+
⎢⎢ ⎤ + ⎡
⎥⎥⎤
⎢⎢⎡ +
⎥⎥+
⎢⎢ ⎤ + ⎡
⎥⎥⎤
⎢⎢⎡ + +
=
⎭⎬ + ⎫
⎟⎠
⎜ ⎞
⎝ + ⎛
⎟⎠
⎜ ⎞
⎝ + ⎛
⎟⎠
⎜ ⎞
⎝ + ⎛
⎟⎠
⎜ ⎞
⎝ + ⎛
⎟⎠
⎜ ⎞
⎝
⎛
⎟+
⎠
⎜ ⎞
⎝ + ⎛
⎩⎨
⎧ ⎟
⎠
⎜ ⎞
⎝ + ⎛
⎟⎠
⎜ ⎞
⎝ + ⎛
⎟⎠
⎜ ⎞
⎝ + ⎛
⎟⎠
⎜ ⎞
⎝
= ⎛
n
n n
n
n n n
n n n
Max
W n W n
W n W n
W n
W n W n
W n W n
S n Max n
S
Pyrich Pyrich
Pyrich w
另外在兩枚偽幣,且未知偽幣輕重的情形下,Liu 跟 Nie【7】也針對此問題
次,最多能從多少硬幣中,找出兩枚未知輕重的偽幣。然而就秤量次數而言,在 理論上秤了 k 次,會有一個 Upper bound(U( )k )來表示最多可從U( )k 枚硬幣中 找出兩枚偽幣來,另外假設有一個方法能在 k 次秤量中,可以從最多N( )k 個硬
幣中找出兩枚偽幣的話,很直覺的可以看出N( )k ≤U( )k ,而他們就是證明出:
當 k 為偶數時,N( )k =U( )k ;當 k 為奇數時,N( )k ≈U( )k ,且N( )k 可以一直逼
近U( )k 。
第五節 三枚以上偽幣問題的相關研究
在三枚以上的偽幣問題中,在已知偽幣較正常硬幣輕或是重的情形下,李立 中【10】在他的論文中也提出了一個一般化的方法來解決此類問題,在他的論文 中稱之為 Find 演算法,這個方法主要是以遞迴的方式產生可能的偽幣分佈表格,
然後藉由秤量所得到的資訊與每堆硬幣總數的限制來消除表格中不可能的分佈 情形,如此遞迴執行 Find 直到找出所有偽幣為止。(在此我們並不詳細解說此演 算法,有興趣的讀者可以參考李立中的論文【10】)。