Memory 哪种编程语言更适合实现基于搜索的问题求解器?

Memory 哪种编程语言更适合实现基于搜索的问题求解器?,memory,artificial-intelligence,memory-efficient,Memory,Artificial Intelligence,Memory Efficient,我现在开始为人工智能课程做最后一个项目(作为计算机科学理学学士学位的一部分)。在这个项目中,我们需要选择人工智能领域中一个有趣的问题,在课堂上扩展一个或多个主题,并解决它。我们稍后将编写一份报告,讨论我们的结果,并提交报告和我们编写的代码 显然,我们不希望在经典问题的研究方面达到最先进的水平,而是要研究并解决(在很大程度上)一个不寻常的问题(选择这种方法的大多数人选择解决一些简单的计算机或棋盘游戏,而这些问题还没有被AI研究界彻底解决)或者以某种新颖的方式研究一个更常见的问题,可能建议一种新的有

我现在开始为人工智能课程做最后一个项目(作为计算机科学理学学士学位的一部分)。在这个项目中,我们需要选择人工智能领域中一个有趣的问题,在课堂上扩展一个或多个主题,并解决它。我们稍后将编写一份报告,讨论我们的结果,并提交报告和我们编写的代码

显然,我们不希望在经典问题的研究方面达到最先进的水平,而是要研究并解决(在很大程度上)一个不寻常的问题(选择这种方法的大多数人选择解决一些简单的计算机或棋盘游戏,而这些问题还没有被AI研究界彻底解决)或者以某种新颖的方式研究一个更常见的问题,可能建议一种新的有趣的启发式方法或对现有算法的一些修改。在后一种情况下,我们不希望超越现代研究成果,而只是提供一些新的视角

我和我的合作伙伴为这个项目选择的主题是Sokoban,这使我们处于第二组(它还没有被彻底研究过,因为只有三分之二的常见测试集可以由最好的解算器来解决,但是这个问题的最先进解算器似乎太复杂了,我们不希望通过一个兼职的、两周的项目来接近他们)。我们想尝试使用搜索问题的方法来解决Sokoban问题

无论如何,在开始实现我们的Sokoban solver之前,我开始想知道我们熟悉的几种语言中哪一种(C、C++、java和Python)更适合用于实现基于搜索的求解器,它在很大的搜索空间上执行搜索。(Sokoban有一个非常深的搜索树,有些问题需要300多步才能解决,并且有一个非常高的分支因子[在某些问题中超过100];请注意,当只考虑石头盒移动,而不是玩家移动时,就会达到这个高分支因子,因此在每个状态下,我们可以将任何石头移动到四个方向中的任何一个)

我开始考虑这个问题的原因是因为在另一个关于人工智能的课程——处理应用AI技术到产品设计上——我创建了一个自动房间设计师,它将通过在所有可能的房间设计的状态空间中搜索房间(给定房间大小和一套家具)来设计房间。并返回得分最高的状态(通过一些试探法测量)。该程序是用Java编写的,每次运行时,在只搜索了数万个搜索节点之后,它都会耗尽内存。我认为发生这种情况的主要原因是,我为该项目选择了一种非常面向对象的方法;它是用Java编写的,每个搜索状态都由一个对象表示,并且在到达时,每个这样的状态都由一个对象表示在一个searcher对象中,被一个搜索节点(另一个对象)包装,这当然意味着程序的内存很快被很多对象填满,因此很快就用完了

现在,我知道问题的一部分是使用内存密集型算法(a*),以及我选择的实现方式,但我想知道使用Java是否也有问题。因此,这就引出了两个问题:
1.在实现搜索问题和搜索算法时,通常哪种编程方法更适合?(面向对象、函数式或其他)
2、哪种编程语言在实现搜索问题和搜索算法时更合适,java、C++、C++或Python?(其他语言也是可能的,但是只有当它们的语法与上述语言非常相似)

时才是合适的。 具体来说,这些语言的哪些功能和属性可用于实现问题求解器,以高效的方式在非常大的搜索空间(和运行时)进行搜索?

我的观点:

Java:太冗长/难看的语法,尤其是对于数学方面。并且使用了太多的内存/cpu资源

C:如果你习惯了面向对象的无指针语言,那就太可怕了

C++:功能强大且速度快,但编译太重/太慢,无法使用许多不同的算法进行实验


Python:它们中最慢的。很可能用于创建原型,但不太适合大计算。

< P>如果你只限于使用大多数人熟悉的语言,我可能会推荐C++。 如果你想分支到一种在人工智能领域很常见的语言,并且我发现在中实现一个解算器相对容易,我会使用prolog。我知道你可以在网上找到启发式算法的例子。我相信你知道,Minimax和alpha-beta修剪是很常见的


另外,我在游戏中使用了一种与prolog链接的语言,名为GDL。请参阅:。它包含您可以用lisp语法称之为prolog谓词的语言。

我认识一些人,他们都在使用Java中描述的内存密集型算法。您可以让它工作,但必须使用and数组

话虽如此,我认为这并不聪明。如果你想编写高效的Java代码,你基本上要编写类似于C/C++的代码。然后你还可以采取最后一步直接编写C/C++代码,从而获得进一步优化的机会(可能在速度和内存方面获得另一个2倍)

这就引出了你们的问题:

  • 在实现搜索问题和搜索算法时,通常哪种编程方法更适合?(面向对象、函数式或其他)
  • 函数式程序通常看起来非常漂亮,似乎很适合算法问题。问题是,大多数情况下,命令式算法更快(而且编写时更难避免错误)。面向对象,我不知道,我把它算作命令式。对象层次结构引入了计算