什麼是最佳化技術?給演算法小白同學的快速講解和上手文

碼農談IT發表於2023-11-24

什麼是最佳化技術?給演算法小白同學的快速講解和上手文

來源:阿里雲開發者

阿里妹導讀

本文作者用一個曾經小白學習的視角,來講解什麼是最佳化問題,以及要如何用這個最佳化技術。

背景

作為阿里達摩院MindOpt的產品經理,經常被尊貴的客戶問,什麼是最佳化求解器,能幹啥? 
一般我都秀下面類似的圖。這張圖改版了很多次,目標都是給各位老闆講解:
最佳化求解器是一款底層數學軟體,求解最佳化問題,可以用在各行各業。用了最佳化求解技術,能得到 “最大化收益、最小化成本” 的方案,“滿足規則的可行方案”。
什麼是最佳化技術?給演算法小白同學的快速講解和上手文
老闆們聽了很開心,覺得是個好技術。 
然後,他們會讓下面的技術同學研究下,技術同學過來看文件很痛苦,有很多個案例、很多個文件連結,幾百個API或屬性概念,還甚至有“建模語言”需要學!
因此, 本文我用一個曾經小白學習的視角,來講解什麼是最佳化問題,以及要如何用這個最佳化技術。

一、術語定義

最佳化問題:在給定約束條件下,找到一個目標函式的最優解(最大值或最小值)。
最佳化求解器:求解這個最佳化問題的軟體。
看了這個定義,是不是有種 “不明覺厲、但聽君一席話如聽一席話” 的感覺,還是沒有get到這個東西是什麼,能做什麼用。
彆著急,接下來快速get。

二、快速get理解最佳化是什麼

作為初學者,如果對最佳化技術陌生,可以把 “求解最佳化問題” 理解為 “解一個不等式方程組”,“解方程的”。
最佳化問題就是這個要計算的方程組。接下來我們引入一些數學公式,讓大家更直觀理解。
放心,都是初高中數學水平的數學公式。

引用說明:下面的公式均來自 MindOpt新發布的基於大模型的“AI工程師”MindOpt Copilot 生成的內容截圖,或者案例廣場公開內容截圖。大家也可以進去聊天生成自己需要的示例公式和程式碼。


2.1 方程:一個雞兔同籠問題

問題:

有一籠兔子和雞,兔子和雞各有一個頭,兔子有4只腳,雞有兩隻腳。籠子上有 35 個頭,下有94 個腳。請問兔子和雞的數目各是多少?

對應的數學公式如下紅框所示 (MindOpt Copilot生成) :
什麼是最佳化技術?給演算法小白同學的快速講解和上手文
可以看到數學公式中,有兩個 “等號 = ” 描寫的約束關係的方程組。

這個時候算出來的結果是: 

- 兔子的數量x=12

- 雞的數量y=23
這是個方程組,是的,最佳化求解器也可以算方程組。


2.2  不等式方程組+目標函式:

雞兔同籠問題的最佳化問題

一個最佳化問題,與上面大家熟知的方程對比, 會增加:不等式關係,然後增加了一個目標。
比如上面的例子更改下問題:

有一籠兔子和雞,兔子和雞各有一個頭,兔子有4只腳,雞有兩隻腳。籠子上有頭至少有30個,下面腳至多80個。要想兔子最多,請問最多有多少個兔子?

這個時候,公式如下圖 (MindOpt Copilot生成),變化主要是 :

  1. 對應的數學公式的約束就是個不等式的關係:最多,最少。subject to 就是約束的意思,有時會寫成 st.。

  2. 增加了目標,想要兔子最多。對應 maximize x,也就是最佳化的目標函式 f = x,最佳化方向是最大化。

什麼是最佳化技術?給演算法小白同學的快速講解和上手文
這個時候,在求解這個方程組時:

  • 如果只考慮不等式的約束,解可能就是個域(有多種解、多個可行域)。比如 x=1,y=29;  x=3,y=29; x=3, y= 30……等等;

  • 增加了要將x最大化這個目標,就相當於在這個域裡面找最大值。這個時候可以利用最佳化求解器進行計算,得出最優目標時候的變數取值,如下:

