我目前正在开始为人工智能课程做最后的项目(作为我的计算机科学学士学位的一部分)。在这个项目中,我们需要在人工智能领域选择一个有趣的问题,扩展课堂上的一个或多个主题,并解决它。我们稍后会写一份报告来讨论我们的结果并提交报告和我们编写的代码。
显然,我们不希望在经典问题的研究中达到最先进的水平,而是要么检查并解决(在很大程度上)一个不常见的问题(大多数选择这种方法的人选择解决一些简单的计算机,要么AI 研究社区尚未彻底解决的棋盘游戏)或以某种新颖的方式检查更常见的问题,可能提出一种新的有趣的启发式或对现有算法的一些修改。在后一种情况下,我们预计不会超越现代研究结果,只是提供一些新的视角。
我和我的伙伴为该项目选择的主题是推箱子,这使我们处于第二组(它没有被研究死,因为只有三分之二的常见测试集可以由最好的求解器解决,但状态这个问题的最先进的解决方案似乎太复杂了,我们希望通过一个为期两周的兼职项目来接近他们)。我们想尝试使用搜索问题方法解决推箱子问题。
无论如何,在开始实现我们的推箱子求解器之前,我开始想知道我们熟悉的几种语言(C、C++、Java 和 Python)中的哪一种更适合用于实现基于搜索的求解器来执行在一个非常大的搜索空间上搜索(推箱子有一个非常深的搜索树,有些问题需要超过 300 步才能解决,并且分支因子非常高[在某些问题中超过 100];请注意,这个高分支因子是在以下情况下实现的只考虑石头\盒子移动,不考虑玩家移动,因此在每种状态下,我们可以将任何石头移动到四个方向中的任何一个)。
我开始考虑这个问题的主要原因是因为在另一门关于人工智能的课程中——处理将人工智能技术应用于产品设计——我创建了一个自动化房间设计师,它将通过搜索所有可能的房间设计的状态空间来设计一个房间(具有给定的房间大小和一套家具)并返回得分最高的状态(通过一些启发式方法测量)。该程序是用 Java 编写的,每次运行时都会耗尽内存,只搜索了数万个搜索节点。我认为发生这种情况的主要原因是因为我为那个项目选择了一种非常面向对象的方法;它是用 Java 编写的,每个搜索状态都由一个对象表示,每个这样的状态,当由一个搜索器对象到达时,
现在,我知道问题的一部分是使用内存密集型算法 (A*),以及我选择实现它的方式,但我想知道使用 Java 是否也存在问题。所以这让我想到了两个问题:
1. 一般来说,在实现搜索问题和搜索算法时,哪种编程方法更合适?(面向对象、函数式或其他)
2. 在实现搜索问题和搜索算法时,哪种编程语言更合适,Java、C、C++ 还是 Python?(其他语言也是可能的,但前提是它们的语法与上述语言之一非常相似)
具体来说,这些语言的哪些特性和特性可用于实现一个问题解决程序,该程序旨在以内存(和运行时)有效的方式在非常大的搜索空间上进行搜索?