OptaPlanner トレーニング

http://www.optaplanner.org/learn/training.html から optaplanner-training-6.2.0.CR1-training-2.zip をダウンロードし、instructions/training.html を開いてみよう。まだ Lab 201 までしか作られていないが、手を動かすとっかかりにはとてもよさそう。

詳しく書こうと思ったけど、よくできてるので興趣を削がないよう、概要だけ書くことにします。

Lab 101 : No more than 4 processes per computer

CloudBalancing により、プロセスをコンピューターに配分しています。お客様からもうひとつ要望がありました。「同じコンピューターに、あんまりたくさんプロセスをのっけないでください」

課題:よし、「4つより多くのプロセスを、1つのコンピューターに割当てない」というhard制約を追加しよう。

僕の場合: モロに score trap の pitfall にひっかかりました。フフフ。

Lab 102 : No process should hog half the CPU power

お客様の要望「ひとつのプロセスでCPUの半分より多くを食わないようにして(CPUが少ないコンピューターは例外)」

課題:
1. ひとつのプロセスでCPUの半分より多くを食うことを「Hog」と呼ぶ。(半分ちょうどはOK)
-> 6 CPU 以下のコンピュータは例外とする
2. 新規hard制約「プロセスによるコンピューターの Hog は許さない」
3. Hog についてのロジックは Java で実装すること
-> 制約自体はDRLに実装する

僕の場合: 解けたけど、evalでやったせいで、 score trap を回避できてませんでした。無念。

Lab 103 : Distribute network bandwidth fairly

お客様の要望「コンピューターはもう買っちゃったんで、あるやつ使ってね。なので値段は気にしなくていいよ」「コンピュータのネットワーク帯域は全部同じ」「ネットワークは均等に使うようにしてね」

課題:
1. hard制約「requiredNetworkBandwidthTotal」を削除
2. soft制約「computerCost」を削除
3. 新規soft制約「コンピューター毎のネットワーク帯域は可能な限り均等にする」

僕の場合: ドキュメントの「Fairness score constraints」を読んでも、単純にsoft制約の点数の足し算にすることになかなか気づけなかった。結構慣れが必要ですなあ。

Lab 201 : Tennis friends

7つのチームがテニスコートで試合をします。18週あって、1週につき、4チームがコートを使います。各チームには「行けない日」があります。できるだけ均等にコートを使わせてあげたいです。チームの対戦相手も均等にあたるようにします。。。詳しくは原文で読んだ方がいいでしょう。

で、この問題をモデル化します。とても重要なトレーニングですね。絶対に Tennis example のドキュメントやコードを見ないように!

初めてのひとにはメチャメチャ難しいかもしれません。でもできるだけ自分でよく考えて、自分なりの回答を書いた上で、正解を見て、「ああー」となりましょう。ああー