OptaPlannerは、ベストスコアを使いプランの最適化を行います。このスコア機能は誰が定義するのでしょうか? 一般的にはユーザーの仕様に基き開発者が行います。スコア機能の定義をユーザー自身に実施してもらうことができるでしょうか?可能性を考えてみましょう。
OptaPlannerでDroolsルールエンジンを使いスコアー計算を行っている場合、Droolsエコシステムが提供する機能を使い、スコアリングに関するルールを修正することができます。エコシステムには、Decision Tables、スコアーカード、Drools ワークベンチ Webアプリケーションが含まれます。
今回は「クラウドリソースの最適化」例を使い、ユーザーがスコアールール(関数)を定義できるようにします。この例では、リソースの上限を超えずにプロセスを各コンピューターに割り当てる必要があります。この例についてより詳細な情報が必要な場合、こちらの動画をご確認ください。
Static DRLルール
開発者として、静的にスコアールールをDRLファイルに書くことができます:rule "Risk for out of memory"
when
CloudComputerUsage(freeMemory < 2)
then
scoreHolder.addSoftConstraintMatch(kcontext, -100);
end
rule "Unused memory but no CPU"
when
CloudComputerUsage(freeMemory >= 8, freeCpuPower < 4)
then
scoreHolder.addSoftConstraintMatch(kcontext, -10);
end
しかし、DRLファイルを直接編集するのは難易度が高すぎるでしょう。
データ駆動 DRLルール
データオブジェクトを用意し、ユーザーに記入してもらう方法があります:public class FreePenalty {
private int minFreeMemory; // Defaults to 0
private int maxFreeMemory; // Defaults to Integer.MAX_VALUE
private int minFreeCpuPower; // Defaults to 0
private int maxFreeCpuPower; // Defaults to Integer.MAX_VALUE
private int minFreeNetworkBandwidth; // Defaults to 0
private int maxFreeNetworkBandwidth; // Defaults to Integer.MAX_VALUE
private int softScoreImpact;
...
}
この FrrePenalty インスタンスをスコアー制約として適応させる為、ルールを1 つ書きます:
rule "requiredCpuPowerTotal"
when
// Defined by the user
FreePenalty(
$minFreeMemory : minFreeMemory, $maxFreeMemory : maxFreeMemory,
$minFreeCpuPower : minFreeCpuPower, $maxFreeCpuPower : maxFreeCpuPower,
$minFreeNetworkBandwidth : minFreeNetworkBandwidth, $maxFreeNetworkBandwidth : maxFreeNetworkBandwidth)
// Calculated insertlogical from the process assignments
CloudComputerUsage(
freeMemory >= $minFreeMemory, freeMemory < $maxFreeMemory,
freeCpuPower >= $minFreeCpuPower, freeCpuPower < $maxFreeCpuPower,
freeMemory >= $minFreeNetworkBandwidth, freeMemory < $maxFreeNetworkBandwidth,
$softScoreImpact : softScoreImpact)
then
scoreHolder.addSoftConstraintMatch(kcontext, $softScoreImpact);
end
そしてもちろん、ウェブインターフェースを開発し、ユーザーが FreePenalty レコードを 作成/更新/削除できるようにします。これにより、ユーザーは UI を通して以下のレコードを作成できます:
User creates new FreePenalty(maxFreeMemory = 2, softScoreImpact = -100)
User creates new FreePenalty(minFreeMemory = 8, maxFreeCpuPower = 4, softScoreImpact = -10)
これら2つのレコードにより、先程定義した Static DRLルールと同様のルールが定義できます。今回は、ユーザーがスコアー関数を修正できます。
Decision tables
ユーザーに制約を公開する別の方法として、Drools decision tableがあります。ユーザーは xlsファイルを Excelや LibreOffice を使い修正することで、スコアールールを変更することができます:ユーザーにこのファイルを提供する前に、2行目から11行目までを隠します。これにより、decision tablesの技術的な詳細までをユーザーへ公開せずにすみます。
詳細を含めたデモについては、こちらの動画をご覧ください:
decision tableは、データ駆動DRLルールよりもはるかに強力です:ユーザーは、どの制約を適応させるか選択できます。他の制約については含める必要すらありません。(デフォルト値に対してチェックを入れるよりも高速です)
ルール テンプレート
もしもデータ駆動DRLルールが充分ではなく、decision tableの xlsファイルが UIとしては取扱いづらい場合、カスタムUIとセットでルールテンプレートを使ってください。Drools ワークベンチ
ワークベンチ(以前は Guvnorとして知られていました)は、ルールやワークフローを管理するWebアプリケーションです。Webインターフェースを使い、ビジネスユーザーはルールを作成し変更できます。OptaPlannerで使用するスコアールールも含まれます。これはとても興味深い設定方法です。将来、このブログを通してデモする予定ですが、詳細についてはDrools ドキュメントをご覧ください。
結論
OptaPlannerではいくつかの方法で、ユーザーがプランニングに使われるスコアールール(関数)を自ら定義することができます。つまり、ユーザーが Solverの結果を見ながらテストを繰り返し、スコアールールをチューニングすることができます。この高速なイテレーションにより、ビジネスプランニングをより迅速に高性能化させることができます。
原文: Put the user in control of the score constraints by Geoffrey De Smet(OptaPlanner.org)
OptaPlanner を利用する際、スコアー関数を開発者が実装していませんか? ビジネスユーザー自身にプランニングのチューニングを実施してもらう方法を紹介しています。BRMS/BPMSの真髄を理解していただけるエントリーですので、ぜひご覧ください。
返信削除DRLやDecisionTablesに興味のある方は、ぜひ Red Hat JBoss BRMS Online Workshopに挑戦してください。先日公開されたLab7では、DecisionTablesを丁寧に解説していますよ。 http://playintegration.blogspot.jp/2014/04/red-hat-jboss-brms-cool-storelab7.html