编程功能编程中的国际象棋

时间:2017-01-08 00:07:54

标签: performance functional-programming

一年前,我使用Alphabeta prunning算法编写了一个国际象棋AI。这在c ++中相对简单。我这样做时考虑的主要问题之一是使我的代码有效。我通过使用我称为"游戏"的数据类型来做到这一点。我通过算法制作的搜索树传递了一下。为了提高效率,我没有复制过#34;游戏"数据类型,但改变了它,同时保留了将其恢复到以前状态所需的nessisary信息。

最近我一直在阅读有关函数式编程的概念以及纯粹使用函数的概念,这些函数不会改变它们传递给我的参数的状态。我想知道我如何使用函数式编程的范例,同时仍然考虑到程序的效率。

在OOP中,解决方案似乎非常直接(这是我实现的),而在函数式编程中,似乎复制数据类型是nessisary,这降低了效率。是否可以在不降低效率的情况下使用函数式编程?

2 个答案:

答案 0 :(得分:2)

在函数式编程中,数据结构并不总是完全复制。在许多情况下,只需要复制更改的部分,而可以引用旧部分(因为不允许突变,这是安全的)。

persistant data structures上的文章更详细地描述了这一点。

答案 1 :(得分:2)

Jephron的回答指出了一个重要的事实,即只有持久数据结构的一小部分需要更新,因此较大的部分在旧状态和新状态之间共享。

老实说,在大多数情况下,这仍然比变异慢。

但是不可变的持久数据结构还有其他优点。我们假设您已经完成了播放引擎。现在,您想要实现历史记录(例如,允许玩家撤消之前的动作)。这很简单:只需记住列表中的所有状态。您会发现只需要触摸几个函数来获取状态列表而不仅仅是最后一个状态,并且您已完成。你不必担心会损害你的游戏引擎 - 没有全局变量或者你可以销毁的东西。

另一件事是通过采用并行性来利用您可能拥有的许多CPU核心。不用说,你不能让许多任务,线程,光纤或其他任何东西在一个可变数据结构上运行。这只会成为同步的噩梦,你的代码甚至可能会变慢。但是,不可变数据上没有同步问题,因为它们只对所有线程都是只读的。 这样可以很好地加速你的代码,使它远远超过C ++解决方案,即使"做一个移动"在功能数据结构上比在可变数据上慢得多。

以下是将棋盘游戏(TTT)从单线程更改为并行的示例:https://dierk.gitbooks.io/fregegoodness/content/src/docs/asciidoc/incremental_episode4.html

相关问题