数学建模社区-数学中国

标题: [讨论]08"数学中国杯"赛D题的两种思路——基于Matlab编程的解决方案 [打印本页]

作者: liwenhui    时间: 2008-4-14 13:13
标题: [讨论]08"数学中国杯"赛D题的两种思路——基于Matlab编程的解决方案

讨论d题第一小问:在7X7坐标纸上的对战游戏。(对于9X9可以自行推广)

在附件里是我写的两个程序(M文件),用以讨论解决本次建模赛的D题。

第一个程序(文件名含X那个)的出发点是:飞机的机头只会出现在(从左往右数,下同)第三列到第五列之间和(从下往上数,下同)第四行到第七行之间这个3X4的矩形区域。所以,我们采取从(4,4)开始进攻的方式,然后根据返回的不同信息,再确定下一次的进攻坐标。

第二个程序(文件名含y那个)的出发点是:先进攻最下面一行的中央位置,如果击中飞机(当然,绝不会是机头),则可以根据飞机的长度(4格)判断飞机机头的位置在第四行。如果没击中,则进攻第二行,余者类推。

在程序中,我们可以用一个7阶方阵来代替坐标纸,飞机机身用1表示,机头用2表示,其余的为0.那么,飞机共有的12种位置分布便对应于程序中前88行的12个7阶矩阵。

然后让电脑按照上面提到的算法,依次检验各个位置的元素的值的情况,直到检测到值为2(即:击中机头)

有兴趣的读者可以根据我的程序用matlab的gui编制一个人机对战游戏界面。而且还可以在两台电脑中放置不同的程序让两台电脑对战,以比较那个程序更优越。当然,我的程序并不保证是最优的,它们只是两种解决方案。

另外,如果能引进博弈论的原理,可能能够得出进一步的程序。甚至能触到比较前沿的“人工智能”!

鉴于笔者的能力,程序可能不是很完善,希望大家提出,再改正之。贻笑大方之家!

说明:matlab版本应该为matlab7.0以上.

[attach]4070[/attach]
[此贴子已经被作者于2008-4-14 13:24:47编辑过]

两个游戏仿真模拟程序.rar.rar

2.02 KB, 下载次数: 103, 下载积分: 体力 -2 点

两个游戏仿真模拟程序.rar


作者: sdsfly    时间: 2008-4-14 14:20
第一个程序中飞机头位置明显不只是在3*4的区域内啊
作者: liwenhui    时间: 2008-4-14 16:05
你可能没有理解我的程序,或者没有理解提题目。明显是3X4大小的区域
作者: wyf100    时间: 2008-4-14 17:17

这种算法扩展性好吗?!!

还有人是活的,机器那么一个套路打下去游戏的意义和在?对于扩展后的算法我觉得应该加入随机选择。

请多指教,谢谢。

[em06]
作者: liwenhui    时间: 2008-4-14 17:59

你的想法完全正确。

机器是死的,人是活的。只要人知道了机器的算法后就会选取机器最难击中(或说需要进攻次数最多的)的位置为机头。

我昨天在写这些程序的时候,想到了这个问题的解决方案:编写自上而下的进攻程序、编写自下而上的进攻程序、编写自中间向上向下的进攻程序。然后在程序88行左右的地方添加一段代码,用以产生一个随机数,并对应一种算法。然后用一个选择语句选择以上四种算法的其中一种。这样做的目的就是使得进攻的方案随机化,使得人就算知道机器的所有算法但也搞不清它用的那一种。呵呵,其实这就是我在上文中说的引入了博弈论的思想。

我给出的两个程序都是自下而上的,另外还有一个z程序(我给出的是x和y)是自上而下的,因为某些原因没有放上来。

权当是抛砖引玉!


作者: tonysonic    时间: 2008-4-14 19:53
楼主你确实理解的不对,人家题目没说飞机只能向上,飞机头明显不只是在那个区域
作者: wyf100    时间: 2008-4-14 21:26
谢谢楼主的解答,不过我还是觉得对于一架飞机这种方法容易实现,如果飞机数目增多,肯定不能很快获胜的。是否应该考虑在不是一架飞机的情况下的情况呢。[em37]
作者: roumots    时间: 2008-4-14 22:43

