1. 程式人生 > >OptaPlanner - 把example執行起來(執行並淺析Cloud balancing)

OptaPlanner - 把example執行起來(執行並淺析Cloud balancing)

       經過上面篇長篇大論的理論之後,在開始講解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的實現。

謝謝。

 End.

創作不易,請尊重他人艱辛勞動;歡迎註明出處的轉換。

本文在部落格園,CSDN, 阿里雲社群,知乎,簡書上均有釋出。


本系列文章在公眾號不定時連載,請關注公眾號(讓APS成為可能)及時接收,二維碼:

如需瞭解更多關於Optaplanner的應用,請發電郵致:[email protected]

或到討論組發表你的意見:https://groups.google.com/forum/#!forum/optaplanner-cn

若有需要可新增本人微信(13631823503)或QQ(12977379)實時溝通,但因本人日常工作繁忙,通過微信,QQ等工具可能無法深入溝通,較複雜的問題,建議以郵件或討論組方式提出。(討論組屬於google郵件列表,國內網路可能較難訪問,需自行解決)