掌桥专利:专业的专利平台
掌桥专利
首页

基于Unity的图灵机虚拟仿真系统

文献发布时间:2023-06-19 16:12:48



技术领域

本发明涉及计算机虚拟仿真技术领域,尤其涉及一种基于Unity的图灵机虚拟仿真系统。

背景技术

对于每个计算机专业的学生来说,“图灵机”一词经常出现在他们的学习资料和授课老师的口中,几乎是计算机专业学生的必学知识点,在学生学习和理解计算机工作原理、算法过程、计算理论等课程内容时起到重要作用。图灵机(又称图灵计算机)是由英国数学家Alan Mathison Turing于1936年首次撰文提出的一种非常具有抽象理论意义的电子计算科学模型,为计算机诞生奠定了理论基础。图灵机不是一种具体的机器,而是一种思想模型,可制造一种十分简单但运算能力极强的计算装置,用来计算所有能想象得到的可计算函数。

图灵机是图灵受打字机的启发而假想出来的一种抽象机器,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人类进行数学运算,其处理对象是一条无限长的纸带。纸带被划分为一个个大小相等的小方格,每个小方格可以存放一个符号,有一个机器头在纸带上移来移去,机器头有一组内部状态,还有一些固定的程序。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动。

图灵提出图灵机的模型并不是为了同时给出计算机的设计,它有着如下重要意义,首先它已经充分证明了一种较为通用的随机计算模型理论,确定了一种直接实现一个计算机内部功能的方法可行性,同时它也充分提出了一种基于计算机内部结构所应有的主要计算架构。图灵机计算模型在结构设计中充分引入了一种读写与算法与程序语言的结合概念,极大的突破了过去的计算机器的设计理念。图灵机模型理论是计算学科最核心的理论,由于计算机极限计算能力就是通用图灵机的计算能力,很多问题可以转化到图灵机这个简单的模型来考虑。

利用图灵机模拟不同策略的算法不仅能更深入地理解图灵机,还能更好地从计算模型的角度研究算法。和从程序的角度理解算法相比,从计算模型的角度去模拟算法更能理解算法深层次的思想以及计算机在执行程序时的底层操作而不再局限于程序语句。图灵机虚拟仿真系统可以更形象地展示图灵机计算过程,帮助学生学习并理解图灵机工作原理,在教学过程中可以帮助老师更好地讲解图灵机。与通用图灵机相比,具体模拟到不同策略算法的图灵机在算法教学上能更好地帮助学生从计算模型的角度去更深入地理解算法。

对于建立图灵机的3D模型,Unity技术和开发平台是一种很好的选择。Unity3D版是由中国丹麦unity公司自行设计研制和自主开发的一款大型网络游戏软件开发工具,它主要使用了japhysx的基于粒子物理学的引擎,支持多种javescript、c#、boo脚本,它集成已经可以在所有应用平台、具备先进的超高延时激光照明处理系统、顶级彩色光照学和贴图处理技术、引入了众多脚本自动调试、应用领域覆盖范围广泛等出色的软件功能而使它不仅广泛应用于网络游戏类软件行业,也在城市建筑、医学和微成像和其他专业领域中都得到了广泛的的使用。

利用Unity3D技术可以实现获取该物体的一些信息,如位置信息等。此外还可以获得父物体或子物体的相关信息,并且利用MoveTowards函数,通过给定起始位置、结束位置及步长实现仿真过程中读写头、纸带的移动操作,同时还可以利用GetComponent方法实现挂在各个物体上的脚本间的通信,包括获得其他物体上脚本内的变量、调用其他脚本函数等操作。在UI设计中可以利用SceneManagement包与UI包实现用户通过UI选择所要模拟的算法时进行场景跳转的功能。

使用Unity开发的软件可以以WebGL的形式发布,最终实现无需下载、安装插件即可使用。WebGL(Web图形库)是一种用于在Web浏览器中渲染交互式3D图形的技术。该技术最突出的特点是它可以直接使用,而无需下载和安装任何第三方插件。2011年,WebGL技术由3D图形行业的领先者Khronos联盟进行了标准化,并且现在默认在所有主流浏览器中启用,但并非所有浏览器都是一样的。过去,WebGL只由Mozilla和Google这两个浏览器供应商提供,而其他供应商则不愿提供当时的最新技术。之后,情况发生了巨大变化,最终微软加入了3D Web俱乐部。如今,几乎所有Internet流量都通过支持WebGL的客户端软件进行,从而使该技术成为向4亿以上的用户提供交互式3D内容的强大而广泛的基础。WebGL通过结合OpenGL ES 2.0与JavaScript使得用户可以通过HTML5中的Canvas元素在网页上渲染3D模型。WebGL形式有着跨平台的优势,因此对于一些轻量级的应用发布成WebGL形式是非常合适的,不会因为性能原因使系统产生卡顿。

在图灵机模拟方向上,目前大多都仅实现了抽象的图灵机模拟仅采用显示状态转移及纸带上的方格,进行3D建模实现虚拟仿真的图灵机较少。从实现角度上来看国内外实现的多为通用图灵机以及模拟较为简单的算法的图灵机,如模拟一元加法的图灵机。国内在本科教学中大多都以图片的形式展现图灵机,对于学生的课题设计中仅要求模拟出只用文字显示状态纸带等信息的通用图灵机即可。

在国内部分学者的研究中有基于sendmail仿真图灵机也有设计通用图灵机。这些都仅模拟了通用图灵机或者简单的算法如:一元加法、简单的判定机等,并且结果要么以文字形式呈现要么仅进行设计却没给出具体的仿真结果。国外以斯坦福哲学百科全书中的图灵机为例有模拟了抽象的简单算法的图灵机,也有进行制作一个真实存在的机器模拟图灵机。这些都只模拟了较为简单的算法如:一元加法、求素数、可除数等。无论是为了科研仿真如David Gajser在验证单带图灵机是否能在线性时间内运行时进行了简单仿真,还是为了提供一个模拟图灵机的模型,伴有3D模型的虚拟仿真及对一些复杂的算法进行模拟都是较为少见的。

发明内容

本发明要解决的技术问题是针对上述现有技术的不足,提供一种基于Unity的图灵机虚拟仿真系统,实现图灵机的虚拟仿真。

