問題は次のとおりです。
ユーザーが式を作成できるように、XPathのような言語をユーザーに提供する式評価エンジンを開発しました。次に、これらの式が解析され、式ツリーとして保存されます。論理(and / or / not)、リレーショナル(=、!=、>、<、> =、<=)、算術(+、-、*、/)、if / then /など、さまざまな種類の式があります。 else式。
これらの操作に加えて、式には定数(数値、文字列、日付など)を含めることができ、XPathと同様の構文を使用してJavaオブジェクトのツリー内を移動することにより、外部情報にアクセスすることもできます。
上記を前提として、次のような式を作成できます。
/some/value and /some/other/value
/some/value or /some/other/value
if (<evaluate some expression>) then
<evaluate some other expression>
else
<do something else>
if-then-else式のthen-partとelse-partはそれ自体が式であり、すべてが式と見なされるため、他のif-then-elseを含め、何でもそこに表示でき、ユーザーはビルドできます。 if-then-elseをネストすることによる大きな決定木。
これらの式は手動で作成され、人為的エラーが発生しやすいため、一般的な外部データの分析に基づいて、これらの式ツリーを最適化できる自動学習プロセスを作成することにしました。例:上記の最初の式(/ some/valueおよび/some/ other / value)で、/ some / other / valueの結果がほとんどの場合falseである場合、このブランチが短絡評価を利用するための左側の分岐(左側はすでに結果を決定しているため、ANDの右側は評価されません)。
もう1つの可能な最適化は、ネストされたif-then-else式(決定木)を再配置することです。これにより、使用される最も一般的な外部データに基づいて最も頻繁に使用されるパスが、将来、一部のブランチの不要な評価を回避して、より早く実行されます。回数。
これらの式ツリーのこの自動リファクタリングを実行するために使用するのに最適または推奨されるアプローチ/アルゴリズムについて何かアイデアはありますか?