[讨论]08"数学中国杯"赛D题的两种思路——基于Matlab编程的解决方案
<p><font size="3">讨论d题第一小问:在7X7坐标纸上的对战游戏。(对于9X9可以自行推广)</font></p><p><font size="3">在附件里是我写的两个程序(M文件),用以讨论解决本次建模赛的D题。</font></p><p><font size="3">第一个程序(文件名含X那个)的出发点是:飞机的机头只会出现在(从左往右数,下同)第三列到第五列之间和(从下往上数,下同)第四行到第七行之间这个3X4的矩形区域。所以,我们采取从(4,4)开始进攻的方式,然后根据返回的不同信息,再确定下一次的进攻坐标。</font></p><p><font size="3">第二个程序(文件名含y那个)的出发点是:先进攻最下面一行的中央位置,如果击中飞机(当然,绝不会是机头),则可以根据飞机的长度(4格)判断飞机机头的位置在第四行。如果没击中,则进攻第二行,余者类推。</font></p><p><font size="3"></font></p><p><font size="3">在程序中,我们可以用一个7阶方阵来代替坐标纸,飞机机身用1表示,机头用2表示,其余的为0.那么,飞机共有的12种位置分布便对应于程序中前88行的12个7阶矩阵。</font></p><p><font size="3">然后让电脑按照上面提到的算法,依次检验各个位置的元素的值的情况,直到检测到值为2(即:击中机头)</font></p><p><font size="3">有兴趣的读者可以根据我的程序用matlab的gui编制一个人机对战游戏界面。而且还可以在两台电脑中放置不同的程序让两台电脑对战,以比较那个程序更优越。当然,我的程序并不保证是最优的,它们只是两种解决方案。</font></p><p><font size="3">另外,如果能引进博弈论的原理,可能能够得出进一步的程序。甚至能触到比较前沿的“人工智能”!</font></p><p><font size="3">鉴于笔者的能力,程序可能不是很完善,希望大家提出,再改正之。贻笑大方之家!</font></p><p><font size="3">说明:matlab版本应该为matlab7.0以上.</font></p><br/>[此贴子已经被作者于2008-4-14 13:24:47编辑过] 第一个程序中飞机头位置明显不只是在3*4的区域内啊 你可能没有理解我的程序,或者没有理解提题目。明显是3X4大小的区域 <p>这种算法扩展性好吗?!!</p><p>还有人是活的,机器那么一个套路打下去游戏的意义和在?对于扩展后的算法我觉得应该加入随机选择。</p><p>请多指教,谢谢。</p> <p>你的想法完全正确。</p><p>机器是死的,人是活的。只要人知道了机器的算法后就会选取机器最难击中(或说需要进攻次数最多的)的位置为机头。</p><p>我昨天在写这些程序的时候,想到了这个问题的解决方案:编写自上而下的进攻程序、编写自下而上的进攻程序、编写自中间向上向下的进攻程序。然后在程序88行左右的地方添加一段代码,用以产生一个随机数,并对应一种算法。然后用一个选择语句选择以上四种算法的其中一种。这样做的目的就是使得进攻的方案随机化,使得人就算知道机器的所有算法但也搞不清它用的那一种。呵呵,其实这就是我在上文中说的引入了博弈论的思想。</p><p>我给出的两个程序都是自下而上的,另外还有一个z程序(我给出的是x和y)是自上而下的,因为某些原因没有放上来。</p><p>权当是抛砖引玉!</p> 楼主你确实理解的不对,人家题目没说飞机只能向上,飞机头明显不只是在那个区域 谢谢楼主的解答,不过我还是觉得对于一架飞机这种方法容易实现,如果飞机数目增多,肯定不能很快获胜的。是否应该考虑在不是一架飞机的情况下的情况呢。 <p>你这个程序最多几次可以成功找到机头?</p><p>我的法子最多5-6次?我正好没有时间,没有交论文,不知道有没有机会了!</p>
[此贴子已经被作者于2008-4-14 22:46:30编辑过] <p>我的方法也最多六次就能打到。</p>
[此贴子已经被作者于2008-4-14 23:15:35编辑过] <p>哦,既然这样说,那我就把我的理解谈谈吧。可能理解有误望指正!</p><p>我的理解是这样的:如题</p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt;"><font face="宋体" size="3">有一种在学生中间比较流行的双方对战游戏。在游戏前双方各准备一张坐标纸,在上面分别制作<span lang="EN-US">7?</span>的方格,如图<span lang="EN-US">1</span>所示。<font color="#f73809">在自己的方格中画一架飞机,飞机呈<span lang="EN-US">“</span>士<span lang="EN-US">”</span>字形,</font><font color="#f70909">其中上面的一长横占<span lang="EN-US">5</span>个格子,下面的短横占<span lang="EN-US">3</span>个格子,一竖占<span lang="EN-US">4</span>个格子,最上面突出的一个格子代表机头。</font>所画飞机的位置以及机头的指向由游戏者自己决定,游戏结束前双方不能互看对方的坐标纸。游戏时双方交替用<span lang="EN-US">“</span>炮弹<span lang="EN-US">”</span>打击对方,攻击的一方报告<span lang="EN-US">“</span>炮弹<span lang="EN-US">”</span>打击的位置,被攻击的一方报告是否命中飞机。例如:被攻击方的飞机画法如图<span lang="EN-US">1</span>所示,攻击者报告“炮弹”的打击位置是(<span lang="EN-US">4</span>,<span lang="EN-US">3</span>),从图中可知,“炮弹”恰好落在飞机所在的红色格子上面,被攻击方报告飞机被击中,接下来刚才的被攻击方变成攻击方进行上面的攻击步骤,双方交替攻击对方,如果某一方被命中机头,游戏结束,被命中机头的一方失败。游戏双方都在通过打击后对方的反馈信息来猜测对方飞机的位置。</font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt;"><font face="宋体" size="3">游戏比赛采用<span lang="EN-US">19</span>局<span lang="EN-US">10</span>胜制。</font></p><p><font face="宋体" size="3">请注意里面红色的文字。我的理解是:既然说是“<font color="#f73809">飞机呈‘士’字形</font>”,那么就应该是机头朝上,否则就应该说是“<font color="#f73809">飞机呈‘干’字形</font>”。还有,后面的文字又说“<font color="#f70909">上面的一长横占<span lang="EN-US">5</span>个格子,下面的短横占<span lang="EN-US">3</span>个格子</font>”,也表明是机头朝上,因为坐过或者见过飞机的人都知道一个事实——飞机前翼比后翼长。</font></p>
[此贴子已经被作者于2008-4-14 23:14:35编辑过]