`
AvinDev
  • 浏览: 113680 次
社区版块
存档分类
最新评论

用Erlang写了个解八数码的小程序

阅读更多
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

代码看附件,顺便带上某高手写的数独解法。
  • sudoku.zip (1 KB)
  • 描述: 国外高手写的数独解法
  • 下载次数: 37
  • grid9.zip (1.8 KB)
  • 描述: 修改后的版本。
  • 下载次数: 26
分享到:
评论

相关推荐

    Erlang编写的生成一注双色球小程序

    这个小程序可能使用了`rand:uniform()`函数来生成0到1之间的一个浮点数,然后通过适当转换得到1到33之间的整数,对应双色球的红球部分。蓝球部分可能使用了类似的方法,但范围缩小到1到16之间。 2. **链表连接**: ...

    Erlang程序设计(第2版)1

    【Erlang程序设计(第2版)】是由Erlang之父Joe Armstrong撰写的一本经典著作,专注于介绍Erlang编程语言在并发、分布式和容错系统中的应用。本书适用于初学者和有一定经验的Erlang程序员。作者在书中讨论了如何利用...

    erlang写的一个特别的web服务器

    这个特别的Web服务器可能是用Erlang编写的Mongrel2的Erlang实现,名为emongrel2。Mongrel2是一款由Zed Shaw创建的高性能HTTP服务器,它强调安全性和速度,以及灵活的异步I/O模型。Mongrel2的设计目标是提供一个能够...

    erlang 程序设计 源码

    1. **并发性**:Erlang的并发模型基于轻量级进程(Lightweight Processes,LWP),它们类似于操作系统中的线程,但资源消耗小得多。进程间通信通过消息传递实现,这是Erlang并发模型的核心。 2. **故障恢复与容错**...

    Erlang(32,64)安装程序

    Erlang(['ə:læŋ])是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动...顺序执行的Erlang是一个及早求值, 单次赋值和动态类型的函数式编程语言

    erlang编程 Introducing Erlang

    **Erlang编程:Introducing Erlang** Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,...

    erlang mysql

    本压缩包文件包含的是 Erlang 连接 MySQL 的源码,这可能是一个 Erlang 驱动程序或应用程序,允许开发者在 Erlang 中编写代码以操作 MySQL 数据库。通常,这样的库会提供接口函数,用于执行 SQL 查询、插入、更新和...

    erlang9.rar

    总而言之,Erlang9.rar是一个包含Erlang/OTP 20.0 Windows 64位安装程序的压缩包,主要用于安装Erlang环境,以支持像RabbitMQ这样的Erlang应用。Erlang以其独特的并发模型和强大的错误恢复能力,广泛应用于需要高...

    Erlang23_3.zip

    在实际使用Erlang时,开发者会遇到诸如OTP(Open Telecom Platform)这样的核心组件,它提供了一套标准库和框架,用于构建可靠、可扩展的应用程序。 OTP包括一系列的行为模式,如GenServer、GenEvent和Supervisor,...

    openpoker源码 erlang写的网游服务器

    openpoker源码 erlang写的网游服务器源码 OpenPoker是一个大型多人扑克网游,内建支持了容错能力,负载平衡和无限制的规模大小。

    erlang趣学指南

    理解如何有效地使用递归来解决问题是学习Erlang的一个关键点。 错误和异常处理也是Erlang编程的一个重要部分。由于Erlang的设计哲学是容错,因此它提供了一套独特的机制来处理程序中可能出现的错误。 Erlang还提供...

    erlang -c语言程序接口.pdf

    为了与Erlang进行通信,我们需要编写一个简单的C程序,该程序能够接收Erlang发送的数据,并返回结果。下面是一个具体的C程序实例: ```c #include "stdafx.h" #include int _tmain(int argc, _TCHAR* argv[]) { ...

    erlang的小型游戏服务器

    本项目是一个基于Erlang的小型游戏服务器,使用了Mnesia数据库来存储游戏数据。 Mnesia是Erlang内置的一个分布式数据库管理系统,支持事务处理和实时查询,非常适合实时性要求高的游戏场景。在这个小型游戏服务器中...

    Erlang游戏程序学习完整PDF手册

    这份"Erlang游戏程序学习完整PDF手册"是一份全面介绍Erlang在游戏开发中应用的学习资料,包含了Erlang的基础知识、并发原理以及在游戏开发中的实践案例。 Erlang语言的设计理念源自于Ericsson公司为解决电信系统中...

Global site tag (gtag.js) - Google Analytics