NOTE:修正了一个Bug,加入了能否求解的数学算法判断,代码更新了
算法学的不好,一直没有写什么算法程序。之前一直想写个A*的,研究了一下,最终还没有写成。昨晚花了点时间,用Erlang写了个解八数码的程序,用的是最简单的A*,程序没有做什么优化,中规中矩,偷懒用模式匹配来处理移动情况。如果想看更加优雅的Erlang算法程序,可以查看我在附件提供的sudoku.erl,里面大量使用了高阶函数:)
注意:
0.八数码还是比较简单的,不像华荣道和推箱子那么BT,大部分情况在我的机上都能1s内解决,因此暂时不优化啦。
1.Open Table 和 Closed Table都是用的list,O(N)的查找时间。可以改成O(1)的。
2.这里是一个Tuple为一个Node,{Grid, Weight, Step, ParentStack},每个Node都有自己的ParentStack,占的内存多了些。Erlang里面没有指针,只能这样存值了。我觉得其实就Erlang而言,一个状态节点,为一个Process更加合适,每个Process有Parent Process的引用,这样设计可以利用多核加速,也比较符合Erlang的设计思维。
3.子状态的创建,用了个貌似很“丑陋”的匹配来完成:
move_up({N1,N2,N3,0,N5,N6,N7,N8,N9}) ->
{0,N2,N3,N1,N5,N6,N7,N8,N9};
move_up({N1,N2,N3,N4,0,N6,N7,N8,N9}) ->
{N1,0,N3,N4,N2,N6,N7,N8,N9};
move_up({N1,N2,N3,N4,N5,0,N7,N8,N9}) ->
{N1,N2,0,N4,N5,N3,N7,N8,N9};
move_up({N1,N2,N3,N4,N5,N6,0,N8,N9}) ->
{N1,N2,N3,0,N5,N6,N4,N8,N9};
move_up({N1,N2,N3,N4,N5,N6,N7,0,N9}) ->
{N1,N2,N3,N4,0,N6,N7,N5,N9};
move_up({N1,N2,N3,N4,N5,N6,N7,N8,0}) ->
{N1,N2,N3,N4,N5,0,N7,N8,N6};
move_up(_) ->
illegal_move.
比如这个,表示当0不在第一行(N1-N3)时可以返回一个合法的子状态,我觉得这样做挺方便,虽然丑了些
4.使用"每个不在目标位置上的数字块到目标位置的最少步数之总和"作为H(),层数作为G()
5.下次有空尝试改成IDA算法和Process作为一个Node
代码看附件,顺便带上某高手写的数独解法。
分享到:
相关推荐
这个小程序可能使用了`rand:uniform()`函数来生成0到1之间的一个浮点数,然后通过适当转换得到1到33之间的整数,对应双色球的红球部分。蓝球部分可能使用了类似的方法,但范围缩小到1到16之间。 2. **链表连接**: ...
【Erlang程序设计(第2版)】是由Erlang之父Joe Armstrong撰写的一本经典著作,专注于介绍Erlang编程语言在并发、分布式和容错系统中的应用。本书适用于初学者和有一定经验的Erlang程序员。作者在书中讨论了如何利用...
这个特别的Web服务器可能是用Erlang编写的Mongrel2的Erlang实现,名为emongrel2。Mongrel2是一款由Zed Shaw创建的高性能HTTP服务器,它强调安全性和速度,以及灵活的异步I/O模型。Mongrel2的设计目标是提供一个能够...
1. **并发性**:Erlang的并发模型基于轻量级进程(Lightweight Processes,LWP),它们类似于操作系统中的线程,但资源消耗小得多。进程间通信通过消息传递实现,这是Erlang并发模型的核心。 2. **故障恢复与容错**...
Erlang(['ə:læŋ])是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动...顺序执行的Erlang是一个及早求值, 单次赋值和动态类型的函数式编程语言
**Erlang编程:Introducing Erlang** Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,...
本压缩包文件包含的是 Erlang 连接 MySQL 的源码,这可能是一个 Erlang 驱动程序或应用程序,允许开发者在 Erlang 中编写代码以操作 MySQL 数据库。通常,这样的库会提供接口函数,用于执行 SQL 查询、插入、更新和...
总而言之,Erlang9.rar是一个包含Erlang/OTP 20.0 Windows 64位安装程序的压缩包,主要用于安装Erlang环境,以支持像RabbitMQ这样的Erlang应用。Erlang以其独特的并发模型和强大的错误恢复能力,广泛应用于需要高...
在实际使用Erlang时,开发者会遇到诸如OTP(Open Telecom Platform)这样的核心组件,它提供了一套标准库和框架,用于构建可靠、可扩展的应用程序。 OTP包括一系列的行为模式,如GenServer、GenEvent和Supervisor,...
openpoker源码 erlang写的网游服务器源码 OpenPoker是一个大型多人扑克网游,内建支持了容错能力,负载平衡和无限制的规模大小。
理解如何有效地使用递归来解决问题是学习Erlang的一个关键点。 错误和异常处理也是Erlang编程的一个重要部分。由于Erlang的设计哲学是容错,因此它提供了一套独特的机制来处理程序中可能出现的错误。 Erlang还提供...
为了与Erlang进行通信,我们需要编写一个简单的C程序,该程序能够接收Erlang发送的数据,并返回结果。下面是一个具体的C程序实例: ```c #include "stdafx.h" #include int _tmain(int argc, _TCHAR* argv[]) { ...
本项目是一个基于Erlang的小型游戏服务器,使用了Mnesia数据库来存储游戏数据。 Mnesia是Erlang内置的一个分布式数据库管理系统,支持事务处理和实时查询,非常适合实时性要求高的游戏场景。在这个小型游戏服务器中...
这份"Erlang游戏程序学习完整PDF手册"是一份全面介绍Erlang在游戏开发中应用的学习资料,包含了Erlang的基础知识、并发原理以及在游戏开发中的实践案例。 Erlang语言的设计理念源自于Ericsson公司为解决电信系统中...