- 兔子的數量 x=10,  

- 雞的數量y=20.
需要注意的是:在有些情況下,最優目標時的變數取值也有可能是個域(多解)的情況。
這裡,是不是有高中學線性規劃的感覺了?比如下面的高一的數學題,是不是很熟悉?
什麼是最佳化技術?給演算法小白同學的快速講解和上手文
這些就是最佳化問題。
它們採用的是最基礎的線性規劃的建模方法。
接下來,我們從應用領域和問題維度的角度,來擴充下最佳化問題的思路。

三、擴充思路


 3.1 擴充應用場景

在各類業務場景中,都有可使用“最佳化問題”的方法來描述業務遇到的問題。
比如餐飲飯店、資產投資、生產製造、物流貨運、零售、廣告、文旅售票、人力資源、電力能源、航空航天、農業種植、醫療保健、遊戲競技策略等,或者家長們常遇到的數學應用題。
下面我們舉2個例子:

例1. 電商網際網路常見的廣告資源的安排:

電商平臺要為一家新興手遊公司進行廣告推廣,平臺有兩種廣告型別可供選擇:型別A、型別B、型別C。廣告型別A的轉化率為5%,每投放一次費用為10元;廣告型別B的轉化率為8%,每投放一次費用為15元; 廣告型別B的轉化率為7.7%,每投放一次費用為12元。手遊公司需要至少獲得1000次投放,並且總費用不能超過20000元。每種型別廣告都希望至少投放5次。平臺希望最大化累計轉化數,要如何規劃廣告投放?

得到如下的最佳化問題數學公式 (MindOpt Copilot生成)
什麼是最佳化技術?給演算法小白同學的快速講解和上手文
最後用最佳化求解器算得的解是:

廣告型別A投放次數=5
廣告型別B投放次數=6
廣告型別C投放次數=1655
- 目標函式值 = 128.165
為了最大化累計轉化數,電商平臺應該投放5次型別A的廣告(每次轉化率為5%,每次費用為10元),6次型別B的廣告(每次轉化率為8%,每次費用為15元),以及1655次型別C的廣告(每次轉化率為7.7%,每次費用為12元)。此時,累計轉化數最大,為128.165次。

例2.  企業人力資源的員工福利安排:

假設一家公司想要給每位員工至少提供以下三種福利中的一種:健身房、健康保險和午餐補貼。給每個員工提供使用健身房需支付50元,健康保險需支付20元,午餐補貼需支付15元。公司有100名員工,每天福利投入的成本上限是4000。公司希望最小化支出,同時儘可能多地為員工提供福利,每種福利至少有30份。該如何規劃福利?

得到如下的最佳化問題數學公式 (MindOpt Copilot生成)
什麼是最佳化技術?給演算法小白同學的快速講解和上手文
此種問題有多目標,最小化成本,最大化福利數。上述的公式把這個問題簡單化,變成一個單目標問題,約束增加福利數大於人數100。最後呼叫求解器得到:

提供健身房福利的員工人數=30 
提供健康保險福利的員工人數=30 
提供午餐補貼福利的員工人數=40 
- 目標函式值 = 2700
為了最小化福利支出,同時儘可能多地為員工提供福利,公司應該為30位員工提供健身房福利(每人每天成本50元),為30位員工提供健康保險福利(每人每天成本20元),併為40位員工提供午餐補貼福利(每人每天成本15元)。這樣,每天的福利支出最低,為2700元。

3.2 擴充問題維度和型別

