理工科知識有用嗎?#

作者曾經聽到有人說,理工科的知識在生活中幾乎都用不上。這個說法的意思是:

  • 我們平時也就買個菜算個賬用一點小學數學,最多再算算理財和保險
  • 而像微積分、量子力學這些東西根本用不上
  • 一個證據是,文科生不懂那些,日子也過得不錯

作者反對這個說法:

  • 理工科的知識帶給我們的不僅僅是具體的方法應用,更是一種思維模式,能幫助我們清晰思考生活中遇到的問題
  • 而且有些理工科知識就是可以用於日常生活的,比如計算機算法就可以對生活進行指導
  • 如果一個人學了一大堆科學知識,日子卻過得很糊塗,作出很多錯誤的決策,那只能說明這個人並不是真的懂科學

不過我們也得承認,日常生活中的事,如果只想做到普通水平,大多不用特別高級的知識。而以作者之見,這是因為要解決同一個問題,不同應用級別要求的實現水平不一樣——只有高要求,才需要高級工具

這一節咱們講一個計算機科學的著名難題,來看看應該怎麼應對難題。

1. 真正的難題:NP 困難#

當一個計算機科學家說「難題」的時候,他說的可是真正的難題

相對難題 vs 絕對難題#

  • 老百姓說的難題通常只有老百姓才認為難。比如你讓一個小學生做一道高中數學題,他會說這是一道難題——但這個難度是相對而言的。換個數學家來,高中數學題根本不叫事兒
  • 老百姓愛說「難者不會會者不難」,其實說的都不是真的難題

真正的難題,得是絕對意義上的難。 哪怕有一道題,現在活著的所有人都不會做,你也很難將來會不會有人找到一個巧妙的解法。他一說那個解法大家都會覺得很簡單,所以那還不能算「絕對意義上的難」。

計算機科學家的 NP 困難#

計算機科學家找到了一種絕對意義上的難題。術語叫「NP 困難(NP-hard)」。

  • 再強式翻譯一下,大約叫「非確定性多項式困難」
  • 不過你不必在意這個術語,你只需知道:凡是「NP 困難」的問題,都是絕對的難題

先看三種問題層級#

簡單問題一:搜索#

給你一份學生名單,讓你找一找,其中有沒有一個叫「王小二」的學生。

  • 這是一個簡單問題。簡單體現在計算時間短
  • 你只需要把名單上的名字過一遍就行
  • 對計算機來說,這是最簡單的搜索
  • 如果名單上有 $N$ 個名字,搜索時間將會和 $N$ 成正比

簡單問題二:排序#

還是 $N$ 個學生,現在讓你按照考試分數給他們排名次。

  • 如果你手動,先挑最高分,再挑第二高的分這麼排,就太慢了
  • 如果你對計算機算法有一定了解,你大概知道有一些特別聰明的排序算法
  • 其中最快的排序算法所需要的運行時間,大約與 $N \log N$ 成正比
  • 排序比搜索要慢一些,但是這個時間也還可以,我們仍然可以說這是一個簡單問題

困難問題:旅行推銷員問題#

在一張地圖上有 $N$ 個城市,想象你是一個推銷員,你能不能找到一條最短的路線,不重不漏地經過所有這些城市去做推銷,然後回到起點?

這個問題叫作「旅行推銷員問題(Traveling Salesman Problem, TSP)」,是一個最著名的組合優化問題,也是一個 NP 困難問題。

解決這個問題沒有什麼特別聰明的計算機算法——你幾乎只能把這些城市的所有排列組合都計算一遍,看看其中哪個最短。

你所需要的計算時間,不是跟 $N$ 成正比、不是跟 $N$ 的平方成正比、也不是跟 $N$ 的幾次方成正比——而是跟 $(N-1)$ 的階乘 $(N-1)!$ 成正比

城市數需要嘗試的路線數
10 個城市超過 36 萬種路線
15 個城市超過 871 億種路線

