【譯】Optaplanner開發手冊本地化: (0) - 前言及概念

  在此以前,針對APS寫了一些理論性的文章;而對於Optaplanner也寫了一些介紹性質,幾少許入門級的幫助初學者走近Optaplanner。在此之後,老農將會按照Optaplanner官方的用戶手冊的結構,按章節地對其進行翻譯,併成型一系列的操做說明文章。在文章中,爲了下降對原文的理解難度,有些地方我不會直接按原文檔的字面翻譯,而是有可能加入一些我本身的理解,或添一些解釋性的內容。畢竟英語環境下的思惟和語言表達方式,跟中文或多或少會有差異的,因此若是所有按字面翻譯,內容就很是生硬,可讀性差,解程難度較大。我認爲應該在理解了做者原意的基礎上,再進一步以中文方式的表達,纔算是真的的本地化。記得老農仍是少農時,學習開發技術,須要閱讀一些外國書箱的翻譯本時,印象最深的是候捷老師的書,儘管《深刻淺出MFC》,磚頭厚度的書,硬是被我翻散了線,MFC儘管真的晦澀難懂,但候老卻能把Windows的消息機制及MFC中整個個宏體系,系統地通俗地描述出來,令讀者不須要花費太多精力去理解猜想書中字面的意義,大大下降的VC++中MFC的學習門檻。但老農畢竟只是一個一線開發人員,不是專業的技術資料翻譯人才,不可能有候老師的專業水平,所以,我也只可盡我所能把內容儘可能描述得通俗一些,讓讀者儘可能容易理解,花費更少的時間掌握這些知道要點。html

本文以Optaplanner 7.10.0 Final版本的開發手冊做爲基礎進行翻譯。程序員

1. Optapplanner 介紹

1.1. 什麼是Optaplanner?

   每一個組織都須要面對規劃、排程問題:在有限的資源約束下提供服務與產品(例如人員,資產,時間及資本等限制)。Optaplanner能夠優化這類規劃、排程問題,令到使用它的組織能夠用更少的資源作更多的事(儘量的花少錢辦大事)。這就是著名的的約束知足規劃,它屬於運籌學的一部分。算法

Optaplanner是一個輕量的、可嵌入的,能夠對規劃問題進行優化的約束知足引擎,它能夠解決案例有:微信

  • 員工排班:爲護士、維修工等人員制定上班時間表。
  • 方程安排:安排會議、約見、維修工做、廣告時間等。
  • 教育領域的時間安排:安排課程、課堂、考試、會議講座等。
  • 規劃車輛運動路線:經過已知的地圖工具,爲貨運、客運(貨車、火車、輪船、航班等)規劃交通工具多目標的運行路線。
  • 裝箱問題:向容器、貨車、輪船和倉庫裝載貨物,同時能夠規劃電腦的資源加載利用,例如雲計算的資源分配問題。
  • 車間生產安排:規劃汽車組裝生產線,機器隊規劃,勞動任務的規則等。
  • 下料問題:在下料分割的時候,實量最小的浪費,例如切割紙張、鋼鐵、地毯等。
  • 運動賽事安排:規劃比賽和訓練,例如安排足球聯賽、棒球聯賽等。
  • 金融優化:投資組合優化、實現風險分散等。

1.2. 什麼是規劃問題?

 一個規劃問題,基於有限的資源和指定的約束,有一個優化目標。優化目標能夠是多種事物,例如:網絡

  • 利潤最大化 - 優化目標得出的結果是盡能夠高的利潤。
  • 最小化生態足跡(即儘量減小對生態的影響) - 優化目標是對環境產生儘量小的影響。
  • 最大化員工或客戶的知足度 - 優化目標重視員工與客戶的須要。

實現這些目標的能力依賴於可用資料的數量,例如:app

  • 人員數量
  • 時間
  • 預算
  • 特殊資產,例如機臺,車輛,計算機,建築物等。

與這此資源相關的約束也必然計算在內,例如,一我的的工做小時數, 他們可以使用(操做)的機臺數量,設備之間的兼容性等。less

