Machine Reassignment
http://docs.jboss.org/optaplanner/release/latest/optaplanner-docs/html_single/index.html#machineReassignment
Cloud Balancing を複雑化したバージョンです。Google ROADEF 2012 の課題だそうです。 http://challenge.roadef.org/2012/en/
- MachineReassignment : @PlanningSolution
- MrProcessAssignment : @PlanningEntity
- MrMachine : @PlanningVariable
- MrProcess process;
- MrMachine originalMachine;
@PlanningVariable が1つ。CPUなどのリソース制約は MrMachineCapacity/MrResource で抽象化されています。初期配置からの変更コストを制約に含んでいます。MrService が別の MrService に依存している場合、依存先サービスと同じ「neighborhood」マシン(同じドメイン的な意味)にプロセスをアサインしなければならない。"transientlyConsumed==true" なリソースでは、プロセス配置を変更した場合、変更前マシーンに対してもリソース使用を計算し、キャパシティ制約をチェックしなければいけない、などなど。
ルールでは insertLogical が初出ですね。
rule "machineUsage" salience 1 // Do these rules first (optional, for performance) when $machineCapacity : MrMachineCapacity($machine : machine, $resource : resource) accumulate( $processAssignment : MrProcessAssignment(machine == $machine), $usageTotal : sum($processAssignment.getUsage($resource)) ) then insertLogical(new MrMachineUsage($machineCapacity, $usageTotal.intValue())); end
ルールを書きやすくする/パフォーマンスを上げるために便利factを作ってinsertするというのは前回(http://d.hatena.ne.jp/tokobayashi/20150224)の CourseConflict でもありましたが、今回はルール内で動的に insert しています。insertLogical とは insertした fact が「LHSの条件がfalseになると自動的にretractされる」という仕組みです (http://docs.jboss.org/drools/release/6.1.0.Final/drools-docs/html_single/index.html#d0e4322)。これは動的な便利fact利用に使えるテクニックですが、よーく理解しないとハマる恐れがあるので、動作をよく確かめて使いましょう。
設定では customPhase が初出です。。。と思ったら Dinner Party にもありました。
<!--<constructionHeuristic>--> <!--<constructionHeuristicType>FIRST_FIT</constructionHeuristicType>--> <!--</constructionHeuristic>--> <customPhase> <customPhaseCommandClass>org.optaplanner.examples.machinereassignment.solver.solution.initializer.ToOriginalMachineSolutionInitializer</customPhaseCommandClass> </customPhase>
初期配置が与えられているので、ConstructionHeuristicは無しってことですね。