为解决上述技术问题,本发明所采取的技术方案是:基于Unity的图灵机虚拟仿真系统,其特征在于:包括图灵机建模模块、图灵机读写动作与状态转移的设计模块、UI设计模块、状态转移方程设计模块、算法复杂度计算模块和基于WebGL的优化模块;所述图灵机建模模块根据任务需求基于Unity对图灵机进行建模,构建图灵机模型;所述图灵机读写动作与状态转移的设计模块用于实现图灵机读写动作和状态转移的设计;所述UI设计模块用于设计图灵机的UI界面;所述状态转移方程设计模块计用于设计图灵机实现任务需求的状态转移方程,进而通过图灵机完成任务需求;所述算法复杂度计算模块用于计算实现任务需求的算法复杂度;所述基于WebGL的优化模块将图灵机虚拟仿真系统发布成WebGL形式,并在发布后利用node.js部署在服务器上,最终实现通过网页端能够访问图灵机虚拟仿真系统。

所述图灵机建模模块根据任务需求基于Unity对图灵机进行建模的具体方法为:

设定的图灵机任务需求为实现一元加法、二分搜索图灵机算法、二分搜索递归算法、可拆分背包贪心算法和0-1背包动态规划算法五种算法;

确定图灵机的读写头及图灵机框架模型;

利用3dsMax对图灵机的纸带、读写头和有限状态自动机进行建模;建模后导出FBX模型再导入Unity赋予材质,最终加以设计完成建模的工作;

在Unity中将利用3dsMax建模后的纸带、读写头和有限状态自动机各部分绑定在一起,构成整体的图灵机模型;并添加显示自动机状态及纸带内容的text组件;

为了便于用户直观地观察到图灵机的工作过程,将图灵机设计成三读写头和三纸带模型,包括输入读写头、工作读写头、输出读写头、输入纸带、工作纸带、输出纸带、自动机和状态转移显示屏。

所述图灵机读写动作与状态转移的设计模块设计控制读写头脚本、更新纸带内容脚本、控制纸带移动脚本、状态转移脚本、状态显示脚本、模拟函数调用脚本以及单位时间访问数组用于实现图灵机读写动作和状态转移;

所述控制读写头脚本用于控制读写头上下移动仿真模拟读写操作;首先在Unity场景中创建一个空物体,作为读写头移动的目标位置;通过MoveTowards()函数给定读写头的起始位置、目标位置及步长,实现改变读写头位置,使得读写头在目标位置与起始位置间往复移动;当读写头移动到目标位置时将向状态转移脚本发送信号开始进行状态转移,当读写头移动回初始位置时将向控制纸带移动脚本发送信号,开始移动纸带;

所述更新纸带内容脚本用于管理纸带上数据,对外提供setBST()和getBST()两个接口,setBST()通过给定写入位置与写入数据来修改纸带上目标位置元素,getBST()通过给定指定位置来获取指定位置上纸带数据;每次得到状态转移脚本的更新纸带内容信号后进行更新当前场景显示的纸带数据;

所述控制纸带移动脚本用于控制纸带移动;调用状态转移脚本提供的接口getI()通过给定纸带名称来获取当前纸带应移动到的目标位置,在收到移动纸带信号后开始移动纸带,移动到目标位置后发送信号给读写头使其落下模拟下一次读写操作;

所述状态转移脚本用于控制图灵机状态转移和切换输入、工作和输出纸带以及读写头;每次状态转移过程为,首先修改当前纸带上的内容,然后再更新当前纸带位置,之后发出信号允许纸带更新内容并使读写头升起回到初始位置,最后移动纸带、选定下个状态所用纸带,并且更新图灵机状态;在该脚本内部定义了变量nowTape用于确定当前纸带与读写头是输入、工作或输出纸带与读写头;同时定义变量inputI、workI和outputI用于标记输入、工作和输出纸带当前读写位置;

所述状态显示脚本利用继承至GameObject类的GetComponent方法调用状态转移脚本提供的接口getState()获取图灵机状态,并且显示在状态显示屏上;

所述模拟函数调用脚本将纸带数据移动到视角外进行更新,以达到模拟函数调用过程;在场景中创建一个空物体作为纸带移动的目标位置;利用MoveTowards()函数以实现读写头在目标位置与初始位置间的往复运动;对于递归调用仅将纸带上数据更新为下一层递归输入的参数,对应排序的调用直接更新为排序后的结果;

所述单位时间访问数组分为在确定状态转移下实现、在不确定状态转移下实现和切换纸带下实现这三种情况;对于确定状态转移下的单位时间访问数组实现仅需在执行纸带左移右移操作时直接移动到根据数组下标定位的位置;对于不确定状态转移与切换纸带这两种情况,则需要在进入下一状态前修改定位变量inputI、workI和outputI,并调用控制纸带移动脚本提供的接口控制纸带移动,然后进入下一状态。

所述UI设计模块具体用于设计算法选择界面、算法模拟界面以及实现算法说明与交互功能;

所述算法选择界面设计五个按钮用于选择所要模拟的算法,通过调用Unity中SceneManager包实现点击按钮进行场景跳转的功能;

所述算法模拟界面用于显示算法模拟时各纸带数据、时间复杂度、空间复杂度和返回算法选择页面的按钮,通过小窗显示三条纸带正在读写的位置,并提供了算法模拟开始/暂停、加速和减速按钮,具体方法为:

调用更新纸带内容脚本提供的接口读取纸带上的数据并显示在界面中对应的Text构件上;

小窗显示采用了设置三个摄像机分别对应着三条纸带的中央位置,利用相机属性中的render texture获得相机的视角,并将相机的视角渲染到界面中的图片实现利用小窗显示纸带正在读写位置的数据;

在二分搜索递归算法中还需实现在界面中显示递归栈,即每次调用压入递归栈的数据;通过执行状态call时将low、high和mid按顺序入栈,并在return时遵循先进后出的原则出栈;在小规模0-1背包动态规划算法中还在界面中通过二维表动态显示二维数组中的数据;

所述实现算法说明与交互功能的具体方法为:在算法选择界面选择要模拟的算法后,给出所选定算法的相关说明,当用户阅读完毕点击继续按钮观看算法模拟过程;并且在算法说明页面利用UI中的InputField组件提供了输入功能,使用户在该页面自行输入初始输入纸带数据;

所述算法复杂度计算模块用于计算图灵机模拟五种算法的复杂度的具体方法为:

在控制读写头移动脚本中,新增变量num1并初始化为0,当读写头落下移动至目标位置时令num1+1,并提供返回num1值的接口用于给出时间复杂度;

在更新纸带内容脚本中添加vis数组,用于标记工作纸带上各位置是否被使用;并增加将所用到的工作纸带方格数量传出的接口,在UI中实时显示算法复杂度。

所述状态转移方程设计模块通过设计一元加法自动机、二分搜索图灵机算法自动机、二分搜索递归算法自动机、可拆分背包贪心算法自动机和0-1背包动态规划算法自动机完成图灵机的任务需求;

