具有无序变量功能的Java公式评估库

cpo*_*rte 10 java math parsing formula

我正在寻找一个用于公式解析和评估的java库(或带有java API的本机库).

使用这里的建议,我看了很多库:

  • JFormula
  • JEval
  • Symja
  • JEP

但它们都不能满足我的需求,那就是:

  • 多个公式评估与它们之间的依赖关系(公式始终是使用其他变量或数值对变量的影响)
  • 如果只有一个公式改变,可能只改变50个中的一个公式,并且具有良好的性能
  • 无需手动处理变量依赖性
  • 如果公式更改,则自动更新其他因变量
  • 可以听取哪个变量改变了
  • 不需要具有变量的特定格式(用户将直接输入名称,并且不希望具有复杂符号)

也许一个例子会更好.假设我们按此顺序输入系统:

  • a = b + c
  • c = 2*d
  • b = 3
  • d = 2

我希望能够按此顺序输入这4行,并询问"a"(或"b",无论如何)的结果.然后,如果在用户界面(基本上是一个表变量<>公式)"b"更改为"2*d",库将自动更改"b"和"a"的值,并返回我(或午餐事件,或调用函数)更改列表

最好的库就像JEP一样,但具有无序变量功能和自动评估因变量的可能性

我知道编译器和电子表格软件使用这样的机制,但我没有找到任何直接可用的java或java兼容库

有人知道吗?

编辑:精确:问题实际上是关于一个库,或最终是一组链接在一起的库.问题是公司的项目,并且想法是花费最少的时间."自己动手"的解决方案已经被估算,不在问题的范围内

Ira*_*ter 0

不知道有什么图书馆。

假设您拥有一组方程,方程的至少一侧有一个变量(不允许 A+B=CD)并且 没有循环(例如,A=B+1;B=A-2),从技术上讲,您需要做的是构建一个数据流图,显示每个运算符如何依赖于其操作数。对于无副作用的方程(例如,纯数学),这非常简单;您最终会得到一个有向无环图(具有代表共享子表达式的共享子树的森林)。然后,如果变量的值发生更改,或者引入新公式,则可以修改 dag 并重新评估更改的部分,将 dag 的更改传播到 dag 根。因此,您需要为表达式构建树,然后共享它们(通常通过对子树进行散列来查找潜在的等效候选者)。因此,需要进行大量结构操作来保留 dag(并且是根值)

但如果它只有 50 个你所显示的复杂性变量,它就会起作用,你可以简单地重新评估它们。如果将表达式存储为树(或者更好的是,反向抛光),您可以非常快速地评估每棵树,并且无需支付任何开销来使所有这些数据结构保持最新。

如果您有数百个方程,则 dag 方案可能要好得多。

如果您有约束方程(例如,您不受两边的限制),那么您就脱离了电子表格范例并进入了约束求解器,这是一项复杂得多的技术。