上面的問題都只有幾個變數(未知數),還比較簡單,如果有很多的變數呢,方程將很長,一般是用矩陣的方式來表達。資料可能是用表格來表示的,比如 MindOpt Copilot 也支援的csv表格輸入。
問題比如:
什麼是最佳化技術?給演算法小白同學的快速講解和上手文
也有用 大sigma 來表達求和 ∑ 的,比如下面幾個金融投資裡面應用的最佳化問題:
什麼是最佳化技術?給演算法小白同學的快速講解和上手文
這裡看到公式,是不是有些頭大了?
別擔心,我們做實際問題的時候就容易理解清楚了。
當前,僅需要了解以下幾個數學概念:

  • 線性、非線性:最佳化問題裡面常說的“線性”就是一次關係,y =3x就是一次的,線性關係。y = 4 *x*x 就是二次的,屬於非線性關係。當前大部分最佳化問題是著重處理線性關係和二次關係,再高次就不好解了。

  • 連續變數、整數變數:變數x的取值型別。如果有的變數只能是整數,不能是小數,或者說是“離散的”。與之相對的是“連續的”。離散的問題最佳化起來會方法不一樣,會變困難,因此經常有問題需要鬆弛下,使得變為連續的。

  • 問題 “凸” 和 “非凸”。凸最佳化是個研究生課程,比較難。普通人需要掌握凸問題更好求解,非凸不好求解。因此列數學公式描述業務問題時,儘量避免非凸的情況。比如儘量是線性的關係。多次的關係很容易出現非凸的情況。

3.3 更豐富的最佳化問題型別列表

更進一步的,最佳化問題的數學模型根據不同的業務有很複雜的模型。
基本就是要掌握好:可以控制的變數、業務約束、最佳化目標的情況。
不同的數學模型適合不同的場景,在最佳化問題計算的時候,也會有不同的複雜度。
常見的最佳化問題型別會以下的詞彙來描述:
什麼是最佳化技術?給演算法小白同學的快速講解和上手文 | 什麼是最佳化技術?給演算法小白同學的快速講解和上手文
看到這麼多名詞,也不需要焦慮,他們都有對應的命名規則,方便與其他演算法同學溝通用的。
如果溝通不明白,可以貼一個數學公式出來也很方便。數學公式手寫也是可以的!
命名規則比如:

  • 線性規劃,英文是Linear Programming,簡稱LP,對應的數學目標函式是線性關係;

  • 如果加上變數有些是整數(integer),則組合成MILP(Mixed Integer Programming),混合整數的線性規劃問題;

  • 如果目標裡面有二次項,則稱為二次規劃 QP(Quadratic Programming);

  • 如果約束裡面有二次項,則稱為二次約束規劃 QC (Quadratic Constraint),組合還有QCQP;

  • 再進一步的根據目標約束的型別,還可以進一步分類描述不同型別的問題,很多種;

  • 再進一步,根據問題的最佳化計算方式,還可以取名字,比如零階最佳化、黑盒最佳化、梯度下降、無梯度最佳化等;

類目很多,可遇到了後再查詢標準術語,用於跨人溝通。

四、最佳化問題的應用

最佳化問題在管理運籌、工業工程、經濟學、物流、能源、金融等許多領域都有。最佳化技術屬於底層的數學技術,應用面很廣。
對應求解最佳化問題的最佳化求解器,可以廣泛應用於電力系統排程、生產計劃、物流路徑規劃、投資組合最佳化等多個領域。
使用最佳化求解器可以幫助使用者更方便、更快速地找到問題的最優解。
推薦可以去阿里達摩院求解器的案例廣場 看看,瞭解應用場景,和對應的簡單的數學模型、原始碼。比如:

倉庫選址規劃
什麼是最佳化技術?給演算法小白同學的快速講解和上手文
虛擬電廠的智慧排程
什麼是最佳化技術?給演算法小白同學的快速講解和上手文
網路流問題:交通排程、倉儲運輸
什麼是最佳化技術?給演算法小白同學的快速講解和上手文
人員排班問題
什麼是最佳化技術?給演算法小白同學的快速講解和上手文
數獨問題的求解
什麼是最佳化技術?給演算法小白同學的快速講解和上手文
廣告流量分配:曝光與轉換均衡
什麼是最佳化技術?給演算法小白同學的快速講解和上手文

五、最佳化問題的求解計算

5.1 計算方法

