2020 CUMCM全国大学生数学建模竞赛 B题 Notes

2020年高教社杯全国大学生数学建模竞赛题目

(请先阅读“全国大学生数学建模竞赛论文格式规范”)

 

B题   穿越沙漠

 

考虑如下的小游戏:玩家凭借一张地图,利用初始资金购买一定数量的水和食物(包括食品和其他日常用品),从起点出发,在沙漠中行走。途中会遇到不同的天气,也可在矿山、村庄补充资金或资源,目标是在规定时间内到达终点,并保留尽可能多的资金。(bk1)

游戏的基本规则如下:(rsc1s)

(1)以天为基本时间单位,游戏的开始时间为第0天,玩家位于起点。玩家必须在截止日期或之前到达终点,到达终点后该玩家的游戏结束。

(2)穿越沙漠需水和食物两种资源,它们的最小计量单位均为箱。每天玩家拥有的水和食物质量之和不能超过负重上限。若未到达终点而水或食物已耗尽,视为游戏失败。

(3)每天的天气为“晴朗”、“高温”、“沙暴”三种状况之一,沙漠中所有区域的天气相同。

(4)每天玩家可从地图中的某个区域到达与之相邻的另一个区域,也可在原地停留。沙暴日必须在原地停留。

(5)玩家在原地停留一天消耗的资源数量称为基础消耗量,行走一天消耗的资源数量为基础消耗量的                             倍。

(6)玩家第0天可在起点处用初始资金以基准价格购买水和食物。玩家可在起点停留或回到起点,但不能多次在起点购买资源。玩家到达终点后可退回剩余的水和食物,每箱退回价格为基准价格的一半。

(7)玩家在矿山停留时,可通过挖矿获得资金,挖矿一天获得的资金量称为基础收益。如果挖矿,消耗的资源数量为基础消耗量的倍;如果不挖矿,消耗的资源数量为基础消耗量。到达矿山当天不能挖矿。沙暴日也可挖矿。

(8)玩家经过或在村庄停留时可用剩余的初始资金或挖矿获得的资金随时购买水和食物,每箱价格为基准价格的2倍。

请根据游戏的不同设定,建立数学模型,解决以下问题。

1. 假设只有一名玩家,在整个游戏时段内每天天气状况事先全部已知,试给出一般情况下玩家的最优策略。求解附件中的“第一关”和“第二关”,并将相应结果分别填入Result.xlsx。(spm1)

2. 假设只有一名玩家,玩家仅知道当天的天气状况,可据此决定当天的行动方案,试给出一般情况下玩家的最佳策略,并对附件中的“第三关”和“第四关”进行具体讨论。(spm2)

3. 现有名玩家,他们有相同的初始资金,且同时从起点出发。若某天其中的任意名玩家均从区域A行走到区域B(),则他们中的任一位消耗的资源数量均为基础消耗量的倍;若某天其中的任意名玩家在同一矿山挖矿,则他们中的任一位消耗的资源数量均为基础消耗量的倍,且每名玩家一天可通过挖矿获得的资金是基础收益的;若某天其中的任意名玩家在同一村庄购买资源,每箱价格均为基准价格的倍。其他情况下消耗资源数量与资源价格与单人游戏相同。

(1)假设在整个游戏时段内每天天气状况事先全部已知,每名玩家的行动方案需在第天确定且此后不能更改。试给出一般情况下玩家应采取的策略,并对附件中的“第五关”进行具体讨论。(spm3)

(2)假设所有玩家仅知道当天的天气状况,从第天起,每名玩家在当天行动结束后均知道其余玩家当天的行动方案和剩余的资源数量,随后确定各自第二天的行动方案。试给出一般情况下玩家应采取的策略,并对附件中的“第六关”进行具体讨论。(spm4)

 

注1:附件所给地图中,有公共边界的两个区域称为相邻,仅有公共顶点而没有公共边界的两个区域不视作相邻。

注2:Result.xlsx中剩余资金数(剩余水量、剩余食物量)指当日所需资源全部消耗完毕后的资金数(水量、食物量)。若当日还有购买行为,则指完成购买后的资金数(水量、食物量)。

 

点评:

 

我看到这题后,只有一个想法,就是我好想回到十年前,亲自带着队友把这道题做一遍呀!上一次有这种感觉还是看到一道关于植物大战僵尸和QQ农场相关策略的题的时候,真是太有意思了!

 

显然,这是一个优化问题,而且机理定义相对明确,接近于一个数值成长类的游戏,没有那些恼人难算的微积分。我们只需要按照函数观点定义清楚优化问题的4个方面,就很容易解决了。

 

一共4个题目其实是同一个问题新增两个维度难度的组合,一个是已知的信息从全局到仅仅当天,一个是人数变多称为一个组合优化问题。我们分别来看,从基础的开始:

 

X:初始水和实物量,以及每一天的行动是停留还是行走的行为序列;

Para:每一天在特定的位置,特定的天气下,需要的消耗和补给量;

Y:剩余资金

F:初始资金 – sum(每日净消耗资金)

Restriction:序列行为可行(比如沙暴不可走等),序列结束后能到达终点。

 

