跳到主要內容

OR|作業研究與資料科學 其二

 『作業研究(Operations Research,OR),是一門應用數學學科,其是利用統計學,數學模型和資料科學等方法,去尋找複雜問題中的最佳或近似最佳的解答。作業研究經常用於解決現實生活中的複雜問題,特別是改善或優化現有系統的效率。

上一篇文章當中,我們透過一些簡單的例子,瞭解了作業研究(以下簡稱為 OR)的目的。而在這一篇的文章當中,則要介紹 OR 在進行最佳化求解的時候的手段。以及 OR 與資料科學(Data Science,以下簡稱為 DS)的差異。


Photo source :  Aspire Consulting Ltd

# 相同之處

前一篇文章當中,我們不斷提到 OR,是一門用來求解最大值與最小值的數學方法。那麼對照到 DS 呢?這個問題範圍可能太大了點,我們不妨先縮限一下討論範圍,就只討論機器學習當中的分類(Classification)、分群(Clustering)與迴歸預測(Regression)這三種方法就好。

上述三種機器學習方法,無論是哪一種,其基本概念,都是將演算法當中的損失函數,在設定好的迭代梯度下,將損失函數的值迭代到最小,以收斂模型。再藉由收斂的模型,來產生對應的分類、分群、迴歸預測結果。從這個層面來看,OR 跟 DS 是一樣的,都是希望藉由最大化或者最小化某個目標,藉以得知將目標最佳化之後,其他變數的值。


# 相異之處

OR 與 DS 最大的相異之處就在於:OR 的建模過程並沒有「訓練」這個步驟。因為模型不需要訓練,自然也不需「訓練資料」。許多不曾接觸過 OR 的資料科學工作者可能會對這一點感到詫異。其實這沒什麼好好訝異的,這裡舉個簡單的例子來比喻:只要有念過國中、高中的朋友們,應當都學過如何解聯立方程式、乃至於大學階段的線性代數。OR 的模型其實就是結構更複雜、且可能有許多限制條件與目標的線性代數應用題(當然,OR 的問題當中更常見的是非線性規劃與整數規劃問題)。

不需要訓練資料,但不代表 OR 的建模過程不需要資料。OR 的建模所需要的是方程式的係數。例如:某某生產物料的成本單價、兩家門市當中選擇某一條路徑的移動距離、一個星期的某一天當中,從某個火車站的某班列車的平均上下車人數等等。因此,OR 的建模並不像機器學習建模那樣,需要大量且經過完善處理後的資料,才能建構出一個有用的模型。OR 的建模,所要求的是方程式係數與變數資料的完整與正確性。


# 手段

要聊手段,就得從目的來回推。先聊聊我們實熟悉的機器學習分類、分群、還有迴歸預測問題,這三種問題其實都有明確的對應手段,也就是各自對應的演算法模型,我們可以說,那些分類演算法、分群演算法等等,就是手段本身。

那麼 OR 呢?從應用領域的角度來看,OR 的解題手段非常包羅萬象,除了前一篇文章提到的選址問題、運輸指派問題、網路流最大化問題等等,像是在專案管理、存貨管理、排隊理論等等,幾乎都有專門的數學模型來解決對應的問題,這些模型不見得像機器學習演算法一樣,具有複雜的演算法流程,也沒有訓練過程。反倒是奠基於基礎的機率與統計,且領域專門性特別強的模型。有些模型甚至只能在特特定的應用情境當中使用,而無法像機器學習的分類、分群演算法一樣,在用法上比較具有彈性。

你可以說,在手段(工具)上,DS 的模型結構不太會因為所求解的問題而改變,會需要調整的通常是訓練資料、以及模型的參數。相反的,OR 的模型則是根據所求解的問題目標不同,模型的樣貌、結構都會有所不同,但所使用的資料欄位、參數定義等等可能不會有太大差異。

不過,既然在 DS 這一塊我們只討論到機器學習模型的分類、分群、以及迴歸預測三種方法,那麼 OR 這一塊我們似乎也該縮限一下討論範圍,於是,我們就專門來看「數學規劃」就好。

誠如前面不斷提到的,OR 的方程式模組,會根據應用目標而有所不同。我們可以把「數學規劃」視作一項廣義定義的手段。但這裡還有個進一步可以探討的點是,當我們把 OR 的方程式模組建構好之後,該用哪一種最佳化演算法來尋求最佳解?

這裡指的最佳化演算法(Mathematical Optimization),是指,例如:

  • 牛頓法(Newton's Method)、
  • 螞蟻演算法(Ant Colony Optimization)、
  • 模擬退火法(Simulated Annealing)、
  • 粒子群演算法(Particle Swarm Optimization)、
  • 基因演算法(Genetic Algorithm)

是指在已經明確知道方程式的最佳化目標、值域範圍、變數關係等等條件之後,用來找尋最佳解的演算流程。

如果各位有在就讀大學或者研究所時期,修過演算法的課程,對上述這些方法應當都不陌生。在深度學習領域當中常見的隨機梯度下降法(Stochastic Gradient Descent)、Adam 演算法(Adaptive Moment Estimation)……等,也是屬於一樣的範疇。

有這麼多的最佳化方法,自然是因為早期被提出來的方法當中有些缺陷,所以才有後繼學者不斷提出改良方法。在規模龐大且結構複雜的 OR 問題當中,選用合適的最佳化方法,往往能夠以更短的時間、更少的運算資源求得最佳解,這在企業級的應用當中尤其重要。在機器學習當中的某些演算法,也有配置這一類的最佳化方法來協助求解運算。不過,這已經超出本文的討論範圍,這裡就不再多加詳述。


# 軟體工具

要求解這些方程式模組,自然是交給電腦來算。在 OR 的領域當中,當然也有專門的軟體,這些最佳化軟體的特色在於,使用者幾乎可以將整個 OR 方程式模組,以非常接近原始數學表達式的方式來撰寫,不必在特地轉換成特定程式語言的語法。此外,其在方程式模組的求解速度上,已經過大幅度的優化,這讓使用者在求解一些規模龐大且複雜的 OR 問題時,得以更有效率的獲得答案,尤其在企業級的應用上就變得至關重要。在學術界當中,常見的 OR 專門軟體有 LinDo Sytem Inc. 所開發的 LINDO/LINGO,以及 IBM 所推出的 CPLEX Optimizer,兩者都有提供於學習用途的免費試用版,以及功能強大的付費版本。

但是對於許多的獨立開發者、研究者、或者開發經費較不足的企業單位而言,付費軟體通常是個奢侈的選項。所幸,現在的許多程式語言,都能找的到類似的 library 可以進行數學最佳化的求解運算,對於問題規模不大,或者不追求運算效率的使用者而言,足矣。例如在我的 GitHub 範例當中,所使用的就是Python 的 MIP 套件。

此外,一些大型科技公司的開發團隊,也有針對若干程式語言,釋出開源且功能強大的 OR library。例如由 Google 推出的 or-tools,以及 Microsoft 推出的 maro,都是非常強大的 OR 求解工具。若是之後還有機會寫程式來求解 OR 的問題,這兩項 library 會是我非常想嘗試的工具。


延伸閱讀:

  1. 演算法筆記 – Optimization
  2. 線性規劃 (一):標準型問題 | 線代啟示錄
  3. 數據與思考 : 工業工程與作業研究