所述一元加法自动机通过0、1、10、11四个状态实现一元加法的模拟;

所述二分搜索图灵机算法自动机构建13个状态用于实现二分搜索图灵机算法的模拟;13个状态分别为:initLow,从输入纸带上读取待搜索区间数组A的初始下标low;writeLow,写入low到工作纸带上;initHigh,从输入纸带上读取待搜索区间数组的结束下标high;writeHigh,写入high到工作纸带上;compareLow,将high和low进行比较,如果low>high则停机;calMid,将low和high的中间值mid写入到工作纸带上;readMid,在输入纸带上读取mid位置的数组元素A[mid];compareMid,比较mid位置的数组元素A[mid]和目标搜索元素x,如果A[mid]=x,则搜索成功,如果A[mid]>x,则更新high,如果A[mid]high则停机;updateHigh,更新工作纸带上的high为mid-1;success,搜索成功;stop,停机;

所述二分搜索递归算法自动机在二分搜索图灵机算法自动机的状态基础上,减少initLow,initHigh,writeLow,writeHigh这四个状态,增加递归调用所使用的call和return两个状态,构建二分搜索递归算法自动机的11个状态;直接从输入纸带上读取参数low和high,计算得出的mid仍记录在工作纸带上;并且将更新low和high这个状态合并到递归调用中,直接根据A[mid]与x的比较结果将参数传入下次递归调用;

所述可拆分背包贪心算法自动机通过12个状态实现可拆分背包贪心算法的模拟,12个状态分别为:readCapacity读取输入纸带的背包容量;writeCapacity写入背包容量到工作纸带上;readWeight读取输入纸带上的物体重量;readValue读取输入纸带上的物体价值;writeAverage写入物体价值与重量的比到工作纸带上;writeNum写入物体序号到工作纸带上;sort对各物体按价值重量比进行排序;readNum读取工作纸带上的物体序号;readC读取物体序号对应的输入纸带上的重量;subBag将背包容量减去已装入的物体重量并在工作纸带上进行更新;writeAns写入解向量到输出纸带上;success算法模拟结束;

所述0-1背包动态规划算法通过14个状态实现0-1背包动态规划算法的模拟;14个状态分别为:readCapacity读取输入纸带上背包的容量;readNum读取输入纸带上物体的数量;readWeight读取输入纸带上物体的重量;readValue读取输入纸带上物体的价值;writeM(i,j)将装入物体信息的最优解写入到工作纸带的位置(i,j)上;readM(i+1,j)读取工作纸带(i+1,j)位置上的装入物体信息;readW(i)读取输入纸带上第i个物体的重量;calM(i+1,j-weight)读取工作纸带上(i+1,j-weight)位置的物体信息的最优解;ansM(i,j)读取工作纸带上装入当前物体的最优解;cmpAnsM(i,j)读取工作纸带上的M(i+1,j)和M(i,j)进行比较;writeAns(i-1)写入解向量到输出纸带上;writeAns(num)写入解向量到输出纸带的num位置上;cmp将装入当前物体的最优解与不装入当前物体的最优解进行比较;success算法模拟结束;

其中,i,j表示存放物体数据的二维数组M中的位置坐标(i,j),weight表示物体重量,num表示物体序号,i取值从0到物体数量+1,j取值从0到物体数量-1。

所述一元加法自动机实现一元加法模拟的具体方法为:

步骤101:构建一元加法自动机四个状态:0、1、10、11;

步骤102:一元加法自动机状态为0时,工作读写头尚未读取到第一个加数;当状态为0时,工作读写头如果读取到0,则工作纸带右移状态不变直至读取头读取到1时,一元加法自动机状态转移为1;

步骤103:一元加法自动机状态为1时,说明图灵机的工作读写头正在读取第一个数,当工作读写头读取到0时,说明第一个数已经读取完毕,此时将工作纸带上读取到的0改写为1,一元加法自动机转入状态10;

步骤104:一元加法自动机状态为10时,说明图灵机的工作读写头正在读取第二个数,当读取到0时,说明第二个数也已经读完,此时将工作纸带左移并将一元加法自动机状态转移为11;

步骤105:一元加法自动机状态为11时将工作纸带上最后一个1改写为0,图灵机自动停机;

步骤106:为了更易于观察,将一元加法自动机最后一个状态11进行了改写;改为工作读写头读到1时,将工作纸带上的1改为0,工作纸带右移,读到0时,图灵机停机。

所述二分搜索图灵机算法自动机实现二分搜索图灵机算法模拟的具体方法为:

步骤201:构建二分搜索图灵机算法自动机的13个状态,分别用于参数初始化、计算比较mid、更新参数和返回结果;

步骤202:通过状态initLow、writeLow、initHigh和writeHigh读取输入纸带上的low和high写入到工作纸带上;

步骤203:通过compareLow、compareHigh、calMid、readMid、compareMid、updateLow和updateHigh这7个状态进行迭代二分搜索;首先通过状态compareLow与compareHigh比较low和high的大小来判断是否继续迭代,如果low>high则停止迭代,转移至状态stop,否则转移至状态calMid;再通过状态calMid计算中间值mid定位到A[mid]位置后,二分搜索图灵机算法自动机的状态转移至readMid状态,读取A[mid],状态转移至状态compareMid,根据读取到的A[mid]与输入的目标搜索元素x比较,最后根据比较结果更新参数high或low进行下一轮迭代或终止迭代;

如果A[mid]=x,则终止迭代,二分搜索图灵机算法自动机的状态转为success;如果A[mid]>x,则状态转移到updateHigh更新参数high继续迭代;如果A[mid]

步骤204:通过success和stop状态模拟图灵机的return操作;当A[mid]=x时,二分搜索图灵机算法自动机的状态转移至状态success,并将此时的mid写入输出纸带上作为返回值,表示搜索到目标搜索元素,搜索成功,当low>high时,转移至状态stop,并将-1写入输出纸带,表示搜索失败没有目标搜索元素;

所述可拆分背包贪心算法自动机实现可拆分背包贪心算法模拟的具体方法为:

步骤301:构建可拆分背包贪心算法自动机的12个状态;

步骤302:通过readCapacity与writeCapacity状态初始化背包容量,即将背包容量从输入纸带读出写入到工作纸带上;

步骤303:通过readWeight、readValue、writeAverage和writeNum四个状态构成第一个循环用于不断读取物体重量、价值,计算物体价值重量比并将物体序号和价值重量比写入工作带中;