这样看来,这是一个标准的网络模型,每个地点就是网络节点,我们需要决策每一步我们应该如何选择,这个问题显然是一个WFST模型,状态包括所在的位置,剩余资源,当日天气,输入为行为选择,dirta函数是会进入的新状态结果。其中选择和天气是无关的,只会影响到接下来的位置条件。求解的话,用标准的动态规划就能完成。

 

拓展1:仅知道当天天气。那么此时,接下来天气的情况就只能以概率分布来给出,因此所有的路径最优决策都变成了分布上求得的期望的最优,而且,因为有可能一直出恶劣天气,所以不一定每一条选择都一定可以到达重点,这里的损失也必须规划进去,最后求得一条在到达率和每条到达的金钱损耗最小中的折中优化结果。

 

拓展2:玩家人数变为k,这样优化的对象状态就不再是单个点,而是一个点的元组,在每一天已知他们的位置分布,来共同决定在某天气下怎样共同决策才对大家的目标更有利,因为他们的损益是相互之间有所关联的。最后的优化目标则和前面一致。

 

当然最后一问是1,2两个拓展的结合,思路没变,只是计算稍微复杂了一点而已。

 

好了,我就先讲到这里,同学们加油!

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
国赛 终于到了国赛的日子,不过凑巧的是当时本人学院上学期疫情的考试安排在的本学期开始,这意味着我要开始边备考边建模,顶着挂科的压力放肆复习。 选的话,之前说过了果断选的新颖B(穿越沙漠)。 简单说下我们的思路: 我们对赛的理解是这情景非常具体,数据需要少,感觉三问都是优化模型,而且需要很强的编程。 首先我们分析目,对游戏规则摸清楚,没有急着建模。 涉及到路线、事件的选择,使用 0-1 变量等定义模型。 最短路径用Floyd算法或者基本可以数出来,考察的是最优路径以及路径前对资源的购买(收益最大)。 第一问: 在第一关和第二关的探险过程中,运用初始的资金对于资源进行合理的分配,可以通过线性规划,确定好在未来一段时间的消耗与收益,制定好合理的规划,通过 MATLAB 计算出需要使用的资源。经过多次训练对比,最终计算出最优策略,对比资金数量。因为不确定答案是否正确,后来我们又用excel表格进行了推导,最后得到是12730,与优秀论文中的12760相比小了30块,估计大概因为这个答案的问,没有国一。 第二问: 第二问与第一问相比提升了难度,如果玩家在进行策略安排的时候, 不知道天气的状况那么小伙伴们可以自己商讨给出何种方案,比如多买水,多买食物等等方法,再这之后通过选择最优路径进行合理的方法选择并讨论,具体的解决方法是通过编程和启发式算法的excel解决的。 第三问: (1) 对于n 名相同的初始资金,且同时从起点出发的玩家来说,游戏规则需要进一步注意规范,为了保证多方共赢,在天气状况已知的情况下, 可以通过先前 MATLAB 中的神经网络算法算出的最优旅行路线,计算多次的结果进行对比,保证不会出现重复的状况, 剔除掉重复出现的次数。因为天气状况已知,所以相对比较好安排合理的路线,对于安排好的路线分别进行编号,再依次进行合理的计算,最终确定结果,
穿越沙漠是一个Matlab的小游戏,玩家需要控制一个机器人在沙漠中寻找宝藏。游戏中的机器人有一些传感器,可以检测周围环境的状况,并根据传感器读数来判断机器人下一步应该朝哪个方向移动。该游戏的主要思路是使用Matlab代码来实现机器人的自主导航和寻宝。 下面是一个简单的穿越沙漠Matlab代码示例: ```matlab % 初始化机器人位置和传感器读数 robot_x = 0; % 机器人初始位置x坐标 robot_y = 0; % 机器人初始位置y坐标 sensor1 = 0; % 传感器1读数 sensor2 = 0; % 传感器2读数 % 开始寻宝 while true % 读取传感器数据 sensor1 = read_sensor1(); sensor2 = read_sensor2(); % 根据传感器数据判断下一步移动方向 if sensor1 > 10 && sensor2 > 10 % 如果两个传感器读数都大于10,则向右移动 robot_x = robot_x + 1; elseif sensor1 > 10 && sensor2 <= 10 % 如果传感器1读数大于10,但传感器2读数小于等于10,则向上移动 robot_y = robot_y + 1; elseif sensor1 <= 10 && sensor2 > 10 % 如果传感器1读数小于等于10,但传感器2读数大于10,则向下移动 robot_y = robot_y - 1; else % 如果两个传感器读数都小于等于10,则向左移动 robot_x = robot_x - 1; end % 判断是否到达宝藏位置 if robot_x == 5 && robot_y == 5 disp('恭喜你找到了宝藏!'); break; % 结束游戏 end end % 传感器读数函数,这里只是一个示例函数,实际情况中需要根据具体情况编写 function value = read_sensor1() value = randi([0,20],1,1); % 随机生成一个0-20之间的整数作为传感器1的读数 end function value = read_sensor2() value = randi([0,20],1,1); % 随机生成一个0-20之间的整数作为传感器2的读数 end ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值