你这个程序最多几次可以成功找到机头?

我的法子最多5-6次?我正好没有时间,没有交论文,不知道有没有机会了!

[此贴子已经被作者于2008-4-14 22:46:30编辑过]

作者: liwenhui    时间: 2008-4-14 22:57

我的方法也最多六次就能打到。

[此贴子已经被作者于2008-4-14 23:15:35编辑过]

作者: liwenhui    时间: 2008-4-14 23:02

哦,既然这样说,那我就把我的理解谈谈吧。可能理解有误望指正!

我的理解是这样的:如题

有一种在学生中间比较流行的双方对战游戏。在游戏前双方各准备一张坐标纸,在上面分别制作7?的方格,如图1所示。在自己的方格中画一架飞机,飞机呈字形,其中上面的一长横占5个格子,下面的短横占3个格子,一竖占4个格子,最上面突出的一个格子代表机头。所画飞机的位置以及机头的指向由游戏者自己决定,游戏结束前双方不能互看对方的坐标纸。游戏时双方交替用炮弹打击对方,攻击的一方报告炮弹打击的位置,被攻击的一方报告是否命中飞机。例如:被攻击方的飞机画法如图1所示,攻击者报告“炮弹”的打击位置是(43),从图中可知,“炮弹”恰好落在飞机所在的红色格子上面,被攻击方报告飞机被击中,接下来刚才的被攻击方变成攻击方进行上面的攻击步骤,双方交替攻击对方,如果某一方被命中机头,游戏结束,被命中机头的一方失败。游戏双方都在通过打击后对方的反馈信息来猜测对方飞机的位置。

游戏比赛采用1910胜制。

请注意里面红色的文字。我的理解是:既然说是“飞机呈‘士’字形”,那么就应该是机头朝上,否则就应该说是“飞机呈‘干’字形”。还有,后面的文字又说“上面的一长横占5个格子,下面的短横占3个格子”,也表明是机头朝上,因为坐过或者见过飞机的人都知道一个事实——飞机前翼比后翼长。

[此贴子已经被作者于2008-4-14 23:14:35编辑过]

作者: liwenhui    时间: 2008-4-14 23:13
对于9X9情况下,算法并不是很难。因为一架飞机在横向上要占据5格,而格子只有9格,所以两架飞机不会并列存在,只能错开,且机头的分布也是一个5X6的区域。
作者: roumots    时间: 2008-4-14 23:14

如果按照楼主的说吗的话,3-4次就可以判断了!

我是按照48种可能做的.
[此贴子已经被作者于2008-4-14 23:15:39编辑过]

作者: liwenhui    时间: 2008-4-14 23:32

是吗?我在帖子里说过我的程序不能保证是最优的。

可以把你的程序放上面来大家看看吗?

我也在找寻最优的方案,你是用的那种方法?


作者: liwenhui    时间: 2008-4-14 23:34

其实我还有一个Z方案,但如果机头被放在某一特定的位置的话,也需要5次才能击中。

只能说,平均下来的话,大概是3次的样子。


作者: roumots    时间: 2008-4-14 23:53
QUOTE:

QUOTE:
以下是引用liwenhui在2008-4-14 23:32:06的发言:

是吗?我在帖子里说过我的程序不能保证是最优的。

可以把你的程序放上面来大家看看吗?

我也在找寻最优的方案,你是用的那种方法?


我的程序也很简单,就是寻找一个二叉树,过两天我把程序提交上来,这几天没有什么时间,要考试!

[此贴子已经被作者于2008-4-14 23:54:30编辑过]

作者: Ruansgroup    时间: 2008-4-15 16:36

我们组的想法和楼主的类似,计算机最多的一次进攻是八步,基本上计算机五六步就能解决问题,从中间十二格开始考虑是因为其摆放机头次数最多,当然人在和计算机多玩后,会发现一定的规律,从而导致机头的放置与一般规律不同。

上海水产大学小组

ps.数学中国页面上蠕虫病毒较多,请管理员检查。


作者: Ruansgroup    时间: 2008-4-15 16:41

