# 2020数学建模国赛B题 **Repository Path**: anois/Math_2020_B ## Basic Information - **Project Name**: 2020数学建模国赛B题 - **Description**: 2020数学建模B题编码 Java实现 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2021-03-19 - **Last Updated**: 2021-11-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 2020数学建模国赛B题 比赛编码期间还有其他日程,导致编码时间较短,有轻微显示bug未修复,代码质量可能较低凑活看一下吧。。 实际编码时间应该是1天半左右,论文就不上传了。 ## 模型求解结果 ### 第一关 #### 运行参数 ```java // 模型参数调整 private static Integer maxCapital = 0; //最优抉择收益值 private static Integer initWaterNum = 180; //初始携带水 private static Integer initFoodNum = 330; //初始携带食物 private static final Integer initCapital = 10000; //起始资金 private static final Integer waterWeight = 3; //单份水重量 private static final Integer foodWeight = 2; // 单份食物重量 private static final Integer weightMax = 1200; // 负重上限 private static final Integer average = weightMax/(waterWeight+foodWeight); // 补给平衡值 private static final Integer profit = 1000; //挖矿收益 private static final Integer terminationDate = 30; // 终止日期 private static final Integer waterPrice = 5; // 单份水价格 private static final Integer foodPrice = 10; // 单份食物价格 private static final Integer sunnyWater = 5; // 晴天基础水消耗 private static final Integer sunnyFood = 7; // 晴天基础食物消耗 private static final Integer highWater = 8; // 高温基础水消耗 private static final Integer highFood = 6; // 高温基础食物消耗 private static final Integer sandstormWater = 10; // 沙暴基础水消耗 private static final Integer sandstormFood = 10; // 沙暴基础食物消耗 private static final Integer threshold = 40; // 食物补给阈值 private static final Integer balance = 0; // 食物-水 补给平衡参数 ``` #### 游戏地图 ```java /** * 游戏地图逻辑绘制 * @return 游戏地图起始节点 */ public static GameMap initMap(){ GameMap m1 = new GameMap(1,null, GameMap.type.start); GameMap m9 = new GameMap(9,null, GameMap.type.land); GameMap m12 = new GameMap(12,null, GameMap.type.mine); GameMap m14 = new GameMap(14,null, GameMap.type.land); GameMap m15 = new GameMap(15,null, GameMap.type.village); GameMap m21 = new GameMap(21,null, GameMap.type.land); GameMap m22 = new GameMap(22,null, GameMap.type.land); GameMap m23 = new GameMap(23,null, GameMap.type.land); GameMap m24 = new GameMap(24,null, GameMap.type.land); GameMap m25 = new GameMap(25,null, GameMap.type.land); GameMap m26 = new GameMap(26,null, GameMap.type.land); GameMap m27 = new GameMap(27,null, GameMap.type.end); m1.setAdjacent(Arrays.asList(m25)); m25.setAdjacent(Arrays.asList(m24)); m24.setAdjacent(Arrays.asList(m23)); m23.setAdjacent(Arrays.asList(m22)); m22.setAdjacent(Arrays.asList(m9)); m21.setAdjacent(Arrays.asList(m27)); m9.setAdjacent(Arrays.asList(m15,m21)); m15.setAdjacent(Arrays.asList(m9,m14)); m14.setAdjacent(Arrays.asList(m12,m15)); m12.setAdjacent(Arrays.asList(m14)); m26.setAdjacent(Arrays.asList(m27)); m27.setAdjacent(Arrays.asList()); return m1; } ``` #### 运算结果 ```java 成功通关! 旅途总收益=10450 旅途总水消耗=377 旅途总食物消耗=349 具体行程安排如下: 第0天: 所在区域=1 剩余资金=5800 剩余水量=180 剩余食物=330 第1天: 所在区域=25 剩余资金=5800 剩余水量=164 剩余食物=318 第2天: 所在区域=24 剩余资金=5800 剩余水量=148 剩余食物=306 第3天: 所在区域=23 剩余资金=5800 剩余水量=138 剩余食物=292 第4天: 所在区域=23 剩余资金=5800 剩余水量=128 剩余食物=282 第5天: 所在区域=22 剩余资金=5800 剩余水量=118 剩余食物=268 第6天: 所在区域=9 剩余资金=5800 剩余水量=102 剩余食物=256 第7天: 所在区域=9 剩余资金=5800 剩余水量=92 剩余食物=246 第8天: 所在区域=15 剩余资金=4170 剩余水量=245 剩余食物=232 第9天: 所在区域=14 剩余资金=4170 剩余水量=229 剩余食物=220 第10天: 所在区域=12 剩余资金=4170 剩余水量=213 剩余食物=208 第11天: 所在区域=12 剩余资金=5170 剩余水量=183 剩余食物=178 第12天: 所在区域=12 剩余资金=6170 剩余水量=159 剩余食物=160 第13天: 所在区域=12 剩余资金=7170 剩余水量=144 剩余食物=139 第14天: 所在区域=12 剩余资金=8170 剩余水量=120 剩余食物=121 第15天: 所在区域=12 剩余资金=9170 剩余水量=96 剩余食物=103 第16天: 所在区域=12 剩余资金=10170 剩余水量=72 剩余食物=85 第17天: 所在区域=12 剩余资金=10170 剩余水量=62 剩余食物=75 第18天: 所在区域=12 剩余资金=10170 剩余水量=52 剩余食物=65 第19天: 所在区域=12 剩余资金=11170 剩余水量=28 剩余食物=47 第20天: 所在区域=14 剩余资金=11170 剩余水量=12 剩余食物=35 第21天: 所在区域=15 剩余资金=10450 剩余水量=36 剩余食物=40 第22天: 所在区域=9 剩余资金=10450 剩余水量=26 剩余食物=26 第23天: 所在区域=21 剩余资金=10450 剩余水量=10 剩余食物=14 第24天: 所在区域=27 剩余资金=10450 剩余水量=0 剩余食物=0 ``` ### 第二关 #### 运算参数 ```java // 模型参数调整 private static Integer maxCapital = 0; //最优抉择收益值 private static Integer initWaterNum = 184; //初始携带水 private static Integer initFoodNum = 324; //初始携带食物 private static final Integer initCapital = 10000; //起始资金 private static final Integer waterWeight = 3; //单份水重量 private static final Integer foodWeight = 2; // 单份食物重量 private static final Integer weightMax = 1200; // 负重上限 private static final Integer average = weightMax/(waterWeight+foodWeight); // 补给平衡值 private static final Integer profit = 1000; //挖矿收益 private static final Integer terminationDate = 30; // 终止日期 private static final Integer waterPrice = 5; // 单份水价格 private static final Integer foodPrice = 10; // 单份食物价格 private static final Integer sunnyWater = 5; // 晴天基础水消耗 private static final Integer sunnyFood = 7; // 晴天基础食物消耗 private static final Integer highWater = 8; // 高温基础水消耗 private static final Integer highFood = 6; // 高温基础食物消耗 private static final Integer sandstormWater = 10; // 沙暴基础水消耗 private static final Integer sandstormFood = 10; // 沙暴基础食物消耗 private static final Integer threshold = average; // 食物补给阈值 private static final Integer balance = 0; // 食物-水 补给平衡参数 ``` #### 游戏地图 ```java private static GameMap initMap(){ GameMap m1 = new GameMap(1, null, GameMap.type.start); GameMap m2 = new GameMap(2, null, GameMap.type.land); GameMap m3 = new GameMap(3, null, GameMap.type.land); GameMap m4 = new GameMap(4, null, GameMap.type.land); GameMap m12 = new GameMap(12, null, GameMap.type.land); GameMap m21 = new GameMap(21, null, GameMap.type.land); GameMap m29 = new GameMap(29, null, GameMap.type.land); GameMap m30 = new GameMap(30, null, GameMap.type.mine); GameMap m38 = new GameMap(38, null, GameMap.type.land); GameMap m39 = new GameMap(39, null, GameMap.type.village); GameMap m46 = new GameMap(46, null, GameMap.type.land); GameMap m47 = new GameMap(47, null, GameMap.type.land); GameMap m55 = new GameMap(55, null, GameMap.type.mine); GameMap m56 = new GameMap(56, null, GameMap.type.land); GameMap m62 = new GameMap(62, null, GameMap.type.village); GameMap m63 = new GameMap(63, null, GameMap.type.land); GameMap m64 = new GameMap(64, null, GameMap.type.end); m1.setAdjacent(Arrays.asList(m2)); m2.setAdjacent(Arrays.asList(m3)); m3.setAdjacent(Arrays.asList(m4)); m4.setAdjacent(Arrays.asList(m12)); m12.setAdjacent(Arrays.asList(m21)); m21.setAdjacent(Arrays.asList(m29)); m29.setAdjacent(Arrays.asList(m38, m30)); m30.setAdjacent(Arrays.asList(m39)); m38.setAdjacent(Arrays.asList(m46)); m39.setAdjacent(Arrays.asList(m47)); m46.setAdjacent(Arrays.asList(m55)); m47.setAdjacent(Arrays.asList(m56,m55)); m55.setAdjacent(Arrays.asList(m56, m62)); m56.setAdjacent(Arrays.asList(m64)); m62.setAdjacent(Arrays.asList(m63,m55)); m63.setAdjacent(Arrays.asList(m64)); m64.setAdjacent(Arrays.asList()); return m1; } ``` #### 运算结果 ```java 成功通关! 旅途总收益=12590 旅途总水消耗=535 旅途总食物消耗=511 具体行程安排如下: 第0天: 所在区域=1 剩余资金=5840 剩余水量=184 剩余食物=324 第1天: 所在区域=2 剩余资金=5840 剩余水量=168 剩余食物=312 第2天: 所在区域=3 剩余资金=5840 剩余水量=152 剩余食物=300 第3天: 所在区域=4 剩余资金=5840 剩余水量=142 剩余食物=286 第4天: 所在区域=4 剩余资金=5840 剩余水量=132 剩余食物=276 第5天: 所在区域=12 剩余资金=5840 剩余水量=122 剩余食物=262 第6天: 所在区域=21 剩余资金=5840 剩余水量=106 剩余食物=250 第7天: 所在区域=21 剩余资金=5840 剩余水量=96 剩余食物=240 第8天: 所在区域=29 剩余资金=5840 剩余水量=86 剩余食物=226 第9天: 所在区域=30 剩余资金=5840 剩余水量=70 剩余食物=214 第10天: 所在区域=30 剩余资金=6840 剩余水量=46 剩余食物=196 第11天: 所在区域=30 剩余资金=7840 剩余水量=16 剩余食物=166 第12天: 所在区域=39 剩余资金=3720 剩余水量=240 剩余食物=240 第13天: 所在区域=47 剩余资金=3720 剩余水量=230 剩余食物=226 第14天: 所在区域=55 剩余资金=3720 剩余水量=214 剩余食物=214 第15天: 所在区域=55 剩余资金=4720 剩余水量=190 剩余食物=196 第16天: 所在区域=55 剩余资金=5720 剩余水量=166 剩余食物=178 第17天: 所在区域=55 剩余资金=6720 剩余水量=136 剩余食物=148 第18天: 所在区域=55 剩余资金=7720 剩余水量=106 剩余食物=118 第19天: 所在区域=62 剩余资金=12590 剩余水量=201 剩余食物=207 第20天: 所在区域=55 剩余资金=12590 剩余水量=185 剩余食物=195 第21天: 所在区域=55 剩余资金=12590 剩余水量=170 剩余食物=174 第22天: 所在区域=55 剩余资金=12590 剩余水量=155 剩余食物=153 第23天: 所在区域=55 剩余资金=12590 剩余水量=131 剩余食物=135 第24天: 所在区域=55 剩余资金=12590 剩余水量=116 剩余食物=114 第25天: 所在区域=55 剩余资金=12590 剩余水量=86 剩余食物=84 第26天: 所在区域=55 剩余资金=12590 剩余水量=62 剩余食物=66 第27天: 所在区域=55 剩余资金=12590 剩余水量=47 剩余食物=45 第28天: 所在区域=55 剩余资金=12590 剩余水量=32 剩余食物=24 第29天: 所在区域=56 剩余资金=12590 剩余水量=16 剩余食物=12 第30天: 所在区域=64 剩余资金=12590 剩余水量=0 剩余食物=0 ``` ### 第三关 #### 运算参数 ```java // 模型参数调整 private static Integer maxCapital = 0; //最优抉择收益值 private static Integer initWaterNum = 200; //初始携带水 private static Integer initFoodNum = 300; //初始携带食物 private static final Integer initCapital = 10000; //起始资金 private static final Integer waterWeight = 3; //单份水重量 private static final Integer foodWeight = 2; // 单份食物重量 private static final Integer weightMax = 1200; // 负重上限 private static final Integer average = weightMax/(waterWeight+foodWeight); // 补给平衡值 private static final Integer profit = 200; //挖矿收益 private static final Integer terminationDate = 10; // 终止日期 private static final Integer waterPrice = 5; // 单份水价格 private static final Integer foodPrice = 10; // 单份食物价格 private static final Integer sunnyWater = 3; // 晴天基础水消耗 private static final Integer sunnyFood = 4; // 晴天基础食物消耗 private static final Integer highWater = 9; // 高温基础水消耗 private static final Integer highFood = 9; // 高温基础食物消耗 private static final Integer sandstormWater = 10; // 沙暴基础水消耗 private static final Integer sandstormFood = 10; // 沙暴基础食物消耗 private static final Integer threshold = average; // 食物补给阈值 private static final Integer balance = 0; // 食物-水 补给平衡参数 private static final Integer sunnyProbability = 70; // 晴朗天气概率 (%) private static final Integer highProbability = 30; // 高温天气概率 (%) private static final Integer sandstormProbability = 0; // 沙暴天气概率 (%) private static final Integer seed = 12345678; // 生成随机数种子 ps:相同得种子数,生成得随机天气相同,用于验证使用 ``` #### 游戏地图 ```java private static GameMap initMap() { GameMap m1 = new GameMap(1, null, GameMap.type.start); GameMap m3 = new GameMap(3, null, GameMap.type.land); GameMap m4 = new GameMap(4, null, GameMap.type.land); GameMap m5 = new GameMap(5, null, GameMap.type.land); GameMap m6 = new GameMap(6, null, GameMap.type.land); GameMap m9 = new GameMap(9, null, GameMap.type.mine); GameMap m11 = new GameMap(11, null, GameMap.type.land); GameMap m13 = new GameMap(13, null, GameMap.type.end); m1.setAdjacent(Arrays.asList(m4,m5)); m5.setAdjacent(Arrays.asList(m6)); m6.setAdjacent(Arrays.asList(m13)); m3.setAdjacent(Collections.singletonList(m9)); m4.setAdjacent(Collections.singletonList(m3)); m9.setAdjacent(Collections.singletonList(m11)); m11.setAdjacent(Collections.singletonList(m13)); m13.setAdjacent(Arrays.asList()); return m1; } ``` #### 运算结果 ```java 成功通关! 旅途总收益=9510 旅途总水消耗=30 旅途总食物消耗=34 本次模型运算随机数生成参数: 晴朗天气概率: 70% 高温天气概率: 30% 沙暴天气概率: 0% 随机数生成种子:12345678 本次旅行遭遇天气情况: 1.晴朗 2.晴朗 3.高温 4.高温 5.晴朗 6.晴朗 7.晴朗 8.高温 9.晴朗 10.晴朗 具体行程安排如下: 第0天: 所在区域=1 剩余资金=9510 剩余水量=30 剩余食物=34 第1天: 所在区域=5 剩余资金=9510 剩余水量=24 剩余食物=26 第2天: 所在区域=6 剩余资金=9510 剩余水量=18 剩余食物=18 第3天: 所在区域=13 剩余资金=9510 剩余水量=0 剩余食物=0 ``` ### 第四关 #### 运行参数 ```java // 模型参数调整 private static Integer maxCapital = 0; //最优抉择收益值 private static Integer initWaterNum = 201; //初始携带水 private static Integer initFoodNum = 298; //初始携带食物 private static final Integer initCapital = 10000; //起始资金 private static final Integer waterWeight = 3; //单份水重量 private static final Integer foodWeight = 2; // 单份食物重量 private static final Integer weightMax = 1200; // 负重上限 private static final Integer average = weightMax/(waterWeight+foodWeight); // 补给平衡值 private static final Integer profit = 1000; //挖矿收益 private static final Integer terminationDate = 30; // 终止日期 private static final Integer waterPrice = 5; // 单份水价格 private static final Integer foodPrice = 10; // 单份食物价格 private static final Integer sunnyWater = 3; // 晴天基础水消耗 private static final Integer sunnyFood = 4; // 晴天基础食物消耗 private static final Integer highWater = 9; // 高温基础水消耗 private static final Integer highFood = 9; // 高温基础食物消耗 private static final Integer sandstormWater = 10; // 沙暴基础水消耗 private static final Integer sandstormFood = 10; // 沙暴基础食物消耗 private static final Integer threshold = average; // 食物补给阈值 private static final Integer balance = 15; // 食物-水 补给平衡参数 正数为水少食物多,负数为食物少水多 private static final Integer sunnyProbability = 0; // 晴朗天气概率 (%) private static final Integer highProbability = 98; // 高温天气概率 (%) private static final Integer sandstormProbability = 2; // 沙暴天气概率 (%) private static final Integer seed = 12345678; // 生成随机数种子 ps:相同得种子数,生成得随机天气相同,用于验证使用 ``` #### 游戏地图 ```java private static GameMap initMap() { GameMap m1 = new GameMap(1, null, GameMap.type.start); GameMap m2 = new GameMap(2, null, GameMap.type.land); GameMap m7 = new GameMap(7, null, GameMap.type.land); GameMap m8 = new GameMap(8, null, GameMap.type.land); GameMap m13 = new GameMap(13, null, GameMap.type.land); GameMap m14 = new GameMap(14, null, GameMap.type.village); GameMap m18 = new GameMap(18, null, GameMap.type.mine); GameMap m19 = new GameMap(19, null, GameMap.type.land); GameMap m20 = new GameMap(20, null, GameMap.type.land); GameMap m25 = new GameMap(25, null, GameMap.type.end); m1.setAdjacent(Arrays.asList(m2)); m2.setAdjacent(Arrays.asList(m7)); m7.setAdjacent(Arrays.asList(m8)); m8.setAdjacent(Arrays.asList(m13)); m13.setAdjacent(Arrays.asList(m14,m18)); m14.setAdjacent(Arrays.asList(m13,m19)); m18.setAdjacent(Arrays.asList(m13,m19)); m19.setAdjacent(Arrays.asList(m20)); m20.setAdjacent(Arrays.asList(m25)); m25.setAdjacent(Arrays.asList()); return m1; } ``` #### 运算结果 ```java 成功通关! 旅途总收益=9030 旅途总水消耗=198 旅途总食物消耗=198 本次模型运算随机数生成参数: 晴朗天气概率: 0% 高温天气概率: 98% 沙暴天气概率: 2% 随机数生成种子:12345678 本次旅行遭遇天气情况: 1.高温 2.高温 3.高温 4.高温 5.高温 6.高温 7.高温 8.高温 9.高温 10.高温 11.高温 12.高温 13.高温 14.高温 15.高温 16.高温 17.高温 18.高温 19.高温 20.高温 21.高温 22.高温 23.高温 24.高温 25.高温 26.高温 27.高温 28.高温 29.高温 30.高温 具体行程安排如下: 第0天: 所在区域=1 剩余资金=9030 剩余水量=198 剩余食物=198 第1天: 所在区域=2 剩余资金=9030 剩余水量=180 剩余食物=180 第2天: 所在区域=7 剩余资金=9030 剩余水量=162 剩余食物=162 第3天: 所在区域=8 剩余资金=9030 剩余水量=144 剩余食物=144 第4天: 所在区域=13 剩余资金=9030 剩余水量=126 剩余食物=126 第5天: 所在区域=18 剩余资金=9030 剩余水量=108 剩余食物=108 第6天: 所在区域=18 剩余资金=9030 剩余水量=81 剩余食物=81 第7天: 所在区域=18 剩余资金=9030 剩余水量=54 剩余食物=54 第8天: 所在区域=19 剩余资金=9030 剩余水量=36 剩余食物=36 第9天: 所在区域=20 剩余资金=9030 剩余水量=18 剩余食物=18 第10天: 所在区域=25 剩余资金=9030 剩余水量=0 剩余食物=0 ``` ### 第五关 #### 运行参数 ```java // 模型参数调整 private static Integer maxCapital = 0; //最优抉择收益值 private static Integer initWaterNum = 200; //初始携带食物 private static Integer initFoodNum = 300; //初始携带水 private static final Integer initCapital = 10000; //起始资金 private static final Integer waterWeight = 3; //单份水重量 private static final Integer foodWeight = 2; // 单份食物重量 private static final Integer weightMax = 1200; // 负重上限 private static final Integer average = weightMax / (waterWeight + foodWeight); // 补给平衡值 private static final Integer profit = 200; //挖矿收益 private static final Integer terminationDate = 10; // 终止日期 private static final Integer waterPrice = 5; // 单份水价格 private static final Integer foodPrice = 10; // 单份食物价格 private static final Integer sunnyWater = 3; // 晴天基础水消耗 private static final Integer sunnyFood = 4; // 晴天基础食物消耗 private static final Integer highWater = 9; // 高温基础水消耗 private static final Integer highFood = 9; // 高温基础食物消耗 private static final Integer sandstormWater = 10; // 沙暴基础水消耗 private static final Integer sandstormFood = 10; // 沙暴基础食物消耗 private static final Integer threshold = average; // 食物补给阈值 private static final Integer balance = 0; // 食物-水 补给平衡参数 ``` #### 游戏地图 ```java private static GameMap initMap() { GameMap m1 = new GameMap(1, null, GameMap.type.start); GameMap m3 = new GameMap(3, null, GameMap.type.land); GameMap m4 = new GameMap(4, null, GameMap.type.land); GameMap m5 = new GameMap(5, null, GameMap.type.land); GameMap m6 = new GameMap(6, null, GameMap.type.land); GameMap m7 = new GameMap(7, null, GameMap.type.land); GameMap m9 = new GameMap(9, null, GameMap.type.mine); GameMap m11 = new GameMap(11, null, GameMap.type.land); GameMap m12 = new GameMap(12, null, GameMap.type.land); GameMap m13 = new GameMap(13, null, GameMap.type.end); m1.setAdjacent(Arrays.asList(m4, m5)); m5.setAdjacent(Arrays.asList(m6)); m6.setAdjacent(Arrays.asList(m13)); m7.setAdjacent(Arrays.asList(m12)); m3.setAdjacent(Arrays.asList(m9)); m4.setAdjacent(Arrays.asList(m3,m6,m7)); m9.setAdjacent(Arrays.asList(m11)); m11.setAdjacent(Arrays.asList(m13)); m12.setAdjacent(Arrays.asList(m13)); m13.setAdjacent(Arrays.asList()); return m1; } ``` #### 运算结果 ```java 成功通关! 玩家总收益:18910 玩家1: 旅途总收益=9425 旅途总水消耗=42 旅途总食物消耗=50 玩家2: 旅途总收益=9535 旅途总水消耗=36 旅途总食物消耗=42 玩家1具体行程安排如下: 第0天: 所在区域=1 剩余资金=9425 剩余水量=33 剩余食物=41 第1天: 所在区域=4 剩余资金=9425 剩余水量=27 剩余食物=33 第2天: 所在区域=4 剩余资金=9425 剩余水量=18 剩余食物=24 第3天: 所在区域=7 剩余资金=9425 剩余水量=12 剩余食物=16 第4天: 所在区域=12 剩余资金=9425 剩余水量=6 剩余食物=8 第5天: 所在区域=13 剩余资金=9425 剩余水量=0 剩余食物=0 玩家2具体行程安排如下: 第0天: 所在区域=1 剩余资金=9535 剩余水量=27 剩余食物=33 第1天: 所在区域=5 剩余资金=9535 剩余水量=21 剩余食物=25 第2天: 所在区域=5 剩余资金=9535 剩余水量=12 剩余食物=16 第3天: 所在区域=6 剩余资金=9535 剩余水量=6 剩余食物=8 第4天: 所在区域=13 剩余资金=9535 剩余水量=0 剩余食物=0 ```