OptaPlanner examples その7

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は無しってことですね。