googletrips中存在了280年的古老演算法

仲凡發表於2017-01-09

本文翻譯自https://research.googleblog.com/2016/09/the-280-year-old-algorithm-inside.html,文章描述了google trips中比較有意思的行程規劃演算法,供大家檢視。

演算法工程比較有意思的地方在於它永遠不過時,不知道什麼時候比較古老但是比較有用的演算法可能會在我們的設計中體現,昨天,google釋出了它的google trips, 一個新的app幫助你建立你在城市中的非常不錯的行程。而這個演算法確實在280年之前就已經被論證過的。

1736年,尤拉發表了著名的有關柯尼斯堡的七座橋的著名論文,七座橋問題,如下:
image_01

在這篇論文中,尤拉研究了以下問題:能否旅行者所有橋只走一次就能夠逛遍整所城市(大陸被七座橋隔開)?最後論文給出了結果,對於柯尼斯堡這個城市來說來說,不能。為了證明,尤拉提出了一種所謂的位置幾何學的概念也就是後來發展出來的圖論。論文中,所有的城市的大陸部分被橋分割稱之為節點,而跨越大陸的橋則被稱為邊。如下圖:

image_02

尤拉發現存在這種路徑的充要條件是所有的節點都必須有偶數的邊。只有在這種條件下,才存在一個穿越所有大陸連線,所有的橋只走一次;基於以上的發現,我們將它應用在了了google trips當中。

我們團隊關於這種位置幾何學的理論研究過了一陣子,後來我們的研究方向是根據尤拉的理論我們能否讓旅行者儘可能的走邊所有的地方,這種問題就是現在的“行程規劃”問題。有關這種問題,尤拉沒有研究過,但是基於尤拉的靈感,我們把它稱為定向工程問題。

尤拉的解是完美的並且非常的正確,可是有關行程規劃確實比較頭痛,因為它不存在完美的解決方案,只能找到儘可能接近完美的解決方式。主要在於,有兩個維度是有矛盾的地方:比如說要參觀比較好的景點,但是時間的安排上確需要最節省;其次還需要考慮去的景點不要關門,要考慮到關門時間;甚至比如不要逛太多的博物館(沒人會喜歡連續的玩博物館)。如此增加如此多的約束的問題都被歸結為“旅行商”問題。

旅行規劃的演算法
幸運的是,我們有一個原則叫作三角不等原則,也就是任意兩點之間增加一個路徑點不會減少兩點之間的距離。一旦潛在的這種路徑存在並且遵從三角不等原則,我們的問題也就可以被另外一個演算法去解決掉,這個演算法是斯托菲季斯提出來的,這個問題分為四步做分解:

  1. 首先從所有的目的地出發,連線相鄰的最近的兩個點,也就是生成一顆最小生成樹。
  2. 將最小連線數中的奇數點找出並連線上。這樣就形成了所有的點的連線都是偶數點。(尤拉證明過只有並且所有的點都是偶數點連線才能夠找到這樣的路徑)。

3.因為所有的的點都有偶數連線,形成了尤拉圖,所以就有一個路徑能被找到。

4.我們找大了路徑,但是有可能有的路徑是重複過的,沒關係,將重複的路徑只保留一條。於是我們就找到了這種最好的路徑。

image_03

基於這種高效的路徑尋找,我們可以很容易的一步就生成行程規劃。在每一步中,我們預估使用者最可能到的位置,並且用斯托菲季斯演算法找出需要的時間消耗。更有,一個使用者的的有關景點的選擇基於景點的熱門度以及相鄰景點的差異(跟已經參觀過的比較)。於是我們會選擇最低的成本同時帶來使用者最大收益的景點作為路徑點納入進來。下面是倫敦的的幾一個基於位置的路徑規劃選擇過程:

image_04

google trips中的行程規劃
基於我們在以上演算法中取的的成果,我們跟google trips團隊合作,我們意識到很難從頭開始做,主要原因在於即便我們做了最好的行程規劃演算法,可是又的朋友說“這是很好的規劃,但是我的朋友說另外一個地方也不要錯過,同時我也只有上午有時間,可是我不想錯過規劃中的下午的景點,大本鐘也已經去過兩次了,沒有興趣了”, 所以基於以上的原則,考慮到使用者的規劃更多的是在飛行途中或者自己有時間才一點一點的做。同時很多的使用者不一定在做規劃的時候一定要連線網路裝置,我們必須提供離線的行程規劃解決方案。

最好的行程規劃是基於群體智慧的
雖然在演算法方面的挑戰巨大,我門也意識到高質量的行程規劃更多的依賴於使用者對於我們行程規劃的的路徑點興趣。即便是這樣,我們從google的其他的地方得到了使用者最喜歡的停留的地方,以及從一個地方到另外一個地方的時間(比如google map), 可是我們也無法知道對於我們規劃的路線,使用者是否真的喜歡。

於是我們將目光轉向了群體的智慧,這些方式在google用來通常辨別高速的擁堵狀況,以及餐館的擁擠情況。我們用這些經驗來應用到到行程中來讓使用者得到最好的體驗。我們可以將我們已有的哪些景點比較受歡迎,跟旅行者在旅行中制定路線的選擇聯絡起來。

這種群體的智慧會對未來會有極大的幫助,舉例來說,我們觀察發現,使用者在11:30參觀白金漢宮的停留時間比較長(相對於一天中的其它時間),剛開始有點不解,但是洗洗發現,停留時間長是因為在這個時間白金漢宮會有換崗的表演,會延長使用者的觀賞時間。我門也將這種時間維度的停留時間併入到我們行程規劃的邏輯當中去了。


相關文章