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

謝謝。

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


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


如需了解更多關于Optaplanner的應用,請發電郵致:kentbill@gmail.com
或到討論組發表你的意見:https://groups.google.com/forum/#!forum/optaplanner-cn
若有需要可添加本人微信(13631823503)或QQ(12977379)實時溝通,但因本人日常工作繁忙,通過微信,QQ等工具可能無法深入溝通,較復雜的問題,建議以郵件或討論組方式提出。(討論組屬于google郵件列表,國內網絡可能較難訪問,需自行解決)

?

?

?End.

?

?

?

?

?

轉載于:https://www.cnblogs.com/kentzhang/p/8431011.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250620.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250620.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250620.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

es6 --- 使用proxy對數據進行劫持

說明: 數據劫持,簡單的說就是在對數據進行操作(增刪改查)時,觸發的函數下面想通過使用以下的形式來使用: let proxy reactive({ name:lz }); proxy.name; // 獲取 proxy.name 栗子; // 設置 delete proxy.name; // 刪除解決方案: proxy函數的2個參數第一個參數: 接收一…

Java8-如何構建一個Stream

Stream的創建方式有很多種&#xff0c;除了最常見的集合創建&#xff0c;還有其他幾種方式。 List轉Stream List繼承自Collection接口&#xff0c;而Collection提供了stream()方法。 List<Integer> list Lists.newArrayList(1, 2, 3); Stream<Integer> stream li…

軟件產品案例分析

軟件產品案例分析 第一部分&#xff1a; 評測&#xff1a; 上手體驗&#xff1a; 說實話&#xff0c;在老師布置這個作業之前我確實不知道有K米這個APP&#xff0c;我想這是很少去KTV的原因吧。。。不過在接到這個作業后&#xff0c;我就去百度了普及了一下這個app的相關知識。…

java/android 做題中整理的碎片小貼士(12)

1、edittext中設置最長字數&#xff0c;可在xml中加入android:maxLength"10"&#xff0c;可在java代碼中加入editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(20)}); 2、edittext監聽軟鍵盤delete按鍵&#xff1a; Et.setOnKeyListener(new Vi…

POJ2777(線段樹裸題)

題目&#xff1a;http://poj.org/problem?id2777 別忘了各地的return&#xff1b; 有可能輸入的L<R&#xff0c;手動swap&#xff1b; 似乎是多組輸入&#xff1f; pushup和pushdown的位置。 &#xff08;原來pushup只有一行&#xff09; 要開四倍數組。是這種寫法的原因吧…

vue --- 2.0 編譯的實現

初識 假設html中有如下dom: <div id"app"><!-- 插值綁定 --><p>{{name}}</p><!-- 指令解析 --><p l-text"name"></p><p>{{age}}</p><p>{{doubleAge}}</p><!-- 雙向綁定實現 -->…

個人作業收官——軟件工程實踐總結

一、回望與展望 1.1 對比現在和開學初博客開篇的課程目標和期待 當初的目標&#xff1a; 提升團隊合作的能力能夠學習到開發的一系列流程&#xff0c;以及如何寫高質量的代碼加強自己的編碼能力&#xff0c;以及編碼習慣熟悉不同平臺的開發過程 如今&#xff1a; 基本的目標都…

sklearn中SVM調參說明

寫在前面 之前只停留在理論上&#xff0c;沒有實際沉下心去調參&#xff0c;實際去做了后&#xff0c;發現調參是個大工程&#xff08;玄學&#xff09;。于是這篇來總結一下sklearn中svm的參數說明以及調參經驗。方便以后查詢和回憶。 常用核函數 1.linear核函數: K(xi,xj)xTi…

TZOJ 3030 Courses(二分圖匹配)

描述 Consider a group of N students and P courses. Each student visits zero, one or more than one courses. Your task is to determine whether it is possible to form a committee of exactly P students that satisfies simultaneously the conditions: every stude…

vue --- configureWebpack模擬后臺數據

