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

用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程序设计相关例子程序

    通过对这些文件名的分析,我们可以看出这些Erlang程序涵盖了并发处理、进程通信、异常处理、服务器设计、数据处理和测试等多个方面,体现了Erlang在构建分布式系统中的强大功能。学习并理解这些示例,对于深入掌握...

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

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

    Erlang程序设计(第2版)1

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

    Erlang程序设计 第2版

    Erlang程序设计 第2版 Erlang程序设计 第2版Erlang程序设计 第2版

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。  Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...

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

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

    erlang程序设计与入门

    **Erlang程序设计与入门** Erlang是一种并发、函数式编程语言,主要用于构建分布式、高可用性、容错性强的系统。它的设计灵感来源于电信行业的需求,由瑞典爱立信公司于1986年开发。Erlang以其独特的并发模型、轻量...

    Erlang程序设计,包含完整目录和全套源码

    这个压缩包包含了Erlang程序设计的完整目录和源码,是学习和理解Erlang编程的重要资源。 Erlang的并发特性源于其轻量级进程模型,每个进程都有自己的内存空间,进程间通信通过消息传递实现,这种设计降低了并发执行...

    Erlang程序设计中文版

    **Erlang程序设计中文版**是一本深入探讨Erlang编程语言的书籍,旨在帮助开发者理解和掌握这种在并发处理和分布式系统中广泛使用的语言。Erlang以其强大的错误恢复能力、热代码替换以及对大规模并发的支持而闻名,是...

    erlang 程序设计 源码

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

    Erlang程序设计及源码

    Erlang是函数式编程语言的代表之一,它鼓励使用不可变数据结构和纯函数。在Erlang中,函数是第一类公民,可以作为参数传递,也可以作为返回值。函数式编程的特性使Erlang代码更易于理解和调试,因为它们通常没有副...

    erlang程序设计2

    erlang发明者写的书。erlang/otp一种高可靠性的平台。

    erlang程序设计

    在深入探讨Erlang程序设计之前,我们先来了解一下Erlang的基础概念。 1. 函数式编程:Erlang是一种纯函数式编程语言,这意味着函数不具有副作用,它们仅根据输入产生输出,不改变外部状态。这种特性使得代码更容易...

    Erlang(32,64)安装程序

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

Global site tag (gtag.js) - Google Analytics