数学建模国赛 2020B-穿越沙漠 第二关至第六关思路分享

穿越沙漠第二关至第六关思路

开始讲题之前唠嗑一下:
很感谢所有读者和粉丝对上一篇的第一关解题博文的喜欢,也收到很多人的称赞,我很高兴大家能喜欢我写的东西。

其实这道题的模型在建立之处就是对着六关通用的目标去写的,因为本身三问六关都是同种问题:给一地图,给初始数据,求最多剩余资金。

所以如果理解了我第一关写的模型,其他关卡的模型稍微修改一下和换一下读取的数据就能直接用 L i n g o Lingo Lingo 求解。但是我也没有直接写明应该修改哪里,所以很多读者私信我有没有第二关的材料。我和其中一位读者详细分享了其他几关的思路,其实最主要是从第一关基础模型上慢慢升级约束得到,这里整理一起发布一下。

第二关

首先是第一大题,也就是第一关和第二关的求解。这两关是有最优解的,答案只有一个数字,第一关是10470,第二关是12730。解出这两个数字就是国二都稳了。第二关和第一关模型一样(改一下地区编号),只是写成代码时记得把多个村庄和多个矿山的情况改成数组循环的方式去遍历求解, L i n g o Lingo Lingo 代码别忘了声明村庄和矿山的集合。

第三第四关

和第一问的区别仅是天气组合不再给出,玩家每天醒来才知道新的天气。我们团队当时比赛的思路非常粗暴,但是高效。直接生成几份随机的天气数据,然后用第一问的模型直接跑,拿到的数据中会存在有解和无解的。针对这些数据,分析有解情况下,什么样的天气最影响最终答案;导致无解的情况有哪些天气组合。只有简单的步骤就可以写出很多有用的分析,还是节省大量比赛时间。

第五第六关

第三问涉及多位玩家,仅当矿山或村庄存在一位以上的玩家时,玩家的购买价格和挖矿收益会产生影响。那么首先找解题基础点,每个玩家的决策模型都是第一关的模型,区别在于如果当前地点是村庄,存在其他玩家,购买价格就要按四倍算,如果 k k k 个玩家一同行走到某个区域,行走消耗就要 2 k 2k 2k,如果一起挖矿,挖矿收益就是 1 / k 1/k 1/k 。那么这些都是数值上的变动,基础逻辑还是第一关模型那套。

第三问用 l i n g o lingo lingo 会比较复杂,因为这是非线性模型,反而用编程会比较简单。那么可以推理出出题人的意图就是希望通过第一关的引导,让你编出单人模式的程序,然后第三关使用多线程和资源共享的技术进行编程求解。实际上第三问也可以用第一关的模型修改出来。但是模型的约束要变为 k k k 倍。说下具体思路:第一关只有一个 f f f 变量,第三问要改成 k k k f f f, k k k 通过写死的方式确定,比如先设 k = 3 k = 3 k=3。那么其他地方怎么改?举例:每个玩家在村庄购买物资数量的约束:

w b u y i , k + f b u y i , k < = ∞ × ∑ j = 1 b f i , m j , k ( i = 2..31 , k = 1..3 ) wbuy_{i,k} + fbuy_{i, k} <= \infty \times \sum_{j = 1}^b f_{i,m_j,k} \quad (i=2..31, k = 1..3) wbuyi,k+fbuyi,k<=×j=1bfi,mj,k(i=2..31,k=1..3)

w b u y i , k wbuy_{i,k} wbuyi,k f b u y i , k fbuy_{i, k} fbuyi,k 表示第 i i i 天第 k k k 位的玩家的水和食物购买量,那么 f f f 就记录了第 i i i 天 第 j j j 个区域第 k k k 个 玩家的停留情况。

这里已经表示出多玩家的约束了,某个玩家某一天的村庄购买量也表示了,那么购买消耗就很简单,只要当天有多个玩家的在村庄,购买消耗就是乘 4 4 4 倍不是乘 2 2 2,多个玩家表示的数量是大于等于 2 2 2 ,但是不会超过3,那么构造一个分段函数,0 -> 0,1 -> 0,2 -> 1,3 -> 1,这样,每天每个玩家的购买花费约束就是:

2 × [ 1 + ⌊ s u m k = 1 3 f i , 14 , k 2 ⌋ ] × ( c w × w b u y i , k + c f × f b u y i , k ) < = m o n e y i − 1 , k ( i = 2..31 , k = 1..3 ) 2 \times [1 + \lfloor \frac{sum_{k = 1}^{3} f_{i,14,k}}{2} \rfloor] \times (cw \times wbuy_{i,k} + cf \times fbuy_{i,k}) <= money_{i - 1, k} \quad (i = 2..31,k=1..3) 2×[1+2sumk=13fi,14,k⌋]×(cw×wbuyi,k+cf×fbuyi,k)<=moneyi1,k(i=2..31,k=1..3)

这条约束是会根据当天 14 号村庄内的总玩家数,动态调整购买价格的系数。这也是第五第六关的关键:构造出能表示动态因素的约束。

图1 第六关地图

理解这一点后,就可以逐步把题意要求的所有约束写出来,和第一关一样,然后写完模型就交给论文手去写文,模型选手继续优化模型求解,编程选手就根据模型来编程序求解。因为这道题也是主观求解,没有标准答案,所以能构造出模型并结合数据进行合理分析,然后画图展示,就算完成题目了。

尾声

上面就是第二关到第六关的求解思路,还有比赛时的一些经验,希望能帮助到大家。

感谢大家看到这里,有问题可以私信或者评论讨论。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值