Algorithm 如何使用算术运算用给定的数字表示一个数字?

Algorithm 如何使用算术运算用给定的数字表示一个数字?,algorithm,numbers,math,Algorithm,Numbers,Math,这是一个很好的例子。“给定一个数字数组和另一个数字,计算是否可以使用标准数学技术操纵该数字数组,使之等于给定的另一个数字。例如,给定5和10,你能使50吗?5*10=50,所以是的。”。(为了简单起见,我们只假设算术运算) 我建议使用蛮力搜索(带有分支和边界)。这有意义吗?蛮力似乎是一种有效的方法。但暴力是一种无知的搜索……当你到达搜索树中的一个分支时,它不会做出有根据的猜测 您可能想了解的是,是否有其他方法可以帮助您了解搜索信息。启发式函数查看一个状态,并估计离目标有多远。如果你能找到一个有效

这是一个很好的例子。“给定一个数字数组和另一个数字,计算是否可以使用标准数学技术操纵该数字数组,使之等于给定的另一个数字。例如,给定5和10,你能使50吗?5*10=50,所以是的。”。(为了简单起见,我们只假设算术运算)


我建议使用蛮力搜索(带有分支和边界)。这有意义吗?

蛮力似乎是一种有效的方法。但暴力是一种无知的搜索……当你到达搜索树中的一个分支时,它不会做出有根据的猜测

您可能想了解的是,是否有其他方法可以帮助您了解搜索信息。启发式函数查看一个状态,并估计离目标有多远。如果你能找到一个有效的启发式函数,你可以应用这样的算法


注意:这似乎不是一个容易定义启发式的问题。

我认为这是有意义的

您可以利用乘法之间的对称性来进一步修剪树。a*b=b*a.

我会问

  • 数字是整数吗
  • 这些数字的规模有上限吗
  • 什么是标准的数学技术?
    • 只有简单的算术
    • 根,力量
    • 互惠
    • 三角函数

etc

另一种解决方法是使用。您的填充将以插入数组元素之间的随机运算符开始

S
成为您需要拨打的号码。你的适应度函数可以是
|S-Value(E[i])|
,其中
Value(E[i])
是在你的人群中计算
i
-th表达式后的值

您的变异运算符可以简单地将一个运算符更改为另一个运算符,您的交叉函数可以将表达式左侧的运算符与另一个表达式右侧的运算符组合在一起

也许你可以找到更复杂的功能,更好地工作,遗传算法需要一点猜测工作的最佳结果

我不知道这将如何与暴力相比较,但这是一个不同的解决方案,我认为这将使你在采访中脱颖而出,因为每个人都能看到暴力解决方案


如果你只需要一个足够好的解决方案(不是完全的
s
,但足够接近),那么这肯定比暴力更快。在我实施的少数几个遗传算法中,我注意到它们快速接近接近最优的解决方案,但速度相当慢,如果你想要最优的解决方案,有时甚至会陷入困境。

一个非常重要的第一个问题是:是否允许任何一元运算?也就是说,我可以把x变成-x,1/x,x!,或sqrt(x)“免费”

如果是这样,一个简单的分支搜索就不会终止,因为一元操作的使用次数没有先验的界限。如果不是这样,一个简单的搜索可能会很好

这里有一个有趣的策略,如果不是一个有效的策略的话:为正在使用的算术要求或产生一个BNF语法。破例

:=5 | 10


然后用那个语法来发展所有可能的表达,比如说,用不到20条语法规则。对它们进行评估。这将保证是有界的,并将生成所有在该语言中有效的“不太复杂”表达式。

在Haskell中编程,第11章:倒计时问题

我将补充:数组顺序是否重要。e、 g.可以[5 | 10]=2,或者必须是[10 | 5]=2。并且每个数字在表达式中只能使用一次,对吗?