多线程技术在博奕程序中的应用
禹晓辉 蒋晓冬 摘 要:如何在传统的博奕程序中引入Java多线程机制,以提高博奕树搜索效率,并给出了1个具体的应用实例。 线程是操作系统的一种新概念,是比传统进程粒度更小的可并发执行的单位。C和C++采用单线程体系结构,而Java却提供了多线程支持。一方面,Java环境本身就是多线程的;另一方面,Java语言内置多线程控制,提供了1个类Thread,由它负责启动、运行和终止线程,并可检查线程状态。Java的线程还包括了用于对多线程实行并发控制的同步原语。利用Java的多线程编程接口,可方便地构筑支持多线程的应用,提高程序的并发度和执行效率。 1 线程的概念及生命周期 所谓“线程”是“进程”中某个单一顺序的控制流。新兴的操作系统,如Macos、Windows NT等,均把线程视为其基本执行单位。线程也是Java中相当重要的组成部分,如任何1个Java Applet的Paint()和update()方法均由AWT绘图与事件处理线程所调用。图1表示了线程在它的生命周期中的任何时刻所能处的状态以及引起状态改变的方法。 图1 线程生命周期 2 博奕 博奕就是对策或斗智,它不仅存在于棋类游戏中,而且存在于政治、经济、军事和生物竞争之中。在人工智能领域,大多以下棋为例来研究博奕规律。博奕为人工智能提供了1个很好的试验场所,人工智能中的许多概念和方法都是从棋类程序中提炼而得,博奕的许多研究成果现已用于军事指挥和经济决策系统之中。 图2 博奕树局部 在2人零和非偶然性全信息博奕中(即对奕双方利益完全对立),对奕双方都力图在状态空间中找到1条使自己得分最多的路径。设所有使甲方获胜的终局为可解端结点,得分为+b;所有使乙方获胜的终局为不可解端结点,得分为-b;分别按甲方与乙方走法,从端结点向根可一步步推算出各中间结点和根结点的得分,这就是对博奕树的极小极大化分析法。 3 应用实例 基于上述思想,我们在IBM Visual Age for Java环境下开发了黑白棋博奕程序。下面给出该程序的主体架构及涉及多线程应用的相关代码。为便于理解有必要先将黑白棋规则作一下简要介绍。 |
图3 黑白棋规则 ②黑子若找不到使白棋变为黑色的走法,则必须放弃一步,由对方走棋;若找得到,则不能放弃该步。 图4 th-search 和 th-sleep 的运行状态 当Applet开始运行时,启动th-search线程,开始搜索;当玩家落子后,即启动th-sleep线程,并立刻执行sleep(5000),进行睡眠状态。th-search执行搜索。5s后,th-sleep醒来,要求th-search提供搜索结果,并由相关程序据此落子,而th-sleep则转为suspend状态,此时玩家在思考,而th-search的搜索也在进行。当对方落子后,又重新启动th-sleep线程,如此周而复始,直到程序结束。可以看出th-sleep实际上起到了1个计时器的作用。 4 结束语 由于引入了多线程技术,本软件取得了很好的效果。在IBM Pentium 75、32MB内存机器上,利用α—β剪枝方法构造博奕树,结果5s内平均搜索深度达4层,访问状态结点达7000个,与没采用多线程技术的程序相比,效率提高了1.5~2倍。实践证明,Java多线程机制具有很高的实用价值。事实上,由于多线程的核心思想即并行,因此,在基于多处理机的系统上,多线程机制的威力必将得到更大程度的发挥。此外,Java多线程技术的应用也不仅仅局限于上述的博奕领域,如何将Java多线程技术广泛应用到分布式系统中,是需要深入探讨的问题。 作者单位:南京大学计算机科学与信息系(210093) |