2016-03-28 55 views
1

有沒有辦法將建築啓發式的自定義移動? 我正在研究一個與optaplanner中的護士問題接近的項目,但除了僅將員工置於班次分配之外,我還需要將員工分配到班次中所需的小班。 所以當我把員工放在班次中時,我需要把員工放在他可以工作的所有小任務中(對他們有技巧)。我不希望這是第二個計劃實體,而員工是計劃變量,我只是希望當我將員工分配給一個班次,然後循環通過該班次內的所有小分配(在開始和結束之間轉移次數),並分配給他或不分配,所以如果他有技能,他必須被分配,否則分配不了。 我很難把這個自定義移動的建設啓發式。有沒有辦法?自定義移動建設啓發式

編輯: 會不會是好把「明碼標價」的每一個轉變,我的意思是通過預optaplanner啓發式(求解開始之前),其對小任務數量出現在每個班次運行。然後用這些信息來決定一個員工是否適合這種轉變,如果他有能力滿足至少70%的小任務,他可以被分配給一個給定的班次。例如,我們有在轉換時間內發生的下一個小分配(SA):SA1發生4次,SA2發生4次,SA3發生2次,並且我們有員工1擁有SA1和SA2技能,而員工2擁有SA1技能,然後員工1可以分配到班次,因爲他滿足70%以上的小分配,但是員工2不能,因爲他只滿足40%。然後,在員工進入工作崗位後,只需將工作分配給他可以工作的所有工作(如果他有小工作的技能,他就可以工作),除了員工之外,有需要的技能)。如果他被分配到班次並擁有技能,那麼將不會有一個決定哪個員工進行一個小任務,每個員工都是一樣的。 這是一個好主意嗎?

也可以有多個計劃值分配給計劃實體的單個實例嗎?在這種情況下,可以將多個員工分配到一個班次分配實例(我只是將其作爲示例,我不打算這樣做)?

回答

1

檢查文檔中構造啓發式的高級配置。 構建啓發式算法僅適用於ChangeMove和其組合(笛卡爾,聯合,序列)。例如,如果你有2個實體A和B(每個具有1個變量)與10個甲實例和7b的情況下,這是可能的:

  • 要具有2 CH的:所述第一CH分配所有A和之後的第二個分配所有B的。因此,它按照以下順序分配:A1,A2,A3,...,A10,B1,B2,...,B7(並且每個都嘗試每個計劃值)。
  • 要讓1個CH指定A和B的混合。因此它按混合順序(由實體分類器定義)進行分配:A1,B1,B2,A2,B4,A3,...,B7,A10 。
  • (如果只有1個實體類,但2個變量,有可能做一個笛卡兒積或順序分配。)

無論如何,如果不剪,實施充分的自由一CustomPhaseCommand(請參閱具有...Initializer類的文檔和示例)。

除了剛纔把員工的轉變分配我還需要 把員工所需的轉變

聽起來像是你的模型可能是低效內的小任務。考慮其他車型只有1個規劃變量:

class Employee {} 
class Shift {} 
@PlanningEntity class SmallAssignment { 
    Shift shift; 
    @PlanningVariable Employee employee; 
} 

或者更好地定義什麼是「轉變」是:如果2人同時工作,他們使用同樣的轉變的實例嗎?隨着業務的複雜性,可能需要這種模式:

class Employee {} 
class ShiftWithDateTime {} 
@PlanningEntity lass ShiftWithDateTimeAndEmployee { 
    ShiftWithDateTime shiftWithDateTime; 
    @PlanningVariable Employee employee; 
} 
@PlanningEntity class SmallAssignment { 
    ShiftWithDateTime shiftWithDateTime; 
    @PlanningVariable Employee employee; 
} 

但是在這種情況下,我可能,檢查它是否refactorable這樣的(這是唯一可能的,如果小任務可以完美greedly分配,這樣它們的約束AREN 't NP-hard):

class Employee {} 
@PlanningEntity class ShiftWithDateTime { // shadow entity 
    @InverseRelationShadow List<ShiftWithDateTimeAndEmployee> assignments; 
    boolean hasEnoughEmployeesToFulfillAllSmallAssignments() { ... } 
} 
@PlanningEntity lass ShiftWithDateTimeAndEmployee { 
    ShiftWithDateTime shiftWithDateTime; 
    @PlanningVariable Employee employee; 
} 
+0

謝謝,這真的很有幫助。我已經提出另一個問題作爲對相同問題的補充。 –