步骤304:读取物体重量读入#时,标志着已经读完所有物体,此时可拆分背包贪心算法自动机状态转移到状态sort,对各物体按价值重量比排序;

步骤305:通过readNum、readC、subBag和writeAns四个状态对已经排好序的物体按序装入背包;当背包容量小于各物体总重量时,将此时价值重量比最大的物体部分装入背包,然后跳转到状态success,算法模拟结束;

步骤306:处理readWeight和writeAns两个不确定状态转移;对于可拆分背包贪心算法自动机也有两个不确定状态转移,即readWeight和writeAns;对于readWeight状态在读写头读到数字和#时,分别转移到继续读取价值的readValue状态和对各物体排序的sort状态;对于writeAns状态的状态转移,主要取决于执行他的上一个状态subBag时,是否将背包装满,如未装满则在输出纸带上物体所在数组中的对应位置写入1并继续迭代执行装入背包的过程,如装满则在对应位置写入装入百分比,并转移到状态success,算法仿真结束;

步骤307:返回一个X={X1,X2,X3,…Xn}的解向量,其中,Xn为装入背包中的第n个物体,n为背包中装入物体的个数;

所述0-1背包动态规划算法自动机实现0-1背包动态规划算法模拟的具体方法为:

步骤401:构建0-1背包动态规划算法自动机的14个状态;

步骤402:将readCapacity状态作为0-1背包动态规划算法自动机工作的开始状态,此时读入背包容量(capacity)并将输入纸带右移1格,然后转移至状态readNum;

步骤403:0-1背包动态规划算法自动机在状态readNum时,输入读写头将读入物体序号num并将输入纸带右移至num*2位置处,转移至状态readWeight;

步骤404:0-1背包动态规划算法自动机在readWeight状态时,输入读写头读取weight,输入纸带右移1格,转移至状态readValue;在状态readValue时,输入读写头读取value,输入纸带左移3格;

步骤405:0-1背包动态规划算法自动机状态转移至状态writeM(i,j)或状态readM(i+1,j);当i=num时,转移至writeM(i,j),其余时刻转移至readM(i+1,j);对i=num时,将工作读写头读写的物体的价值数据写入到二维数组时,仅需关注当前物体是否能装入,能装入则在二维数组中填入当前物体价值,无法装入则填0;

步骤406:0-1背包动态规划算法自动机在状态writeM(i,j)时,将当前装入背包的物体价值最大的最优解填入对应位置;对于状态writeM(i,j)有三种转移路线;

当i=num时,工作读写头转移至工作纸带上M(num,j)的位置,工作纸带右移1格并使j+1,直至j=capacity,0-1背包动态规划算法自动机状态转移至状态readWeight读取下一物体信息;

当j=capacity时,工作纸带左移至(i-1)*(capacity+1)处,同时0-1背包动态规划算法自动机状态转移至状态readWeight,并且切换至输入纸带与输入读写头;

当i不等于num时,0-1背包动态规划算法自动机状态转移至状态read(i+1,j)直至j=capacity时;而当i=1且j=capacity时,转移至状态readW(i)开始递推求解向量操作并切换至输出纸带与输出读写头;

步骤407:0-1背包动态规划算法自动机在状态readM(i+1,j)时,对于背包能装下当前物体时应考虑装入当前物体收益大还是不装收益大;因此,当j>=weight时,转移至状态calM(i+1,j-weight),读取装入当前物体价值最大的最优解并将其与当前物体价值相加并与不装入当前物体时价值最大的最优解进行比较,得出最优解并填入二维数组下标(i+1,j-weight)的位置;

步骤408:当0-1背包动态规划算法自动机状态从状态readM(i+1,j)转移至状态calM(i+1,j-weight)时,工作纸带右移至对应位置i*(capacity+1)+mj-weight处;当当前物体装不进背包时,即j

步骤409:对于状态calM(i+1,j-weight),工作纸带右移至i*(capacity+1)处,转移至状态cmp;通过状态cmp进行比较,进而求得当前装入物体的价值最大的最优解,工作纸带左移至(i,j)对应位置,转移至状态writeM(i,j);

步骤410:0-1背包动态规划算法自动机在readW(i)状态时,递推计算装入背包的物体序号并写入解向量;

通过readW(i)状态将读取第i个物体重量,工作纸带右移2格,转移至状态ansM(i,j),同时切换为工作纸带与工作读写头;

通过状态ansM(i,j)读入当前装入物体的价值最大的最优解,工作纸带右移capacity+1格,转移至状态cmpAnsM(i,j);

通过状态cmpAnsM(i,j)将读取M(i+1,j)与M(i,j)进行比较,如果相同则说明该物体没被装入背包,转移至状态readW(i),如果不相同则说明该物体装入了背包,工作纸带左移weight格,转移至状态writeAns(i-1),并切换为输出读写头与输出纸带;

通过状态writeAns(i-1)将是否装入物体的1或0写入解向量,并转移至状态readW(i),同时切换至输入纸带与输入读写头;当i=num时,从状态ansM(i,j)直接转移至writeAns(num)状态,并根据M(i,j)是否为0判断该物体是否装入背包并填写解向量,最终转移至状态success,算法模拟完毕;

步骤411:返回一个Y={Y1,Y2,Y3,…,Ym}的解向量,其中,Ym为输出纸带上输出的解,m为解的个数。

采用上述技术方案所产生的有益效果在于:本发明提供的基于Unity的图灵机虚拟仿真系统,通过利用图灵机读写字符、状态转移实现对算法的仿真模拟,最终以3D动画的形式呈现出图灵机模拟算法的过程并展示算法所耗费的时间与空间。为实现图灵机模拟算法,对图灵机进行建模,设计图灵机进行读写及状态转移的动作,记录图灵机读写次数及所耗费纸带方格数来计算算法复杂度。利用图灵机模拟算法时,对不同的算法设计了不同的状态转移方程。同时,考虑到不同平台的设备性能及运行环境各不相同,为了提高使用便携性,基于WebGL技术将系统发布成WebGL形式。

本发明的图灵机虚拟仿真系统实现了图灵机算法模拟的功能,算法模拟不仅能够利用模拟多种经典算法的执行过程,而且还能够模拟递归函数调用过程。为了尽可能的便携使用、适应各平台不同设备,将系统发布成WebGL形式,在保证系统功能完整的情况下,最终将系统部署到网页端,提供能够便携、可靠、免安装、快速的图灵机虚拟仿真系统。

附图说明

图1为本发明实施例提供的基于Unity的图灵机虚拟仿真系统的结构框图;

