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的實現。

謝謝。

 

原創不易,如果覺得文章對你有幫助,歡迎點贊、評論。文章有疏漏之處,歡迎批評指正。

歡迎轉載,轉載請註明原文鏈接:http://www.cnblogs.com/kentzhang/articles/8431011.html 

 

如果對此,大家有何建議,歡迎大家加我企鵝一起探討:12977379或V信:13631823503

其實 Optaplanner不需要對Java過份精通即可使用,因爲它使用到的都是Java最基本的知道,但還是需要有基本的Java知識才行,希望大家找我研究討論時,如果Java, Maven等方面仍接觸較少,請大家先行自補該方面的知識,本猿暫時只能跟大家探討Optaplanner, Drools的應用,而Java相關的知識,恕無法提供有效的幫助,畢竟本猿也只是個Java新手。先謝了。

另外,若對此文(或本系列任何內容)感興趣,歡迎轉載,但請尊重艱辛勞動,註明出處。爲謝!

 End.

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章