2013-01-05 28 views
1

问题决策树如下:重构使用自动学习

我开发了一个表达式计算引擎,它提供了类似XPath语言给用户,因此他可以构建表达式。这些表达式然后被解析并存储为表达式树。有很多种表达式,包括逻辑(和/或/不),关系式(=,!=,>,<,> =,< =),算术(+, - ,*,/)和if/then /其他表达式。

除了这些行动,表达可以有常量(数字,字符串,日期等),也可以通过使用类似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表达式是表达式本身的其他部分,一切都被认为是一个表达式,那么任何东西都可以出现在那里,包括其他的if-then-else,允许用户通过嵌套if-then-else来构建大型决策树。

由于这些表达式是手动建立和容易出现人为错误,我决定建立能够优化基于共同的外部数据的分析这些表达式树的自动学习过程。例如:在上面的第一个表达式(/一些/值和/一些/其他/值),如果/一些/其他/值是假大部分时间,我们可以重新排列树的结果所以这分支将是左侧分支以利用短路评估(由于左侧已经确定了结果,所以AND的右侧未被评估)。

另一种可能的优化是重新排列嵌套的if-then-else表达式(决策树),以便基于最常用的外部数据采用的最频繁路径将在未来更早执行,避免不必要的评估大部分时间都是分支。

你有什么是最好的或推荐的方法/算法,以用于执行这些表达式树的这种自动重构的任何想法?

+0

我不明白,优化会如何帮助您解决人为错误? – svick

回答

1

我想您所描述的是编译器优化这一切巨大的主题从

  • 内嵌扩展
  • deadcode消除
  • 常量传播
  • 循环变换

基本上你有很多重写规则可以保证功能代码/ xpath的离子性。

在对嵌套的if-else我不认为你需要求助于机器学习的清理问题。 一(我认为最优的)的方法是使用链接的哈夫曼编码huffman_coding 以每条路径的信,我们再与霍夫曼编码编码他们,让所谓的哈夫曼树。这棵树的最小评估运行在一个(足够大)的样本上,与你制作霍夫曼树的分布相同。

如果你对``评估一些表达式'有限制 - 表达或者他们有不同的计算成本等等。你可能需要另一种方法。

还记得,一如既往的优化,你应该小心,只做真正重要的事情。