Optaplanner能夠幫助Java程序員有效地解決約束知足問題, 在Optaplanner引擎中,對每一個有效的約束分數計算中,組合了啓發式和元啓發式算法。 ide

 1.2.1 規劃問題屬於NP-Complete問題或NP-hard問題

  上述全部的案例或許都屬於NP-complete/NP-hard問題,(什麼是NP-Complete/NP-hard問題呢?),在外行人看來,它的定義是:函數

  對於一個問題:工具

  • 在合理時間內能夠容易地驗證一個給定的解。
  • 在合理時間內,目前尚沒有行之有效的解法,能找到其絕對最優解(注1)。

  (注1):至少,到目前爲止,仍未有一個世界上最聰明的計算機科學家能找到此方法。但是一旦他們找到對其中一個NP-Complete問題的有效解法,那麼這個方法對全部NP-Complete問題都是可行辦法。事實上,若是任何人只需證實是這種解法的存在與否,便可得到100萬美圓的獎勵。

  其實這其含義是至關悲觀的:要解決這些問題或許比你預想中更困難,由於目前針對這種問題的常見兩種技術是未足夠解決此類問題的。這兩種方法是:

  • 暴力算法(儘管是一些優化過,相對聰明的暴力算法變種), 但得到其解所需的時間很是長(譯者:主要緣由是時間複雜度很是高)。
  • 快速算法,例如在Bin packing問題中,先裝入最大項;但獲得的解離絕對最優解仍存在至關大距離的。

經過使用一些更高級的算法,Optaplanner能夠在合理的時間內,對這些規劃問題找到相對較優解。

 

 1.2.2 規劃問題存在約束(包括硬約束與軟件約束)

  一般來講,一個規劃問題至少包括兩個層次的約束:

  • (負面)硬約束,不可被違反。例如:一個教師在同節的時間內不能同時上兩門課。
  • (負面)軟件約束,若可避免,它不該該被違反。例如:教師都不太喜歡在週五下午上課。

  也有些問題存在一些正面的約束:

  • 正面分數在可能狀況下應該實現。例如:教師B喜歡在週一上午上果。

  一些比較基礎的規劃問題(例如8王后問題),只存在硬約束;有一些規劃問題則存在超3層,甚至更多層次的約束。例如:硬約束,中間約束和軟約束。

  這些約束會被定義在規劃問題的Score calculation裏(也稱爲適應度函數)裏。規劃問題裏的每個解的優劣,均可以經過分數來評價。在Optaplanner中,分數約束是經過面向對象語文編寫的,例如Java代碼或經過Drools腳本實現的rules. 這些代碼至關容易編寫,靈活且易於擴展。

 1.2.3 規劃問題存在巨大的搜索空間

  一個規劃問題存在很是多的解,這些解能夠分爲如下數種:

  • 可能解:規劃問題的任意一個解都稱做可能解,不管這個解是否違反了約束,或違反了多少約束。規劃問題每每存在使人難以致今的巨量可能解,這裏面不少解是毫無價值的。
  • 可行解:規劃問題的可行解是指沒有違反任何(負面)硬約束的解。一個規劃問題的可行解的數量,與其可能解相關。有時也不存在可行解,一個規劃問題的每個可行解,都是該問題的一個可能解。
  • 絕對最優解:絕對最優解是這個規則問題得到約束分最高的那個解。規劃問題一般只有1個或少許數個絕對最優解。一般存在至少1個絕對最優解,儘管當這個規劃問題不存在可行解,它也存在絕對最優解,這時候絕對最優解就是非可行解。
  • 相對最優解:相對最優解是指規劃問題在必定的求解時間內獲得評分最高的解。相對最優解一般是可行解,只要有足夠的運行時間,找到的相對最優解就是絕對最優。

  此外,儘管基於一個較小的數據集描述的一個規劃問題,其可能解的數量一般是很是巨大的(若是計算正確的話)。正如你從示例中能夠看到,大多數狀況下,一個規劃問題的可能解數量,對目前已知宇宙的原子數量還要多(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郵件列表,國內網絡可能較難訪問,需自行解決)

相關文章
相關標籤/搜索