こんにちは、加藤です。
スコア計算について、基本的なところをまとめました。
概要
スコアは、2つのソリューションの比較に用います。
当然スコアが高い方が優秀なソリューションと判定されます。
最適解を自動的に判定することはできないので、いくつかの手段で設定することができます。
・Score constraint signum(スコア制約の符号)
最大値を求める正の制約と、最小値を求める負の制約があります。
どちらも常に最大スコアを保持することになります。
同じスコアレベルなら共存可能です。
・Score constraint weight(スコア制約の重み付け)
制約のスコアの重み付けを行います。
正の制約は収益を最大化し、負の制約はコストを最小化します。
・Score level(スコアレベル)
制約にレベルを設定します。Hard/Softが一番簡単なスコアレベルの設定です。
上位ランクの制約(Hard)は必須要件を満たすか確認、下位ランク(Soft)の制約は収益を最大化します。
3つ以上のスコアレベルがサポートされています。
・Pareto scoring(AKA多目的最適化採点)
2つの制約について、同じスコアレベルかつ重み付けされていない場合でも、最適解を発見できます。
コンパレータクラスを作成する必要があります。
compareToメソッドでは、以下のような矛盾した実装を許容します。
2A > A
A = B
2A < B ※上記4つの設定は、すべてシームレスに組み合わせることができます。 スコアの計算方法
Javaによるスコア計算と、Droolsによるスコア計算を選択することができます。
・Drools
利点:
ほとんどのDRLで前向き連鎖が使用されており、余分なコードを削減できる。
デシジョンテーブルで定義可能。
→エクセル(XLSファイル)が使用できるため、開発者以外のメンテナンスが比較的容易。
DSLで定義可能。
短所
DRLの使用法を学習するコストが必要。
・通常のJava
利点
学習コストが不要。
既存のシステムにスコア計算を追加するだけで実現可能。
短所
スコア加算用クラスが無いため、計算が遅い。
・スコア加算用クラスを作成したJava
利点
「正しく実装されていれば」非常に処理が高速。
短所
パフォーマンスの最適化を自分で行う必要があり、正しく実装するのが難しい。
Droolsと比較すると、スコア制約変更時のメンテナンスが難しい。
注意点
floatとdoubleは、正しく保持できないためスコア計算には使用できません。
BigDecimalを使用してください。
所感
サンプルを見る限り、Droolsでのスコア計算が簡単そうではありました。
デシジョンテーブルによるルール定義が便利そうなので、学習する価値はあると思います。
ただし、スコア計算処理の内部が良く分かっていないのが課題として残っています。