另外,楼主说9?可以扩展,但是题目要求中有考虑和7?的不同方法,不吝赐教。


作者: liwenhui    时间: 2008-4-15 18:22

只要弄明白了7x7下的进攻策略,9x9下的进攻策略就不难找到。后者与前者游戏背景不同点主要有二:一是飞机的活动空间增加了;二是飞机的数量增加了。我们可以先不考虑第二个不同点。如此的话,9X9与7X7没有本质的不同。每次进攻的目的无非两个,要么击下飞机,要么得到飞机分布的若干信息。如果击下飞机,游戏结束。如果没击下则根据得到的信息(两种情况:击中,但没有击中机头or没击中),推测飞机可能的分布用以给出下一次进攻的方向。

对题目中的第二小问,我的观点是:只要找到在9X9条件下击落2架飞机的程序(算法),那它与第一小问程序的不同点自然而然就明了了。(所谓“策略上的不同”其实就是程序的不同,而程序本质上不会有多大不同之处,只是进攻次数多几次。)


作者: liwenhui    时间: 2008-4-15 18:25
我放上来的两个程序最多6次就能击下飞机,还有一个Z程序最多5次。我觉得不会有比5次更少的程序(可能5次就是最优的方式,但我不能证明。证明可能得用图论思想。)。能把你们的程序放上来大家交流交流吗?
作者: wyf100    时间: 2008-4-15 22:37

感觉是在做文字游戏~~~这样的题目做来真没劲。

不知道是出题人有意的,还是别的原因。

[em14]
作者: caoyuan607    时间: 2008-4-15 22:40
标题: 肯定机头各个方向啊
如果只能向一个方向的话那也太简单了啊。。。
还有如果人不能打只能机器打的话怎么能叫游戏啊。。。
不过从4 4点进攻我还是赞成的,其实如果机头可以向各个方向的话,按照我们的方法,最快一步最慢15也可以出来,不过一般都在5-8步左右

作者: liwenhui    时间: 2008-4-16 08:30

呵呵,看来楼上的没有理解我程序的本质。


作者: madio    时间: 2008-4-16 08:34
QUOTE:
以下是引用wyf100在2008-4-15 22:37:03的发言:
支持数学中国的发展,请每天帮我们投上一票 !

感觉是在做文字游戏~~~这样的题目做来真没劲。

不知道是出题人有意的,还是别的原因。

图片点击可在新窗口打开查看

看来你认为这道题没有价值了?说说你的观点,莫非你已经把最优解找到了?这道题目是我出的,希望赐教!


作者: baomimimi    时间: 2008-4-18 01:13

7*7的格子(4,4)显然不是最优点

用二分法即可


作者: baomimimi    时间: 2008-4-18 01:20

我的程序通过评价函数的方法加入了人工智能

根据对方炸自己的情况分析形势的轻重缓急

然后通过修改价值函数中的风险度K来调整价值表,进而改变获得的最优点

在不利局势下采用较冒进的方法

在稳定的局势下采取最短的方法

当然,无论哪种局势,都兼顾两种策略,只是改变平衡点而已


作者: liwenhui    时间: 2008-4-18 18:23
可以把你的程序放上来吗,大家交流以下.
作者: wyf100    时间: 2008-4-18 23:13
QUOTE:
以下是引用madio在2008-4-16 8:34:48的发言:
QUOTE:
以下是引用wyf100在2008-4-15 22:37:03的发言:

感觉是在做文字游戏~~~这样的题目做来真没劲。

不知道是出题人有意的,还是别的原因。

图片点击可在新窗口打开查看

看来你认为这道题没有价值了?说说你的观点,莫非你已经把最优解找到了?这道题目是我出的,希望赐教!


可能没表达清楚,此问题是我想复杂了,题目本身是很有趣的,第一次弄建模什么都不懂,请多指教,谢谢大家了。


作者: gdmojifei    时间: 2009-4-3 19:42
好高深啊,还需要努力学习啊
作者: 米百刚    时间: 2009-4-23 22:52
好,在研究一下
作者: 000000star    时间: 2009-7-22 20:08
haohao xuexi











day day up
作者: 000000star    时间: 2009-7-22 20:09
wq













uhi




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5