图2为本发明实施例提供的使用图灵机虚拟仿真系统进行一元加法模拟计算的流程图;

图3为本发明实施例提供的使用图灵机虚拟仿真系统进行二分搜索图灵机算法模拟计算的流程图;

图4为本发明实施例提供的使用图灵机虚拟仿真系统进行二分搜索递归算法模拟计算的流程图;

图5为本发明实施例提供的使用图灵机虚拟仿真系统进行可拆分背包贪心算法模拟计算的流程图;

图6为本发明实施例提供的使用图灵机虚拟仿真系统进行0-1背包动态规划算法模拟计算的流程图;

图7为本发明实施例提供的一元加法模拟效果图;

图8为本发明实施例提供的二分搜索图灵机算法模拟效果图;

图9为本发明实施例提供的二分搜索递归算法模拟效果图;

图10为本发明实施例提供的可拆分背包贪心算法模拟效果图;

图11为本发明实施例提供的0-1背包动态规划算法效果图。

具体实施方式

下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。

本实施例中,基于Unity的图灵机虚拟仿真系统,如图1所示,包括图灵机建模模块、图灵机读写动作与状态转移的设计模块、UI设计模块、状态转移方程设计模块、算法复杂度计算模块和基于WebGL的优化模块;所述图灵机建模模块根据任务需求基于Unity对图灵机进行建模,构建图灵机模型;所述图灵机读写动作与状态转移的设计模块用于实现图灵机读写动作和状态转移的设计;所述UI设计模块用于设计图灵机的UI界面;所述状态转移方程设计模块计用于设计图灵机实现任务需求的状态转移方程,进而通过图灵机完成任务需求;所述算法复杂度计算模块用于计算实现任务需求的算法复杂度;所述基于WebGL的优化模块将图灵机虚拟仿真系统发布成WebGL形式,并在发布后利用node.js部署在服务器上,最终实现通过网页端能够访问图灵机虚拟仿真系统。

所述图灵机建模模块基于Unity对图灵机进行建模,具体方法为:

设定图灵机的任务需求,并依据任务需求对图灵机进行建模;设定的图灵机任务需求为实现一元加法、二分搜索图灵机算法、二分搜索递归算法、可拆分背包贪心算法和0-1背包动态规划算法五种算法;

确定图灵机的读写头及图灵机框架模型;

利用3dsMax对图灵机的纸带、读写头和有限状态自动机进行建模;建模后导出FBX模型再导入Unity赋予材质,最终加以设计完成建模的工作;

在Unity中将利用3dsMax建模后的纸带、读写头和有限状态自动机各部分绑定在一起,构成整体的图灵机模型;并添加显示自动机状态及纸带内容的text组件;

同时,为了便于用户直观地观察到图灵机的工作过程,将图灵机设计成三读写头和三纸带模型,包括输入读写头、工作读写头、输出读写头、输入纸带、工作纸带、输出纸带、自动机和状态转移显示屏。

所述图灵机读写动作与状态转移的设计模块用于实现图灵机读写动作和状态转移的设计,具体包括:

设计控制读写头脚本;该脚本用于控制读写头上下移动仿真模拟读写操作;首先在Unity场景中创建一个空物体,作为读写头移动的目标位置;通过MoveTowards()函数给定读写头的起始位置、目标位置及步长,实现改变读写头位置,使得读写头在目标位置与起始位置间往复移动;当读写头移动到目标位置时将向状态转移脚本发送信号开始进行状态转移,当读写头移动回初始位置时将向控制纸带移动脚本发送信号,开始移动纸带;

设计更新纸带内容脚本;该脚本用于管理纸带上数据,对外提供setBST()和getBST()两个接口,setBST()通过给定写入位置与写入数据来修改纸带上目标位置元素,getBST()通过给定指定位置来获取指定位置上纸带数据;每次得到状态转移脚本的更新纸带内容信号后进行更新当前场景显示的纸带数据;

设计控制纸带移动脚本;该脚本用于控制纸带移动;调用状态转移脚本提供的接口getI()通过给定纸带名称来获取当前纸带应移动到的目标位置,在收到移动纸带信号后开始移动纸带,移动到目标位置后发送信号给读写头使其落下模拟下一次读写操作;

设计状态转移脚本;该脚本用于控制状态转移和切换输入、工作和输出纸带以及读写头;每次状态转移过程为,首先修改当前纸带上的内容(读取数据或写入数据),然后再更新当前纸带位置(即getI()所得到的i,用于确定下一个读写方格位置),之后发出信号允许纸带更新内容并使读写头升起回到初始位置,最后移动纸带、选定下个状态所用纸带(即选择下次使用输入、工作或输出纸带)并且更新图灵机状态;在该脚本内部定义了变量nowTape用于确定当前纸带与读写头是输入、工作或输出纸带与读写头;同时定义变量inputI、workI和outputI用于标记输入、工作和输出纸带当前读写位置;

设计状态显示脚本;利用继承至GameObject类的GetComponent方法调用状态转移脚本提供的接口getState()无需给定输入即可时刻获取图灵机状态,并且显示在状态显示屏上;

设计模拟函数调用脚本;采取了将纸带数据移动到视角外进行更新,以达到模拟函数调用过程;在场景中创建一个空物体作为纸带移动的目标位置;利用MoveTowards()函数以实现读写头在目标位置与初始位置间的往复运动;对于递归调用仅将纸带上数据更新为下一层递归输入的参数,对应排序的调用直接更新为排序后的结果;

设计单位时间访问数组;对于单位时间访问数组的需求分为在确定状态转移下实现、在不确定状态转移下实现和切换纸带下实现这三种情况;对于确定状态转移下的单位时间访问数组实现仅需在执行纸带左移右移操作时直接移动到根据数组下标定位的位置;对于不确定状态转移与切换纸带这两种情况,则需要在进入下一状态前修改定位变量inputI、workI和outputI,并调用控制纸带移动脚本提供的接口控制纸带移动,然后进入下一状态。

UI设计模块用于设计图灵机的UI界面,具体包括:

设计算法选择界面;算法选择界面设计五个按钮用于选择所要模拟的算法,通过调用Unity中SceneManager包实现点击按钮进行场景跳转的功能;

设计算法模拟界面;用于显示算法模拟时各纸带数据、时间复杂度、空间复杂度和返回算法选择页面的按钮,并通过小窗显示三条纸带正在读写的位置,具体方法为:

一、调用更新纸带内容脚本提供的接口读取纸带上的数据并显示在界面中对应的Text构件上;时间复杂度和空间复杂度的显示也采用了类似的实现方法。返回按钮与步骤1中的按钮采用了同种方式实现。

