我已經使用OptaPlanner 6.2實現了一個傳感器調度問題,它有1個硬約束,1箇中等約束和1個軟約束。我遇到的麻煩是要麼在30秒左右之後能夠滿足一些困難的約束,然後求解器在滿足約束的情況下幾乎沒有進展,並需要額外的幾分鐘終止。我認爲這個問題沒有過度束縛,我也不知道如何幫助本地搜索過程顯着提高分數。難以滿足與Optaplanner同時硬和中等約束條件
我的問題是一個調度問題,其中我預先計算了傳感器在解決問題之前可以觀察對象的所有可能時間(間隔)。無間隔可以重疊
when
$s1: A(interval!=null,$id: id, $doy : interval.doy, $interval: interval, $sensor: interval.getSensor())
exists A(id > $id, interval!=null, $interval2: interval, $interval2.getSensor() == $sensor, $interval2.getDoy() == $doy, $interval.getStartSlot() <= $interval2.getEndSlot(), $interval.getEndSlot() >= $interval2.getStartSlot())
then
scoreHolder.addHardConstraintMatch(kcontext,-10000);
中約束 - - 每個任務應該有一個時間間隔
when
A(interval==null)
then
scoreHolder.addMediumConstraintMatch(kcontext,-100);
軟約束
硬約束:我如下建模的問題 - 最大化Interval類別中的特性/值
A:實體規劃類;
答:實體規劃類;每個實例都是對特定對象的賦值(即具有與Interval類中的對象相對應的成員objectid)
時間間隔:計劃變量類,傳感器和對象的所有可能間隔(開始時間,停止時間)
在A中,我將對B實例(間隔)的訪問限制爲與那個賦值關聯的對象的訪問。對於我的測試案例,有40000左右的間隔,但每個對象只有幾十個。 A有大約1100個實例(每個實例有數十個可能的間隔)。
@PlanningVariable(valueRangeProviderRefs = {"intervalRange"},strengthComparatorClass = IntervalStrengthComparator.class, nullable=true)
public Interval getInterval() {
return interval;
}
@ValueRangeProvider(id = "intervalRange")
public List<Interval> getPossibleIntervalList() {
return task.getAvailableIntervals();
}
在我的解決方案類: //已經嘗試評論了這一點,因爲整個間隔列表並不適用於所有的A @ValueRangeProvider(ID = 「intervalRangeAll」) 公開名單getIntervalList(){ 回報間隔; }
@PlanningEntityCollectionProperty
public List<A> getAList() {
return AList;
}
我已閱讀文檔並嘗試了很多東西。我的問題在於我看過的護士和課程安排示例之間的交叉。我正在使用FIRST_FIT_DECREASING構造啓發式。
我曾嘗試:
- 打開和關閉可爲空在規劃變量註釋爲A.getInterval()
- 後期驗收,禁忌,無論是。
- 標杆管理。我沒有看到任何問題和平均值
- 將一個IntervalChangeFactory添加爲moveListFactory。將自定義ChangeMove限制爲是否可以接受時間間隔(即強制執行或不執行IntervalChangeMove.isDoable中的嚴格約束)。
下面是一個例子之一,這裏大部分的硬約束都不滿意,但中期的有:
[main] INFO org.optaplanner.core.impl.solver.DefaultSolver - Solving started: time spent (202), best score (0hard/-112500medium/0soft), environment mode (REPRODUCIBLE), random (WELL44497B with seed 987654321).
[main] INFO org.optaplanner.core.impl.constructionheuristic.DefaultConstructionHeuristicPhase - Construction Heuristic phase (0) ended: step total (1125), time spent (2296), best score (-9100000hard/0medium/-72608soft).
[main] INFO org.optaplanner.core.impl.localsearch.DefaultLocalSearchPhase - Local Search phase (1) ended: step total (92507), time spent (30000), best score (-8850000hard/0medium/-74721soft).
[main] INFO org.optaplanner.core.impl.solver.DefaultSolver - Solving ended: time spent (30000), best score (-8850000hard/0medium/-74721soft), average calculate count per second (5643), environment mode (REPRODUCIBLE).
所以我不明白的是爲什麼硬約束不能通過搜索過程處理。由於我所做的所有修改,我每秒鐘的計算次數已降至10000以下。
請參閱文檔中的「分數陷阱」:硬約束可能應該懲罰重疊時間,而不是固定的權重(無論它們是重疊還是重疊)。 –
我將硬約束懲罰更改爲-10,這沒有什麼區別。也許我誤解了你的意思,「懲罰重疊的時間,而不是固定的權重」。在文檔中描述的3種方式中,我已經在做第一種。我嘗試了第二種方法,將重疊懲罰約束規則用作媒介,然後使用軟約束(同時保持難度),這沒有什麼不同。第三種方式更多參與,但除非您有其他建議,否則我會看一看。 –
將其更改爲-10仍然使其成爲固定重量,無論重疊多少時間。不知道我如何改進文檔。 IIRC的一個培訓郵編實驗室處理這個問題,請參閱optaplanner.org - >學習 - >培訓。 –