在此以前,針對APS寫了一些理論性的文章;而對於Optaplanner也寫了一些介紹性質,幾少許入門級的幫助初學者走近Optaplanner。在此之後,老農將會按照Optaplanner官方的用戶手冊的結構,按章節地對其進行翻譯,併成型一系列的操做說明文章。在文章中,爲了下降對原文的理解難度,有些地方我不會直接按原文檔的字面翻譯,而是有可能加入一些我本身的理解,或添一些解釋性的內容。畢竟英語環境下的思惟和語言表達方式,跟中文或多或少會有差異的,因此若是所有按字面翻譯,內容就很是生硬,可讀性差,解程難度較大。我認爲應該在理解了做者原意的基礎上,再進一步以中文方式的表達,纔算是真的的本地化。記得老農仍是少農時,學習開發技術,須要閱讀一些外國書箱的翻譯本時,印象最深的是候捷老師的書,儘管《深刻淺出MFC》,磚頭厚度的書,硬是被我翻散了線,MFC儘管真的晦澀難懂,但候老卻能把Windows的消息機制及MFC中整個個宏體系,系統地通俗地描述出來,令讀者不須要花費太多精力去理解猜想書中字面的意義,大大下降的VC++中MFC的學習門檻。但老農畢竟只是一個一線開發人員,不是專業的技術資料翻譯人才,不可能有候老師的專業水平,所以,我也只可盡我所能把內容儘可能描述得通俗一些,讓讀者儘可能容易理解,花費更少的時間掌握這些知道要點。html
本文以Optaplanner 7.10.0 Final版本的開發手冊做爲基礎進行翻譯。程序員
每一個組織都須要面對規劃、排程問題:在有限的資源約束下提供服務與產品(例如人員,資產,時間及資本等限制)。Optaplanner能夠優化這類規劃、排程問題,令到使用它的組織能夠用更少的資源作更多的事(儘量的花少錢辦大事)。這就是著名的的約束知足規劃,它屬於運籌學的一部分。算法
Optaplanner是一個輕量的、可嵌入的,能夠對規劃問題進行優化的約束知足引擎,它能夠解決案例有:微信
一個規劃問題,基於有限的資源和指定的約束,有一個優化目標。優化目標能夠是多種事物,例如:網絡
實現這些目標的能力依賴於可用資料的數量,例如:app
與這此資源相關的約束也必然計算在內,例如,一我的的工做小時數, 他們可以使用(操做)的機臺數量,設備之間的兼容性等。less
Optaplanner能夠幫助Java程序員有效地解決約束知足問題, 在Optaplanner引擎中,對每一個有效的約束分數計算中,組合了啓發式和元啓發式算法。 ide
上述全部的案例或許都屬於NP-complete/NP-hard問題,(什麼是NP-Complete/NP-hard問題呢?),在外行人看來,它的定義是:函數
對於一個問題:工具
(注1):至少,到目前爲止,仍未有一個世界上最聰明的計算機科學家能找到此方法。但是一旦他們找到對其中一個NP-Complete問題的有效解法,那麼這個方法對全部NP-Complete問題都是可行辦法。事實上,若是任何人只需證實是這種解法的存在與否,便可得到100萬美圓的獎勵。
其實這其含義是至關悲觀的:要解決這些問題或許比你預想中更困難,由於目前針對這種問題的常見兩種技術是未足夠解決此類問題的。這兩種方法是:
經過使用一些更高級的算法,Optaplanner能夠在合理的時間內,對這些規劃問題找到相對較優解。
一般來講,一個規劃問題至少包括兩個層次的約束:
也有些問題存在一些正面的約束:
一些比較基礎的規劃問題(例如8王后問題),只存在硬約束;有一些規劃問題則存在超3層,甚至更多層次的約束。例如:硬約束,中間約束和軟約束。
這些約束會被定義在規劃問題的Score calculation裏(也稱爲適應度函數)裏。規劃問題裏的每個解的優劣,均可以經過分數來評價。在Optaplanner中,分數約束是經過面向對象語文編寫的,例如Java代碼或經過Drools腳本實現的rules. 這些代碼至關容易編寫,靈活且易於擴展。
一個規劃問題存在很是多的解,這些解能夠分爲如下數種:
此外,儘管基於一個較小的數據集描述的一個規劃問題,其可能解的數量一般是很是巨大的(若是計算正確的話)。正如你從示例中能夠看到,大多數狀況下,一個規劃問題的可能解數量,對目前已知宇宙的原子數量還要多(10的80次方)。由於目前尚未直接的辦法找出規劃問題的絕對最優解,一些求解實現方法是經過暴力窮舉的方法,至少能夠窮舉全部可能解中的一個子集。
OptaPlanner支持多種優化算法,以有效地涉足大量可能解,根據不一樣使用場景的狀況,一些優化算法的性能比其它算法更佳,但哪一個更佳是沒法預先告知的(譯者:須要經過Benchmark等功能測定)。在Optaplanner裏,很容易能過修改幾行XML內容或Java code,來更改求解器的配置,從而切換不一樣的優化算法。
【未完,待續...】
原創不易,若是以爲文章對你有幫助,歡迎點贊、評論。文章有疏漏之處,歡迎批評指正。
本系列文章在公衆號不定時連載,請關注公衆號(讓APS成爲可能)及時接收,二維碼:
如需瞭解更多關於Optaplanner的應用,請發電郵致:kentbill@gmail.com
或到討論組發表你的意見:https://groups.google.com/forum/#!forum/optaplanner-cn
如有須要可添加本人微信(13631823503)或QQ(12977379)實時溝通,但因本人平常工做繁忙,經過微信,QQ等工具可能沒法深刻溝通,較複雜的問題,建議以郵件或討論組方式提出。(討論組屬於google郵件列表,國內網絡可能較難訪問,需自行解決)