最佳化問題的求解方法有:單純形法、內點法、分枝定界法、梯度下降法、遺傳演算法等。在大學的運籌學課程裡,一般會教求解線性規劃(LP)需要的單純形法,和求解帶整數的線性規劃(MILP)的分支定界法。
但是,在實際業務裡,開發者不太需要關心求解的方法,大都是藉助工具來完成計算。
更多的需求是:需要了解不同演算法計算的複雜度,是否能快速求解,如果不能,如何變更最佳化問題數學模型,使得能快速求解。
建議:求解方法這個知識點,僅作科普瞭解,更多地去準確描述好自己的最佳化問題是什麼型別的問題,然後熟悉求解最佳化問題的工具,瞭解工具是否適合計算自己的最佳化問題。比如現在我們並不需要關心計算機是透過什麼原理算出來了3+5=8,更多地去了解如何使用它。但是如果您剛好是這類計算工具的開發者,就需要查詢相關的資料來學習。
在選擇或者研究求解器時,一般會評估如下特性:

- 是否能求解

- 求解速度

- 穩定性

- 大規模問題求解能力和計算資源佔用

- 介面易用性
開源的求解器和商用的求解器的差異主要是:求解速度、可求解問題的型別。速度差異可能有幾百倍。
對於響應速度要求高的場景,通常就是能用和不能用的區別,導致很多場景沒有上最佳化技術。
在很多限時要求高的場景,比如網際網路、機器人的行業,建議直接用商用求解器(有的廠商提供免費版,比如阿里的求解器 MindOpt),直接體驗高速版本驗證方案效果。畢竟研發方案期間最耗時的是業務的數學建模,不要因為用錯計算工具浪費太多時間浪費方案。就相當於,開發一個方案的一開始,先上一個高效能的電腦試試可行性,後面確認可行後,再研究怎麼換晶片降成本。
小編這裡推薦去MindOpt的平臺去看商用的和開源的求解器軟體,從這個案例  ,複製專案進去嘗試。全程瀏覽器裡面操作,不需要操心軟體安裝和License。

5.2 有哪些軟體可選?

可以選阿里的 MindOpt 。
或者用MindOpt APL建模語言,能一行指令切換求解器,方便對比測試。
依然給大家列一下更豐富的資訊,供調研可用求解器。

國際上

國際上的最佳化軟體起步很早,可以追溯到上世紀80年代。特別是商用的軟體,積累了很多客戶的經驗,軟體更穩定;且很少有研發的方案洩露出來,技術保密的很好,效能領先。
國際上的最佳化求解器:(僅列出常見的、且有軟體獲取地址的)

  • CPLEX:美國/IBM。網址: IBM的老牌產品,歷史悠久,企業使用者多。現在研發團隊維護少了,對於時效要求高的場景可能不支援。

  • Gurobi:美國/Gurobi。網址:。當前世界頂尖的求解器,部分成員曾任職CPLEX,MILP的效能國際第一。費用比較貴,大約幾十萬/1年/1併發。

  • Xpress:加拿大/FICO。網址:

  • Mosek:丹麥/Mosek。網址:

  • LocalSolver:法國/LocalSolver。網址:

  • LINGO:美國/LINDO。網址:

  • COIN-OR:開源組織,收錄了很多種不同的開源求解器。網址:

  • SCIP:開源的求解器。網址:

  • GLPK:開源的求解器。網址:

國產的:MindOpt,阿里的求解器

從15年後,國內多個團隊開始逐步開始研發求解器模組。並且在19年20年,有商業公司的加入,研發的軟體更穩定。
國內的最佳化求解器:(僅列出有軟體可供下載使用的公司)

  • MindOpt:中國/阿里達摩院。

    • 當前支援:

    • LP、MILP、CQP、SDP這些數學規劃求解。可下載使用。網址: 。根據網頁指引,直接在阿里雲產品平臺https://help.aliyun.com/document_detail/298275.html 下載軟體和獲取免費License。

    • 模擬最佳化 (零階最佳化、黑盒最佳化,可用於調參),未公開下載,需要聯絡 @有悠。

    • 新手推薦用MindOpt線上的平臺,不需要安裝直接先學會使用,Notebook中直接碼程式碼,上手學習更快捷。還有自研的代數建模語言、以及AI技術結合開發、大模型技術結合自動建模和碼程式碼的方案,更貼合現代的AI+運籌結合的技術趨勢。

  • COPT:中國/杉數。網址: 。根據頁面指引填寫資訊申請安裝包和License。國內研發的早的公司,求解效果不錯。

    • 這個功能和阿里的求解器MindOpt差異不大,目前主要優勢是數學規劃的求解能力全一些。可以提需求給MindOpt研發團隊做針對性調優。

    • 而且,用MindOpt APL建模語言程式設計,是可以輕鬆一行程式碼就換呼叫COPT的!不用糾結一開始選誰家的。

