首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哪种编程语言更适合于实现基于搜索的问题解决程序?

哪种编程语言更适合于实现基于搜索的问题解决程序?
EN

Stack Overflow用户
提问于 2013-02-22 00:29:02
回答 5查看 1.6K关注 0票数 2

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

显然,我们不希望在经典问题的研究中达到最先进的水平,而是检查和解决(在很大程度上)一个不常见的问题(大多数选择这种方法的人选择解决一些简单的计算机或棋盘游戏,这些问题还没有被AI研究社区彻底解决),或者以某种新颖的方式研究更常见的问题,也许会提出一个新的有趣的启发式方法或对现有算法进行一些修改。在后一种情况下,我们不会被期望超越现代研究结果,只是为了提供一些新的视角。

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

无论如何,在开始实现我们的Sokoban求解器之前,我开始怀疑我们熟悉的几种语言(C,C++,Java和Python语言)中哪一种更适合用于实现基于搜索的求解器,该求解器旨在执行非常大的搜索空间(Sokoban有一个非常深的搜索树,有些问题需要超过300次移动才能解决,并且在某些问题中有超过100次的分支因子;请注意,当只考虑石头\box移动,而不是玩家移动时,这种高分支因子是实现的,所以在每种状态下,我们可以将任何一块石头移动到四个方向中的任何一个方向)。

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

现在,我知道问题的一部分是使用内存密集型算法(A*),以及我选择实现它的方式,但我想知道使用Java是否也是问题的一部分。这就引出了两个问题:

  1. 在实现搜索问题和搜索算法时,通常哪种编程方法更适合?(面向对象、函数式或其他)
  2. 在实现搜索问题和搜索算法时,哪种编程语言更适合,Java、C、C++还是Python语言?(其他语言也是可能的,但前提是它们的语法与上述语言中的一种非常相似)

具体地说,这些语言的哪些功能和属性可以用于实现问题解决程序,该问题解决程序旨在以内存(和运行时)高效的方式在非常大的搜索空间上进行搜索?

EN

回答 5

Stack Overflow用户

发布于 2013-02-22 16:05:19

我认识一些人,他们都在做内存密集型算法,就像你在Java中描述的那样。你可以让它工作,但你必须求助于primitive collections和数组。

话虽如此,我不认为它是非常聪明的。如果你想编写高效的Java代码,你可以编写类似于C/C++代码的代码。然后,您还可以进行最后一步,直接编写C/C++,获得进一步优化的机会(可能在速度和内存方面获得另外2倍的优化)。

这就引出了你的问题:

  1. 在实现搜索问题和搜索算法时,通常哪种编程方法更适合?(面向对象、函数式或其他)

函数式程序通常看起来非常好,看起来很适合解决算法问题。问题是,大多数情况下,命令式算法更快(也更难写出没有bug的代码)。面向对象,嗯,我不知道,我认为它是命令式的。对象层次结构引入了您通常不想要的计算开销(与它为您购买的东西相比)。

在实现搜索问题和搜索算法时,、C、C++和Python哪种编程语言更适合?(其他语言也是可能的,但前提是它们的语法与上述语言中的一种非常相似)

我认为Python在简洁性上类似于函数式语言(它具有一流的函数),但对于任何严肃的语言来说,它都太慢了。在你推荐的语言中,我可能会选择C++,因为Java不是更好,而是可能更慢。一种可能是使用像Scala这样的东西,它允许简洁的编程(与Python相当),速度接近或等于Java。

票数 1
EN

Stack Overflow用户

发布于 2013-02-22 00:47:25

我的观点是:

Java:过于冗长/丑陋的语法,尤其是对于数学方面的东西。并且使用太多的存储器/cpu资源。

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-02-22 02:06:23

如果您仅限于使用大多数人都熟悉的语言,我可能会推荐c++。

如果你想要分支到一种在人工智能领域很常见的语言,并且我发现在其中实现求解器相对容易,我会使用prolog。我知道你可以在网上找到启发式算法的例子。Minimax和alpha-beta修剪是很常见的,我相信你也知道。

此外,还有一种我在游戏中使用的与prolog链接的语言,称为GDL。请参阅:http://en.wikipedia.org/wiki/Game_Description_Language它包含您可能在lisp语法中称为prolog谓词的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15007374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档