計算複雜性理論#

  • 20 世紀 70 年代,計算機科學家發展了一套「計算複雜性」理論,「NP 困難」這個概念就是那時候提出來的
  • 1972 年,加州大學伯克利分校的理查德・卡普(Richard Karp)證明旅行推銷員問題是個 NP 困難問題
  • 不但現在沒有好的解法,而且我們在理論上證明,這個問題幾乎不可能存在什麼好的解法

為什麼說「幾乎」呢?因為這裡面涉及一個數學猜想,叫「$P=NP$」,也就是說也許還存在簡單算法的一線希望,不過多數計算機科學家不相信那個猜想。

總而言之,NP 困難是真正的困難。連計算機都認為它是個難題。

2. 實用者:啟發式算法#

也許你對旅行推銷員問題有個不吐不快的想法:為啥非得追求「最短」的路線呢?我們日常生活中如果要連續去幾個地方,有誰會精心計算各種排列組合呢?我們都是找一條看起來差不多的路線就可以了!

這就是「實用者」的態度。計算機科學家非常理解這個立場。事實上,面對 NP 困難問題,最方便的做法,就是找個差不多的解。

最近鄰居法#

這就引出了「啟發式算法(heuristics algorithm)」——使用看起來比較聰明的套路,尋求一個差不多的解。

對旅行推銷員問題來說,有個簡單的啟發式算法叫「最近鄰居法」:

從任何一個城市開始,每次訪問的下一個城市都是距離當前城市最近,同時又尚未被訪問過的城市。

方案路線長度
我的路線(最近鄰居法從 A 點出發)595.96
理論上的最短路線571.24

我選的路線只比理論最短路線長了那麼一點點。誰會在乎這點差異呢?

啟發式算法的威力#

  • 最近鄰居法的計算速度非常非常快
  • 一般的經驗,它得到的結果,平均而言,大概也就比真正的最短路線長了 25%
  • 對實用主義者來說這是完全可以接受的

對於 NP 困難問題,通常都可以用啟發式算法得到差不多、過得去的答案。你將來在江湖上行走,如果有人跟你說「NP 困難」,你的第一反應就應該是「啟發式算法」。

啟發式算法是如此的省時省力,而且它們得到的答案常常令人驚奇地接近最佳答案。

大衛・威爾遜(David Wilson)在《生命視角》(This View of Life)這本書裡也提到了旅行推銷員問題——他認為演化就是一種啟發式算法。生命演化不一定能確保找到最優解,但是一定能給你一個不錯的解。

實用者 vs 終結者#

對實用者來說這真是一個愉快的認知。

如果你非得尋求理論上的最優解,你就成了一個「終結者」——你是想要終極答案,你是在終結這個問題。何必費那麼大的勁呢?差不多就行了,真實生活哪裡需要終結呢?

但是有些人並不滿足於最近鄰居算法。

3. 改進者和競爭者#

UPS 的改進#

旅行推銷員問題其實是快遞員每天都面對的問題。一個真正的快遞公司——美國 UPS,就對這個問題非常感興趣。他們不滿足於最近鄰居算法,他們想要更好的啟發式算法。

這是因為 UPS 在這個問題上不是一般的老百姓:

  • 他們有 55,000 個快遞司機,他們每天要前往 1,600 萬個投遞地址
  • 哪怕是能讓每個快遞員每天少走一英里,UPS 每年就能節省 3,000 萬美元

UPS 是個改進者。 幾年前 UPS 開發了自己的路線規劃系統,叫 ORION

  • ORION 並不能終結旅行推銷員問題,它也是一個啟發式算法
  • 但它能給出更好的答案
  • 如果你面對的是一個價值幾千萬美元的問題,為改進下的功夫就是值得的

競爭者的保證演算#

而計算機科學家還從另一個角度改進了算法。

  • 最近鄰居算法能得到大概比理論最短路徑長 25% 左右的路徑,但這並不是絕對的,只是一般的經驗值
  • 有時候最近鄰居算法給的答案不但不是最短,還可能是最長的
  • 有沒有一個算法,能確保給一個「肯定不壞」的答案呢?

