不論是生活中或是工作中,我們一直都在做各種決定。
今天要搭配什麼樣的衣服?中午要吃什麼?週末要去哪裡玩?要用多少時間花多少錢做哪些事情?會思考甚至煩惱,就是我們想要盡可能的追求最佳解,讓效益最大化。
當然,人生不(一定)會有最佳解,所以才有趣也值得去探索
但是在某種程度上,如果可以量化這些變數,理論上就有可能找到最佳的解答。
一些例子像是:
行銷部門如何在有限預算下決定廣告商來達到最好的效果;
控管供應鏈,決定我這一季要進多少貨,要雇用多少作業員,達到合理最大的產能;
老闆決定要關哪幾家工廠來最佳降低總成本(包含固定營運成本跟運輸成本)
理財顧問幫助客人如何在可接受的風險下選擇投資組合報酬最佳化;
如何在有限的資源下找出最佳化分配(resource allocation optimization),做出最好的決定,是大大小小企業一直不斷追求的目標。
有鑑於此,今天我們要來稍微看一下一個叫做Linear Programming的工具,以及如何搭配Python來使用它。
Linear Programming
Linear Programming,英文可能聽起來像什麼程式,其實不是😅。中文叫做線性規劃。簡單來說是一套數學工具,用來幫助我們在已知限制條件(constraints)下找到目標(objective)的最佳解。前提是問題的本質必須是線形系統(Linear system)以及不等式(Inequality)所組成的(我們就不多討論複雜的數學模型,有興趣的可以在網路上參考)。
基本上簡單的例子像是:
求x + 2y 的最大值,條件是
y <= 50
x + y <= 120
聰明的你可能很快就算出來了,最佳解就是:
x + 2y = 170
x = 70
y = 50
反過來把上面的式子(或稱之為model)用生活的例子帶入的話,可能就像是:
我想要買兩個玩具跟一本書,最多我可以花多少錢?條件是
玩具一個不能超過50元。
一個玩具加一本書不能超過120元
當然,現實中的情況往往是更加的複雜,設計一套模型通常沒那麼容易,加上如果模型的複雜度高(譬如說有很多變數),不但得高度仰賴專業(domain)的判斷,計算上也會變得吃重。
那麼接下來,我們稍稍來看一下如何用Python來幫我們model這些條件及目標,進而計算出最佳解吧~。
例子 1
首先,我們會用到一個第三方library -- pulp......