二、小窗显示采用了设置三个摄像机分别对应着三条纸带的中央位置,利用相机属性中的render texture获得相机的视角,并将相机的视角渲染到界面中的图片实现利用小窗显示纸带正在读写位置的数据,解决了直接观察纸带数据不清晰的问题。

三、在二分搜索递归算法中还需实现在界面中显示递归栈,即每次调用压入递归栈的数据;通过执行状态call时将low、high和mid按顺序入栈,并在return时遵循先进后出的原则出栈;在小规模0-1背包动态规划算法中还在界面中动态显示二维表;

实现算法说明与交互功能;在选择算法模拟页面后,给出所选定算法的相关说明,当用户阅读完毕点击继续按钮观看算法模拟过程;并且在算法说明页面利用UI中的InputField组件提供了输入功能,使用户在该页面自行输入初始输入纸带数据,并给出了一定的引导;在算法模拟页面提供了开始/暂停、加速和减速按钮;

所述状态转移方程设计模块用于实现五种算法的状态转移方程,包括以下步骤:

步骤1:设计一元加法自动机;

步骤1.1:构建一元加法自动机四个状态:0、1、10、11;

步骤1.2:一元加法自动机状态为0时,工作读写头尚未读取到第一个加数,即a+b中的a;当状态为0时,工作读写头如果读取到0,则工作纸带右移状态不变直至工作读取头读取到1时,一元加法自动机状态转移为1;

步骤1.3:一元加法自动机状态为1时,说明图灵机的工作读写头正在读取第一个数,当工作读写头读取到0时,说明第一个数已经读取完毕,此时将工作纸带上读取到的0改写为1,一元加法自动机转入状态10;

步骤1.4:一元加法自动机状态为10时,说明图灵机的工作读写头正在读取第二个数,当读取到0时,说明第二个数也已经读完,此时将纸带左移并将一元加法自动机状态转移为11;

步骤1.5:一元加法自动机状态为11时将工作纸带上最后一个1改写为0,图灵机自动停机;

步骤1.6:为了更易于观察,将一元加法自动机最后一个状态11进行了改写;改为工作读写头读到1时,将纸带上的1改为0,纸带右移,读到0时,图灵机停机。

步骤2:设计二分搜索图灵机算法自动机;

步骤2.1:构建二分搜索图灵机算法自动机的13个状态,分别用于参数初始化、计算比较mid、更新参数和返回结果;

二分搜索图灵机算法自动机的13个状态分别为:initLow,从输入纸带上读取待搜索区间数组A的初始下标low;writeLow,写入low到工作纸带上;initHigh,从输入纸带上读取待搜索区间数组的结束下标high;writeHigh,写入high到工作纸带上;compareLow,将high和low进行比较,如果low>high则停机;calMid,将low和high的中间值mid写入到工作纸带上;readMid,在输入纸带上读取mid位置的数组元素A[mid];compareMid,比较mid位置的数组元素A[mid]和目标搜索元素x,如果A[mid]=x,则搜索成功,如果A[mid]>x,则更新high,如果A[mid]high则停机;updateHigh,更新工作纸带上的high为mid-1;success,搜索成功;stop,停机;

步骤2.2:通过状态initLow、writeLow、initHigh和writeHigh读取输入纸带上的low和high写入到工作纸带上;此阶段主要用于将输入纸带上的初始参数low、high写入工作纸带便于二分搜索时使用;

步骤2.3:通过compareLow、compareHigh、calMid、readMid、compareMid、updateLow和updateHigh这7个状态进行迭代二分搜索;首先通过状态compareLow与compareHigh比较low和high的大小来判断是否继续迭代,如果low>high则停止迭代,转移至状态stop,否则转移至状态calMid;再通过状态calMid计算中间值mid定位到A[mid]位置后,二分搜索图灵机算法自动机的状态转移至readMid状态,读取A[mid],状态转移至状态compareMid,根据读取到的A[mid]与输入的目标搜索元素x比较,最后根据比较结果更新参数high或low进行下一轮迭代或终止迭代;

如果A[mid]=x,则终止迭代,二分搜索图灵机算法自动机的状态转为success;如果A[mid]>x,则状态转移到updateHigh更新参数high继续迭代;如果A[mid]

在步骤2.3中二分搜索图灵机算法自动机存在不确定状态转移如:比较A[mid]与x的大小关系时,有三个转移分支,分别为二者相等时,二分搜索图灵机算法自动机状态转移到success状态,表明搜索成功;A[mid]x时目标搜索元素在mid左侧,所以状态转移到updateHigh更新high;二分搜索图灵机算法自动机在compareHigh与compareLow状态时,如果low>high则转移至状态stop,否则转移至状态calMid。

步骤2.4:通过success和stop状态模拟图灵机的return操作;当A[mid]=x时,二分搜索图灵机算法自动机的状态转移至状态success,并将此时的mid写入输出纸带上作为返回值,表示搜索到目标搜索元素,搜索成功,当low>high时,转移至状态stop,并将-1写入输出纸带,表示搜索失败没有目标搜索元素;

步骤3:设计二分搜索递归算法自动机;

针对步骤2设计的二分搜索图灵机算法自动机进行修改,减少initLow,initHigh,writeLow,writeHigh这四个初始化low、high、compareLow和更新参数的状态,增加递归调用所使用的call和return两个状态,构建二分搜索递归算法自动机的11个状态;直接从输入纸带上读取参数low和high,计算得出的mid仍记录在工作纸带上;并且将更新low和high这个状态合并到递归调用中,直接根据A[mid]与x的比较结果将参数传入下次递归调用即可不需要更新high和low;

步骤4:设计可拆分背包贪心算法自动机;

步骤4.1:构建可拆分背包贪心算法自动机的12个状态:readCapacity、writeCapacity、readWeight、readValue、writeAverage、writeNum、sort、readNum、readC、subBag和writeAns、success;

其中,readCapacity读取输入纸带的背包容量;writeCapacity写入背包容量到工作纸带上;readWeight读取输入纸带上的物体重量;readValue读取输入纸带上的物体价值;writeAverage写入物体价值与重量的比到工作纸带上;writeNum写入物体序号到工作纸带上;sort对各物体按价值重量比进行排序;readNum读取工作纸带上的物体序号;readC读取物体序号对应的输入纸带上的重量;subBag将背包容量减去已装入的物体重量并在工作纸带上进行更新;writeAns写入解向量到输出纸带上;success算法模拟结束;

步骤4.2:通过readCapacity与writeCapacity状态初始化背包容量,即将背包容量从输入纸带读出写入到工作纸带上;

