【技术实现步骤摘要】
基于Unity的图灵机虚拟仿真系统
[0001]本专利技术涉及计算机虚拟仿真
,尤其涉及一种基于Unity的图灵机虚拟仿真系统。
技术介绍
[0002]对于每个计算机专业的学生来说,“图灵机”一词经常出现在他们的学习资料和授课老师的口中,几乎是计算机专业学生的必学知识点,在学生学习和理解计算机工作原理、算法过程、计算理论等课程内容时起到重要作用。图灵机(又称图灵计算机)是由英国数学家Alan Mathison Turing于1936年首次撰文提出的一种非常具有抽象理论意义的电子计算科学模型,为计算机诞生奠定了理论基础。图灵机不是一种具体的机器,而是一种思想模型,可制造一种十分简单但运算能力极强的计算装置,用来计算所有能想象得到的可计算函数。
[0003]图灵机是图灵受打字机的启发而假想出来的一种抽象机器,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人类进行数学运算,其处理对象是一条无限长的纸带。纸带被划分为一个个大小相等的小方格,每个小方格可以存放一个符号,有一个机器头在纸带上移来移去,机器头有一组内部状态,还有一些固定的程序。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动。
[0004]图灵提出图灵机的模型并不是为了同时给出计算机的设计,它有着如下重要意义,首先它已经充分证明了一种较为通用的随机计算模型理论,确定了一种直接实现一个计算机内部功能的方法可行性,同时它也充分提 ...
【技术保护点】
【技术特征摘要】
1.一种基于Unity的图灵机虚拟仿真系统,其特征在于:包括图灵机建模模块、图灵机读写动作与状态转移的设计模块、UI设计模块、状态转移方程设计模块、算法复杂度计算模块和基于WebGL的优化模块;所述图灵机建模模块根据任务需求基于Unity对图灵机进行建模,构建图灵机模型;所述图灵机读写动作与状态转移的设计模块用于实现图灵机读写动作和状态转移的设计;所述UI设计模块用于设计图灵机的UI界面;所述状态转移方程设计模块计用于设计图灵机实现任务需求的状态转移方程,进而通过图灵机完成任务需求;所述算法复杂度计算模块用于计算实现任务需求的算法复杂度;所述基于WebGL的优化模块将图灵机虚拟仿真系统发布成WebGL形式,并在发布后利用node.js部署在服务器上,最终实现通过网页端能够访问图灵机虚拟仿真系统。2.根据权利要求1所述的基于Unity的图灵机虚拟仿真系统,其特征在于:所述图灵机建模模块根据任务需求基于Unity对图灵机进行建模的具体方法为:设定的图灵机任务需求为实现一元加法、二分搜索图灵机算法、二分搜索递归算法、可拆分背包贪心算法和0
‑
1背包动态规划算法五种算法;确定图灵机的读写头及图灵机框架模型;利用3dsMax对图灵机的纸带、读写头和有限状态自动机进行建模;建模后导出FBX模型再导入Unity赋予材质,最终加以设计完成建模的工作;在Unity中将利用3dsMax建模后的纸带、读写头和有限状态自动机各部分绑定在一起,构成整体的图灵机模型;并添加显示自动机状态及纸带内容的text组件;为了便于用户直观地观察到图灵机的工作过程,将图灵机设计成三读写头和三纸带模型,包括输入读写头、工作读写头、输出读写头、输入纸带、工作纸带、输出纸带、自动机和状态转移显示屏。3.根据权利要求2所述的基于Unity的图灵机虚拟仿真系统,其特征在于:所述图灵机读写动作与状态转移的设计模块设计控制读写头脚本、更新纸带内容脚本、控制纸带移动脚本、状态转移脚本、状态显示脚本、模拟函数调用脚本以及单位时间访问数组用于实现图灵机读写动作和状态转移;所述控制读写头脚本用于控制读写头上下移动仿真模拟读写操作;首先在Unity场景中创建一个空物体,作为读写头移动的目标位置;通过MoveTowards()函数给定读写头的起始位置、目标位置及步长,实现改变读写头位置,使得读写头在目标位置与起始位置间往复移动;当读写头移动到目标位置时将向状态转移脚本发送信号开始进行状态转移,当读写头移动回初始位置时将向控制纸带移动脚本发送信号,开始移动纸带;所述更新纸带内容脚本用于管理纸带上数据,对外提供setBST()和getBST()两个接口,setBST()通过给定写入位置与写入数据来修改纸带上目标位置元素,getBST()通过给定指定位置来获取指定位置上纸带数据;每次得到状态转移脚本的更新纸带内容信号后进行更新当前场景显示的纸带数据;所述控制纸带移动脚本用于控制纸带移动;调用状态转移脚本提供的接口getI()通过给定纸带名称来获取当前纸带应移动到的目标位置,在收到移动纸带信号后开始移动纸带,移动到目标位置后发送信号给读写头使其落下模拟下一次读写操作;所述状态转移脚本用于控制图灵机状态转移和切换输入、工作和输出纸带以及读写头;每次状态转移过程为,首先修改当前纸带上的内容,然后再更新当前纸带位置,之后发
出信号允许纸带更新内容并使读写头升起回到初始位置,最后移动纸带、选定下个状态所用纸带,并且更新图灵机状态;在该脚本内部定义了变量nowTape用于确定当前纸带与读写头是输入、工作或输出纸带与读写头;同时定义变量inputI、workI和outputI用于标记输入、工作和输出纸带当前读写位置;所述状态显示脚本利用继承至GameObject类的GetComponent方法调用状态转移脚本提供的接口getState()获取图灵机状态,并且显示在状态显示屏上;所述模拟函数调用脚本将纸带数据移动到视角外进行更新,以达到模拟函数调用过程;在场景中创建一个空物体作为纸带移动的目标位置;利用MoveTowards()函数以实现读写头在目标位置与初始位置间的往复运动;对于递归调用仅将纸带上数据更新为下一层递归输入的参数,对应排序的调用直接更新为排序后的结果;所述单位时间访问数组分为在确定状态转移下实现、在不确定状态转移下实现和切换纸带下实现这三种情况;对于确定状态转移下的单位时间访问数组实现仅需在执行纸带左移右移操作时直接移动到根据数组下标定位的位置;对于不确定状态转移与切换纸带这两种情况,则需要在进入下一状态前修改定位变量inputI、workI和outputI,并调用控制纸带移动脚本提供的接口控制纸带移动,然后进入下一状态。4.根据权利要求3所述的基于Unity的图灵机虚拟仿真系统,其特征在于:所述UI设计模块具体用于设计算法选择界面、算法模拟界面以及实现算法说明与交互功能;所述算法选择界面设计五个按钮用于选择所要模拟的算法,通过调用Unity中SceneManager包实现点击按钮进行场景跳转的功能;所述算法模拟界面用于显示算法模拟时各纸带数据、时间复杂度、空间复杂度和返回算法选择页面的按钮,通过小窗显示三条纸带正在读写的位置,并提供了算法模拟开始/暂停、加速和减速按钮,具体方法为:调用更新纸带内容脚本提供的接口读取纸带上的数据并显示在界面中对应的Text构件上;小窗显示采用了设置三个摄像机分别对应着三条纸带的中央位置,利用相机属性中的render texture获得相机的视角,并将相机的视角渲染到界面中的图片实现利用小窗显示纸带正在读写位置的数据;在二分搜索递归算法中还需实现在界面中显示递归栈,即每次调用压入递归栈的数据;通过执行状态call时将low、high和mid按顺序入栈,并在return时遵循先进后出的原则出栈;在小规模0
‑
1背包动态规划算法中还在界面中通过二维表动态显示二维数组中的数据;所述实现算法说明与交互功能的具体方法为:在算法选择界面选择要模拟的算法后,给出所选定算法的相关说明,当用户阅读完毕点击继续按钮观看算法模拟过程;并且在算法说明页面利用UI中的InputField组件提供了输入功能,使用户在该页面自行输入初始输入纸带数据。5.根据权利要求4所述的基于Unity的图灵机虚拟仿真系统,其特征在于:所述算法复杂度计算模块用于计算图灵机模拟五种算法的复杂度的具体方法为:在控制读写头移动脚本中,新增变量num1并初始化为0,当读写头落下移动至目标位置时令num1+1,并提供返回num1值的接口用于给出时间复杂度;
在更新纸带内容脚本中添加vis数组,用于标记工作纸带上各位置是否被使用;并增加将所用到的工作纸带方格数量传出的接口,在UI中实时显示算法复杂度。6.根据权利要求5所述的基于Unity的图灵机虚拟仿真系统,其特征在于:所述状态转移方程设计模块通过设计一元加法自动机、二分搜索图灵机算法自动机、二分搜索递归算法自动机、可拆分背包贪心算法自动机和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]<x,则更新low;updateLow,更新工作纸带上的low为mid+1;compareHigh,将更新后的low和high进行比较,如果low>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将装入当前物体的最优...
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。