來秀一下MindOpt 實際的應用的評測,給廣大用MindOpt求解器的友友們增加點信心:

電力能源領域,這個問題規模非常大,海外求解器已經搞不定的行業。
MindOpt透過專案合作定製調優,整體最優。友商結果並沒有我們優秀。

什麼是最佳化技術?給演算法小白同學的快速講解和上手文
資料說明:有9/10的資料都是MindOpt第一,超過商用求解器,遠超越開源的求解器。
而且MindOpt主打就是一個聽勸,非常珍惜使用者的反饋,並且儘快實現:
什麼是最佳化技術?給演算法小白同學的快速講解和上手文

5.3 其他求解方法

除了上面講的通用的最佳化求解軟體外,還有很多特定行業的啟發式的求解方法,可以更快獲得對應解。
多數需要啟發式求解的場景,是通用求解器無法快速求解的領域。比如帶整數的最佳化問題。
啟發式(Heuristic)演算法的主要思想是模擬人類或者自然界的智慧和經驗來尋找最優解或區域性最優解。
常見的啟發式方法有:遺傳演算法、粒子群演算法、魚群、蟻群演算法等。在計算複雜的富含整數變數的最佳化問題裡,如組合最佳化、路徑規劃、生產排程、排隊論等場景驗證有很好的結果。
使用啟發式演算法的時候,需要根據實際問題來選擇,要關注引數和隨機性帶來的影響。
MindOpt Tuner調參器可以用於系統調參,透過根據輸入到評價輸出的探索,一步步迭代出更優的引數組合。可以聯絡MindOpt團隊試用調參器的高階用法。

六、最佳化技術使用難點、推薦上手方案

求解環節,是目前有通用求解軟體去進行可複製產品化的。
但是在用最佳化技術的應用裡,有比較長的時間是在做其他的工作,如梳理問題、蒐集資料、數學建模、除錯。
每個地方都會形成耗時難點、專家經驗。運籌最佳化工程師的從業者一般都是研究生。在和客戶聊需求的時候,需要能引匯出可實現的方向,去理清楚需求。非常的耗時和繁瑣。且還會有的時候到最後發現不需要最佳化技術,直接規則硬計算(這個過程可以理解為是數學公式的一種變化)。
這也是用最佳化技術的付費使用者,大部分是能源、航空、餐飲巨頭、金融這些有錢大客戶的原因。
有用,但普通企業用不起。
MindOpt 團隊在逐步把這個成本打下來!
在初期,如果不清楚怎麼用,可以去試一下 MindOpt新發布的基於大模型的“AI工程師”MindOpt Copilot /chat ,MindOpt 團隊在大語言模型LLM基礎上進行了SFT訓練,使得大模型具備了數學建模的能力,並且轉換成了可執行的程式碼(得益於去年自研了MindOpt APL),業界創新、首個釋出公開使用!正確率也是目前所知的業界第一!
這款聊天機器人在“最佳化”這個細分小領域,水平差不多達到高中生到大學生的樣子。我們可以把前面的簡單的模板工作,交給機器人來做,然後快速生成個專案,非常簡單就上手開始開發了!
什麼是最佳化技術?給演算法小白同學的快速講解和上手文
什麼是最佳化技術?給演算法小白同學的快速講解和上手文
推薦的使用技巧:
什麼是最佳化技術?給演算法小白同學的快速講解和上手文
比如下面影片的操作方式,快速啟動一個最佳化專案研發,捋清楚數學建模和初步的方案嘗試:
等有了數學建模的感覺、以及蒐集好了資料後,我們可以再根據需求,看是要週期性排程軟體上線、還是一次性使用的需求,制定對應的編程式碼的方案。運籌類專案開發的第一步不再困難!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2996989/,如需轉載,請註明出處,否則將追究法律責任。

相關文章