步骤4.3:通过readWeight、readValue、writeAverage和writeNum四个状态构成第一个循环用于不断读取物体重量、价值,计算物体价值重量比并将物体序号和价值重量比写入工作带中;

步骤4.4:读取物体重量读入#时,标志着已经读完所有物体,此时可拆分背包贪心算法自动机状态转移到状态sort,对各物体按价值重量比排序;

步骤4.5:通过readNum、readC、subBag和writeAns四个状态对已经排好序的物体按序装入背包;当背包容量小于各物体总重量时,将此时价值重量比最大的物体部分装入背包,然后跳转到状态success,算法模拟结束;

步骤4.6:处理readWeight和writeAns两个不确定状态转移;对于可拆分背包贪心算法自动机也有两个不确定状态转移,即readWeight和writeAns;对于readWeight状态在读写头读到数字和#时,分别转移到继续读取价值的readValue状态和对各物体排序的sort状态;对于writeAns状态的状态转移,主要取决于执行他的上一个状态subBag时,是否将背包装满,如未装满则在输出纸带上物体所在数组中的对应位置写入1并继续迭代执行装入背包的过程,如装满则在对应位置写入装入百分比,并转移到状态success,算法仿真结束;

步骤4.7:返回一个X={X1,X2,X3,…Xn}的解向量,其中,Xn为装入背包中的第n个物体,n为背包中装入物体的个数;

步骤5:设计0-1背包动态规划算法自动机;

步骤5.1:构建readCapacity、readNum、readWeight、readValue、writeM(i,j)、readM(i+1,j)、readW(i)、calM(i+1,j-weight)、ansM(i,j)、cmpAnsM(i,j)、writeAns(i-1)、writeAns(num)、cmp、success14个状态;

其中,i,j表示存放物体数据的二维数组M中的位置坐标(i,j),weight表示物体重量,num表示物体序号,i取值从0到物体数量+1,j取值从0到物体数量-1;

readCapacity读取输入纸带上背包的容量;readNum读取输入纸带上物体的数量;readWeight读取输入纸带上物体的重量;readValue读取输入纸带上物体的价值;writeM(i,j)将装入物体信息的最优解写入到工作纸带的位置(i,j)上;readM(i+1,j)读取工作纸带(i+1,j)位置上的装入物体信息;readW(i)读取输入纸带上第i个物体的重量;calM(i+1,j-weight)读取工作纸带上(i+1,j-weight)位置的物体信息的最优解;ansM(i,j)读取工作纸带上装入当前物体的最优解;cmpAnsM(i,j)读取工作纸带上的M(i+1,j)和M(i,j)进行比较;writeAns(i-1)写入解向量到输出纸带上;writeAns(num)写入解向量到输出纸带的num位置上;cmp将装入当前物体的最优解与不装入当前物体的最优解进行比较;success算法模拟结束;

步骤5.2:readCapacity状态作为0-1背包动态规划算法自动机工作的开始状态,此时读入背包容量(capacity)并将输入纸带右移1格,然后转移至状态readNum;

步骤5.3:0-1背包动态规划算法自动机在状态readNum时,输入读写头将读入物体序号num并将输入纸带右移至num*2位置处(每个物体信息由两格存储,第1格重量、第2格价值,并且纸带第0格与第1格存储capacity与num,所以最后一个物体重量应存储在num*2处),转移至状态readWeight;

步骤5.4:0-1背包动态规划算法自动机在readWeight状态时,输入读写头读取weight,输入纸带右移1格,转移至状态readValue;在状态readValue时,输入读写头读取value,输入纸带左移3格(移至前一个物体的重量存储位置,以便下次使用);

步骤5.5:0-1背包动态规划算法自动机状态转移至状态writeM(i,j)或状态readM(i+1,j);当i=num时,转移至writeM(i,j),其余时刻转移至readM(i+1,j);此处由递推求解公式可知,对i=num时,将工作读写头读写的物体的价值数据写入到二维数组时,仅需关注当前物体是否能装入,能装入则在二维数组中填入当前物体价值,无法装入则填0;

步骤5.6:0-1背包动态规划算法自动机在状态writeM(i,j)时,将当前装入背包的物体价值最大的最优解填入对应位置;对于状态writeM(i,j)有三种转移路线;

步骤5.6.1:当i=num时,工作读写头转移至工作纸带上M(num,j)的位置,工作纸带右移1格并使j+1,直至j=capacity,0-1背包动态规划算法自动机状态转移至状态readWeight读取下一物体信息;

步骤5.6.2:当j=capacity时,工作纸带左移至(i-1)*(capacity+1)处(当i不等于num时无论何种情况都要读取M(i+1,j)。由于此时下一填表位置为(i-1,0),因此应转移到(i,0)位置,而通过计算得知此位置对应的纸带位置为(i-1)*(capacity+1)),同时0-1背包动态规划算法自动机状态转移至状态readWeight,并且切换至输入纸带与输入读写头;

步骤5.6.3:当i不等于num时,0-1背包动态规划算法自动机状态转移至状态read(i+1,j)直至j=capacity时;而当i=1且j=capacity时,转移至状态readW(i)开始递推求解向量操作并切换至输出纸带与输出读写头;

步骤5.7:0-1背包动态规划算法自动机在状态readM(i+1,j)时,对于背包能装下当前物体时应考虑装入当前物体收益大还是不装收益大;因此,当j>=weight(当前物体重量)时,转移至状态calM(i+1,j-weight),读取装入当前物体价值最大的最优解并将其与当前物体价值相加并与不装入当前物体时价值最大的最优解进行比较,得出最优解并填入二维数组下标(i+1,j-weight)的位置;

步骤5.8:当0-1背包动态规划算法自动机状态从状态readM(i+1,j)转移至状态calM(i+1,j-weight)时,工作纸带右移至对应位置i*(capacity+1)+mj-weight处;当当前物体装不进背包时,即j

步骤5.9:对于状态calM(i+1,j-weight),工作纸带右移至i*(capacity+1)处,转移至状态cmp;通过状态cmp进行比较,进而求得当前装入物体的价值最大的最优解,工作纸带左移至(i,j)对应位置,转移至状态writeM(i,j);

步骤5.10:0-1背包动态规划算法自动机在readW(i)状态时,递推计算装入背包的物体序号并写入解向量;

步骤5.10.1:通过readW(i)状态将读取第i个物体重量,工作纸带右移2格,转移至状态ansM(i,j),同时切换为工作纸带与工作读写头;