1976 年,倫敦帝國學院的尼科斯・克里斯托菲德斯(Nicos Christofides)教授提出一個算法,能保證它給出的路線比理論最短路線最多長 50%。

此後幾十年一直有人想打破這個紀錄,都沒有成功。直到 2011 年,斯坦福大學和麥吉爾大學的一個聯合團隊,才打破了這個 50% 的紀錄,轟動一時。

他們創造的新紀錄是多少呢?

49.9999999999999999999999999999999999999999996%

小數點後面有 49 個 9。

那你可能會說,搞這樣的改進值得嗎?值得。因為他們不僅僅是改進者。

他們是競爭者。

4. 日常問題和精英解法#

競爭性的態度#

作者鄰居家有個小女孩剛上高中。她的父母一次跟作者聊天,不經意地告訴作者,女兒在學校裡踢足球——不是一般地踢足球,是踢「競爭性」的足球

作者一聽就肅然起敬:

  • 這不是業餘愛好
  • 不是陶冶情操
  • 不是鍛煉品格
  • 這是衝著正式比賽和國家隊去的

競爭,能讓人捨得發揮最大的潛能。

為什麼日常生活不需要高級知識#

因為我們通常都是實用者。實用者的態度是夠用就行,而「夠用」很容易。

  • 這輛車的造型可能沒有那輛車那麼酷,但是安全、越野、油耗各方面性能其實不差,而價格便宜了一半,那就買這輛唄
  • 實用者追求以最小的投入獲得比較高的產出

人們經常說什麼「精益求精」,什麼「追求卓越」,其實實用者不需要那些:

  • 比如你要寫個報告,為此要做很多調研,請問你應該調研到什麼程度?答案是夠用就行
  • 在這個時代搜集信息是沒有止境的,你必須學會適可而止
  • 調研是個邊際效應遞減的事兒——如果調研帶來的好處已經比不上調研本身的成本,那你就應該停止調研
  • 沒有這個實用態度,你寸步難行

有時「對」就得是「貴」#

可你不能什麼時候都「只選對的不選貴的」。有時候對的就得是貴的:

  • 像 UPS 改進路線算法,那個邊際效應很難減下來,你就得捨得大投入
  • 你就值得用高級的手段

競爭者的邏輯#

而對競爭者來說,「邊際效應」幾乎就是個沒有意義的概念。

  • 面對勝者通吃的局面,贏了就贏得一切,輸了就啥也沒有,那你就得真的全力以赴
  • 也許賽車性能提高 5%,價格要提高五倍——那你也得花這個錢
  • 競爭者不計較性價比。

實用主義的盲點#

如果一個人過慣了普通的日子,可能看什麼問題都是實用者心理。

  • 比如有人說高考為啥要考那麼難的數學呢?我們根本用不上啊!殊不知高考是個競爭項目,那麼難的數學就是為了把問不出這種問題的人淘汰掉的
  • 再比如,以前中國的很多工廠,生產車間都是髒亂差,一點都不規範。你說應該規範化,工廠老闆可能會說規範很貴啊,對付對付差不多就行了

陶醉於實用主義小聰明的人,對高級知識的力量一無所知。

強者的思維方式#

有個段子:怎麼判斷生產線上肥皂盒裡裝沒裝肥皂呢?

  • 高級手段又是微電子又是 X 射線
  • 而鄉鎮企業的一個小工想了個辦法:用電吹風吹!空盒子自動會被吹走

過日子也許真的可以這麼幹。但是要想在國際競爭中占據一席之地,這種對付的辦法可不是不行的。你需要更強的安全性和可靠性,你會對生產環境有極端的要求。

面對難題,弱者的思維方式是從實用者開始,在現實中被迫改進;而強者的思維方式是從終結者開始,實在解決不了,退而求其次才尋求改進。