初識 使用vue/cli搭建的項目可以在vue.config.js中,模擬一個后臺(express寫法)vue.config.js configureWebpack: {devServer: {// 模擬后臺服務器 express寫法before(app) {app.get(/api/login, function(req, res) {const { username, passwd } req.query;console.log(user…

TCP和UDP的優缺點及區別

轉自&#xff1a;http://www.cnblogs.com/xiaomayizoe/p/5258754.html TCP的優點&#xff1a; 可靠&#xff0c;穩定 TCP的可靠體現在TCP在傳遞數據之前&#xff0c;會有三次握手來建立連接&#xff0c;而且在數據傳遞時&#xff0c;有確認、窗口、重傳、擁塞控制機制&#xff…

e.getMessage 為空NULL

e.getMessage 為空NULL 在日常代碼中免不了要try catch 切忌用try catch 去try 整個方法。 在對象操作之前盡量寫上if 空判斷。 反例&#xff1a; public void send(){ try{ 代碼1&#xff1a;獲取對象 代碼2&#xff1a;操作代碼1 代碼3&#xff1a;操作代碼2 代碼4&#xff1…

Linux:客戶端的實現

寫了一個簡單的服務器軟件&#xff0c;但是沒有寫客戶端。現在我將客戶端實現了&#xff0c;其實昨天已經說了客戶端的實現步驟了。 步驟&#xff1a; socket() 初始化 connet()鏈接 從標準輸入讀數據fgets() 傳數據到服務器write() 讀從服務器返回的數據read() 寫數據到屏幕上…

vue --- http攔截,登錄登出的邏輯設計

設計 在src目錄下創建一個interceptor.js登錄邏輯 設置攔截,在發起請求前,先判斷用戶是否登錄(在本栗中,即是否能夠在瀏覽器緩存中找到token). 登出邏輯 對服務端傳過來的數據進行攔截,判斷其狀態碼是否為401(未登錄或token過期)清空瀏覽器緩存中的token重定向到登入頁面 inte…

循環分支循環語句

# 三大結構 - 循環 - 分支 - 循環 . . .In [ ]:# 分支 - 分支的基本語法 - if 條件表達式&#xff1a; 語句1 語句2 語句3 ..... - 條件表達式就是計算結果必須是布爾值的表達式 - 表達式后面的冒號覺對不能少 - 注意 if 后面出現的語句&#xff0c;如果屬于 if 語句塊&…

HTTP 1.1與HTTP 1.0的比較

HTTP 1.1與HTTP 1.0的比較 一個WEB站點每天可能要接收到上百萬的用戶請求&#xff0c;為了提高系統的效率&#xff0c;HTTP 1.0規定瀏覽器與服務器只保持短暫的連接&#xff0c;瀏覽器的每次請求都需要與服務器建立一個TCP連接&#xff0c;服務器完成請求處理后立即斷開TCP連接…

vue --- 前端代理發送http請求

后端 端口在3000使用jsonwebtoken和koa-jwt生成令牌并返回對’/api/userinfo’端口,先驗證令牌是否通過,若通過返回數據 const Koa require(koa); const Router require(koa-router); // 生成令牌、驗證令牌 const jwt require(jsonwebtoken); const jwtAuth require(koa…

python全棧開發-json和pickle模塊(數據的序列化)

一、什么是序列化&#xff1f; 我們把對象(變量)從內存中變成可存儲或傳輸的過程稱之為序列化&#xff0c;在Python中叫pickling&#xff0c;在其他語言中也被稱之為serialization&#xff0c;marshalling&#xff0c;flattening等等&#xff0c;都是一個意思。 為什么要序列化…

Gale-Shapley---婚姻匹配算法算法

原文鏈接&#xff1a;http://blog.csdn.net/cscmaker/article/details/8291131 &#xff08;一&#xff09;問題的引出&#xff1a; 有N男N女&#xff0c;每個人都按照他對異性的喜歡程度排名。現在需要寫出一個算法安排這N個男的、N個女的結婚&#xff0c;要求兩個人的婚姻應該…