步骤5.10.2:通过状态ansM(i,j)读入当前装入物体的价值最大的最优解,工作纸带右移capacity+1格,转移至状态cmpAnsM(i,j);

步骤5.10.3:通过状态cmpAnsM(i,j)将读取M(i+1,j)与M(i,j)进行比较,如果相同则说明该物体没被装入背包,转移至状态readW(i),如果不相同则说明该物体装入了背包,工作纸带左移weight格,转移至状态writeAns(i-1),并切换为输出读写头与输出纸带;

步骤5.10.4:通过状态writeAns(i-1)将是否装入物体的1或0写入解向量,并转移至状态readW(i),同时切换至输入纸带与输入读写头;当i=num时,从状态ansM(i,j)直接转移至writeAns(num)状态,并根据M(i,j)是否为0判断该物体是否装入背包并填写解向量,最终转移至状态success,算法模拟完毕;

步骤5.11:返回一个Y={Y1,Y2,Y3,…,Ym}的解向量,其中,Ym为输出纸带上输出的解,m为解的个数;

所述算法复杂度计算模块用于计算五种算法的复杂度,具体方法为:

在控制读写头移动脚本中,新增变量num1并初始化为0,当读写头落下移动至目标位置时令num1+1,并提供返回num1值的接口用于给出时间复杂度;

在更新纸带内容脚本中添加vis数组,用于标记工作纸带上各位置是否被使用;并增加将所用到的工作纸带方格数量传出的接口,在UI中实时显示算法复杂度。

所述基于WebGL的优化模块基于WebGL实现对图灵机虚拟仿真系统的优化,将图灵机仿真系统部署到远程服务器,使用户能够通过互联网访问图灵机虚拟仿真系统,具体方法为:

在Unity中将Camera对象的视野宽度设为0.5;

在Unity的项目设置中将压缩项设为禁用;(在禁用此项后发布生成的文件由压缩包形式变为了文件形式,虽然会导致加载速度变慢,但是可以成功读取文件并运行解决了加载到70%卡死的问题。)

修改发布后形成的脚本工程文件中的style.css文件中的container与canvas,将container与canvas的属性其width与height参数改为100%,适应各设备各浏览器;

在本地运行测试无误后将脚本工程文件压缩传入远程服务器,传入后解压并利用node.js部署即可通过互联网使用图灵机虚拟仿真系统。

本实施例中,基于WebGL将图灵机仿真系统部署到远程服务器,用户可以通过互联网访问图灵机虚拟仿真系统,实现一元加法、二分搜索图灵机算法、二分搜索递归算法、可拆分背包贪心算法模块、0-1背包动态规划算法的模拟,如图2-6所示,具体为:

第一部分,一元加法模拟的具体实施步骤如下:

步骤1:在浏览器输入网址进入算法选择页面;

步骤2:点击“一元加法”按钮选择一元加法算法。

步骤3:在算法说明页面点击“继续”按钮。

步骤4:点击“开始/暂停”按钮,开始或暂停一元加法的模拟仿真演示过程,该过程在网页上的效果图如图7所示。

步骤5:点击“加速”或“减速”按钮,对演示过程进行加速或减速播放。

步骤6:模拟一元加法算法过程演示结束,在该页面上显示时间空间复杂度。

步骤7:点击“返回主界面”按钮返回算法选择页面。

第二部分,二分搜索图灵机算法模拟的具体实施步骤如下:

步骤1:在浏览器输入网址进入算法选择页面。

步骤2:点击“二分搜索图灵机算法”按钮选择二分搜索图灵机算法。

步骤3:在算法说明页面,自定义输入初始数据或者使用默认示例,点击“继续”按钮。

步骤4:点击“开始/暂停”按钮,开始或暂停二分搜索图灵机算法的模拟仿真演示过程,该过程在网页上的效果图如图8所示。

步骤5:点击“加速”或“减速”按钮,对演示过程进行加速或减速播放。

步骤6:模拟二分搜索图灵机算法过程演示结束,在该页面上显示时间空间复杂度。

步骤7:点击“返回主界面”按钮返回算法选择页面。

第三部分,二分搜索递归算法模拟的具体实施步骤如下:

步骤1:在浏览器输入网址进入选择算法页面。

步骤2:点击“二分搜索递归算法”按钮选择二分搜索递归算法。

步骤3:在算法说明页面,自定义输入初始数据或者使用默认示例,点击“继续”按钮。

步骤4:点击“开始/暂停”按钮,开始或暂停二分搜索递归算法的模拟仿真演示过程,该过程在网页上的效果图如图9所示。

步骤5:点击“加速”或“减速”按钮,对演示过程进行加速或减速播放。

步骤6:模拟二分搜索递归算法过程演示结束,在该页面上显示时间空间复杂度。

步骤7:点击“返回主界面”按钮返回算法选择页面。

第四部分,可拆分背包贪心算法模拟的具体实施步骤如下:

步骤1:在浏览器输入网址进入选择算法页面。

步骤2:点击“可拆分背包贪心算法”按钮选择可拆分背包贪心算法。

步骤3:在算法说明页面,自定义输入初始数据或者使用默认示例,点击“继续”按钮。

步骤4:点击“开始/暂停”按钮,开始或暂停可拆分背包贪心算法的模拟仿真演示过程,该过程在网页上的效果图如图10所示。

步骤5:点击“加速”或“减速”按钮,对演示过程进行加速或减速播放。

步骤6:模拟可拆分背包贪心算法过程演示结束,在该页面上显示时间空间复杂度。

步骤7:点击“返回主界面”按钮返回算法选择页面。

第五部分,0-1背包动态规划算法模拟的具体实施步骤如下:

步骤1:在浏览器输入网址进入选择算法页面。

步骤2:点击“0-1背包动态规划算法”按钮选择0-1背包动态规划算法。

步骤3:在算法说明页面,自定义输入初始数据或者使用默认示例,点击“继续”按钮。

步骤4:点击“开始/暂停”按钮,开始或暂停0-1背包动态规划算法的模拟仿真演示过程,该过程在网页上的效果图如图11所示。

步骤5:点击“加速”或“减速”按钮,对演示过程进行加速或减速播放。

步骤6:模拟0-1背包动态规划算法过程演示结束,在该页面上显示时间空间复杂度。

步骤7:点击“返回主界面”按钮返回算法选择页面。

本实施例中,采用Unity开发技术在浏览器网页端实现了图灵机虚拟仿真系统,具体模拟到不同策略算法的图灵机以3D动画演示的方式在算法教学上能更好地帮助学生从计算模型的角度去更深入地理解算法。

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明权利要求所限定的范围。

技术分类

06120114743551