OptaPlanner - 把example運行起來(運行並淺析Cloud balancing)
來自專欄 APS-高級計劃與排程
經過上面篇長篇大論的理論之後,在開始講解Optaplanner相關基本概念及用法之前,我們先把他們提供的示例運行起來,好先讓大家看看它是如何工作的。OptaPlanner的優點不僅僅是提供詳細豐富的文檔 ,還為各種應用場景提供豐富的示例,它的文檔里都是以幾個簡單經典的例子來說名各種功能特徵和深層次概念的,例如Solver, Phase及Move等,以下我們就先把這些示例運行起來,先看看整體的情況,下一往篇我們再把示例的源碼導進Eclipse,拿一個簡單經典的示例,講解一下Optaplanner規劃引擎工作時需要哪些要素,它是如何工作的。
1.下載:
首先得把示例下載回來,大家到Optaplanner的官網就可以看到一個綠色的按鈕(見下圖),點擊它就可以下載了。它的版本更新非常快,我們就基於7.6.0Final進行講解。
2. 解壓:
下載回來的壓縮包「optaplanner-distribution-7.6.0.Final.zip」包含了Optaplanner的源碼、各種包(引擎自己的核心包及其依賴包)、說明文件和示例及其源碼。其中示例包括兩個版本,一個是基礎Swing的,也就是Java的Windows程序;另一個是基於Web的,以War包提供,需要自己部署Tomcat等App伺服器來運行。我們著重討論Swing版本的,因為它不需要我們部署App伺服器。如果以後大家有需要,我可以另寫一篇專門部署Web版本示例的文章詳細講解。打開壓縮包,裡面的文件夾結構如下圖:
3. 試運行示例:
因為壓縮包中除了提供源碼,還提供了已編譯的包,只要在你系統中安裝好Java環境,就可以運行起來,先看個究竟了。ps:java要1.8以上。
- 3.1: 解壓示例文件:
你會看到一個包文件夾(binaries),一個源碼文件夾(sources),一個windows批處理命令文件(runExamples.bat)和一個Linux下運行示例的Shell文件 (runExamples.sh). 因為我是在Windows環境下運行的,所以把binaries和runExamples.bat解壓出來放在同一文件夾即可,examples子文件夾中的目錄結構如下圖。
- 3.2 運行示例:
如果windows下使用cmd不太熟悉的話,就按我下面的步驟操作.完成之後就可以看到它示例的真容了。示常式序是基於Swing做的,理論上通過裡面的批處理文件就可以運行起來,其實裡面就是一些運行jar包的命令,只不過它會有更多的功能,例如檢查當前系統的JRE等等。不過中間有點小插曲,我使用7.6.0的示例運行的時候,它報了一個slf4j找不到的異常,應該是一個日誌組件缺少了,我要看看它這個版本的更新記錄,看是否有相關的提示,否則我得聯繫一下他們項目組的人才行。後來我用7.5.0Final的示例可以正常運行起來了。
7.5.0版本提供了18個示例,已經 包含了幾乎所有Optaplanner規劃引擎具有的特性及應用模式。但其實在他們的Github中提供了更多的示例,有興趣的同學可以關注一下Github上optaplanner項目的leader Geoffrey De Smit,他現在是Optaplanner項目的頭兒,也是Optaplanner的作者,10多年前他開發了Optaplanner,前些年他把它貢獻給了JBoss開源社區,任這個項目的頭兒。我在使用Optaplanner做項目的時候,他們的討論組上向他提過一些問題,他為人相當nice且有耐心,給我解答了不少問題。
- 3.3 運行示例:
我們選擇一個比較經典的Cloud balancing示例運行一下看看。
先說明一下這個示例,這個示例是模擬在雲端進行進程管理(或稱進程調度,或稱任務調度吧),也就是進程分配到不同的計算資源(也就是計算機)的方案,演示Optaplanner規劃引擎是如何在保證每個進程都滿足運行要求的情況下,以最節省成本的方式分配計算機資源的。
示例中有兩個主要實體概念 - 進程(Process,下面跟著官方文檔稱Process吧, 可以理解為我們的程序,或任務)和Computer(也就是我們理解的計算機、伺服器了)。每個Process有CPU速度,內存大小和網路帶寬三大要求。對應地,每台Computer也有一個固定的參數,表明該Computer可提供的CPU速度、內存大小和帶寬;Computer另外還有一個屬性就是成本。也就是這台電腦一但被使用了,就需要花費成本去維護。這個示例的目標是:給出一些Process和一些Computer,Optaplanner規劃引擎在對這些實體進行對比運算,將所有Process分配到指定的一台Computer, 這個分配方案有兩個要求:
1.硬性要求: Process所分配到的Computer必然滿足CPU,內存和帶寬三大要求要求。ps:當多個Process被分配到同一個Computer時,它的CPU,內存和帶寬資源佔用是累加的,也就是說,當台Computer只有2G內存,若已經有一個內存需求是1G的Process被分配在它上面,那後面可以再分配給它的Process,其內存要求必然是1G以下的,因為這進修這台Computer還只剩下1G內存了,CPU和帶寬也是同樣的分配規則。
2. 軟性要求:任何一台Computer一旦有任務分配進去,即表示該Computer被佔用,需計算這台Computer的成本。Optaplanner規劃引擎需要找找出一個方案,在滿足了第1點的硬性要求的前提下,令到這所有被佔用的Computer的成本加起來盡量小(為什麼不能說最小呢?因為這是一個NPC問題,不一定可以找到成本最小的,也就是 說不一定能找到最佳方案的,詳情參考本系列文章中,關於規則問題與NP, NPC問題的篇章).
下圖是我進入這個示例後,選擇了9個Processes分配到3台Computers上的示例。Optaplanner的示常式序都提供這些示例的相關數據,只要選擇就可以了,所以還是比較貼心的,但我們自己做項目過程中,去生成、處理這些數據的工作量,就點了系統的不少比例了。
- 3.4. 運行並解讀示例:
點擊頂端的Solve按鈕,引擎就開始工作,它會不斷嘗試不同的組合方案(這是一個非常複雜的過程,涉及到中種搜索演算法Tabu,模擬退火等),找到既滿足Process對CPU、內存和帶寬的要求,且所使用的所有Computer中,成本加起來盡量小。下面就是運行了一段時間之後,9個Process分配到了兩個Computer的情況。所得的方案的好壞,是通過評分來實現的,關於評分,可以查看後面Optaplanner規劃引擎關於分數方面的文章。
好了,到目前為止我們已經初成功能運行起了它的示例,大家也可以嘗試一下其它示例,各個示例的背景,可以到Optaplanner官網關於示例的章節中查看。我在後面的文章中,也會找幾個具代表性的示例進行翻譯。
在下一篇,我們就要用這個示例的源碼生成Eclipse中項目,好讓大家可以更深入具體了解Optaplanner的實現。
謝謝。
原創不易,如果覺得文章對你有幫助,歡迎點贊、評論。文章有疏漏之處,歡迎批評指正。
歡迎轉載,轉載請註明原文鏈接:http://www.cnblogs.com/kentzhang/articles/8431011.html
End.
www.optaplanner.org推薦閱讀:
※《微服務設計》閱讀筆記(五)分解單塊系統
※並行模式庫PPL應用實戰(一):使用task類創建並行任務
※吉祥雞理財系統開發
※軟體開發的誤區
※哈希演算法集合類庫HashLib