MathWorks数学建模挑战赛

本周的文章由Reece Teramoto

MathWorks最近获得了“数学建模挑战赛”(Math Modeling Challenge)的赞助,这是由SIAM -工业与应用数学协会(Society for Industrial and Applied Mathematics)组织的一项针对美国高中三年级和四年级学生的竞赛。https://m3challenge.siam.org。学生们组成团队,解决专业数学家面临的现实问题。每个小组有14个小时的时间来完成一个由三部分组成的问题,使用数学建模,并将他们的结果写在一起。团队可以选择使用任何软件或语言(或不使用)来进行数学计算。

2018年竞赛问题

我们决定把过去一年用MATLAB完成的问题的一组样本解放在一起。

去年的挑战关注的是食物浪费问题。学生们被要求进行计算,分析浪费的食物量,并将结果应用到解决这个国家数百万粮食不安全人群的问题上。你可以查看完整的问题在这里和获胜解在这里

在这篇文章中,我将对问题的每个部分进行简要概述,并对MATLAB中组合的一个示例解决方案进行总结。每个示例对应的现场脚本将演示如何在MATLAB中执行以下操作:

  • 导入数据
  • 处理和建模数据
  • 可视化结果(图表,图表,曲线拟合,图表)
  • 从结果中得出有意义的结论

虽然问题的三个部分都演示了上面的步骤,但这三个部分将分别关注MATLAB中的不同工具。我们将重点关注导入工具,曲线拟合程序,映射的工具箱

在阅读这篇文章的其余部分之前,请从File Exchange下载完整的MATLAB示例好叫你们查阅。

内容

只吃它!(导入工具)

你可以通过打开文件找到这个问题的完整示例Just_Eat_It.mlx来自本博客文章开头链接的存档。

对于这部分问题,学生们要创建一个数学模型,一个州可以用这个模型来确定它是否可以利用该州产生的浪费食物来养活其粮食不安全的人口。学生们将获得德克萨斯州食物浪费和不安全状况的样本数据。

这是解决这个问题的一种方法,运用技术计算技能:

  1. 计算州消费者浪费了多少美元的食物。
  2. 计算需要多少美元来养活该州所有的粮食不安全的人。
  3. 比较这两个值,确定利用该州消费者浪费的食物,可以养活多少该州的粮食不安全人口。

首先,我们可以用MATLAB导入工具导入提供电子表格数据并将所有数据保存到表格中。这个导入只需点击几下即可完成:

一旦我们在MATLAB中有了我们的数据,我们就可以使用许多内置的MATLAB函数来组织和总结我们的数据。

从这些数据中,我们可以计算出德克萨斯州不同类别的浪费食物的美元价值,我们可以将其可视化:

栏(foodWasteTable。TypeofFood foodWasteTable.WastedDollars);ytickformat('usd') xlabel(' Food Type ') ylabel('Amount waste ') title('Dollars of waste Food in Texas(2016)') %将y轴改为n x 10^6(百万)ax = gca;ax.YAxis.Exponent = 6;


% sort从最小到最大的食物浪费foodWasteTable = sortrows(foodWasteTable,'WastedDollars');%将3个最小的类别组合起来,并将其标记为“其他”p = pie([sum(foodWasteTable.WastedDollars(1:3)));foodWasteTable.WastedDollars(4:结束)]);传奇([“其他”;foodWasteTable.TypeofFood(4:end)], 'Location', 'eastoutside') title('浪费食物类别')

正如人们所预料的那样,浪费食物最多的两类是肉类和农产品。经过进一步计算,我们发现德克萨斯州每年浪费的食物价值约为23亿美元。

第二步是找到所需的美元,以养活所有粮食不安全的人。“喂饱美国”组织进行了这一计算在这里。我们可以很容易地将其转换到MATLAB中,发现在德克萨斯州,每年养活粮食不安全人群的成本约为22亿美元。

对于最后的比较,并基于我们在文件中注明的假设Just_Eat_It.mlx,我们决定通过重新利用该州的浪费食物,我们可以养活德克萨斯州所有的食物不安全的人。

食物愚蠢吗?(曲线拟合程序)

你可以通过打开文件找到这个问题的完整示例Food_Foolish.mlx来自本博客文章开头链接的存档。

在食物消费方面,个人选择主要发生在杂货店、学校食堂、餐馆和家里。对于这部分问题,学生们要创建一个数学模型,可以根据他们的特点和习惯来确定一个家庭一年内产生的食物浪费量。然后,该模型应该应用到以下家庭:

  • 有一个蹒跚学步的孩子的单亲父母,年收入20,500美元
  • 四口之家(两位父母,两个十几岁的孩子),年收入13.5万美元
  • 一对老夫妇,靠退休生活,年收入5.5万美元
  • 23岁单身,年收入4.5万美元

我们将使用曲线拟合程序在MATLAB中找到家庭收入和浪费的食物之间的关系。我们的方法如下:

  1. 收集家庭收入和浪费食物的数据。我们可以把每个数据点想象成xy平面上的一个点,其中x轴是家庭收入,y轴是浪费的食物。
  2. 使用Curve Fitting App生成一个函数,对趋势进行建模。
  3. 这种关系可视化。
  4. 在样本家庭数据的收入水平上评估曲线。

美国劳工统计局(Bureau of Labor Statistics)收集了不同收入人群的年度食品支出数据。你可以在。网站上找到数据这个表格。我们可以将这些数据导入MATLAB中使用导入工具并将数据存储在表格

一旦我们有了数据点,我们就可以使用曲线拟合App来生成曲线拟合。该应用程序可以很容易地快速尝试一条曲线与数据点的不同拟合,并查看每次拟合的直接结果:

一旦我们有了我们的拟合曲线,我们可以传入样本家庭收入数据:

sampleIncome = [20500 135000 55000 45000]';sampleWaste = foodWasteCurve (sampleIncome);families ={'单亲带一个蹒跚学步的孩子','四口之家(双亲,两个十几岁的孩子)',…“老夫妻,靠退休生活”,“23岁单身”};solution = table(sampleIncome,sampleWaste, 'RowNames', families)

我们还可以绘制各种收入的食物浪费趋势的柱状图和折线图。然后,我们可以绘制出问题陈述中给出的4个样本家庭的点。这张图很容易将家庭收入和每年浪费食物的金额之间的关系形象化。因为我们假设食物浪费取决于只有在家庭收入方面,我们有解决这部分问题的办法。

%条形图条(incomeRange, wasteDemo)保持%线形图图(incomeRange, wasteDemo, 'LineWidth', 3, 'Color', 'green') %从问题语句散点(solution.)sampleIncome,解决方案。sampleWaste, 'Marker', '*', 'LineWidth', 5, 'MarkerEdgeColor', 'red') hold off xlabel('Income (USD)') ylabel('Annual Food Waste (USD)') title ('Food Waste by Income')

饥饿游戏计划吗?(映射工具箱)

你可以通过打开文件找到这个问题的完整示例Hunger_Game_Plan.mlx从档案链接到文件交换

对于这个问题,学生们将使用数学建模来提供一种策略,让当地社区可以用最小的成本重新利用被浪费的食物。世界杯预选赛小组名单

我们的方法如下:

  1. 使用映射的工具箱显示20多家杂货店的位置,包括波士顿所有的Stop and Shops。
  2. 显示大波士顿食品银行的位置。
  3. 找到最短的路径,从食物银行开始,拜访所有的杂货店收集过去一周被浪费的农产品,到食物银行结束。
  4. 计算过去一周节省的农产品的卡车运输成本和美元。

Stop and Shop是新英格兰地区最受欢迎的连锁杂货店大波士顿食品银行是MathWorks支持的一个组织,我们解决这个问题的方法是找到食品收集车可以从大波士顿食品银行出发的最短路径,访问每个Stop and Shop和波士顿地区的其他一些商店,收集否则被浪费的农产品,然后返回大波士顿食品银行。我们希望找到最短的路径,因为这将使卡车的运营成本最小化。

这种特殊的场景在计算机科学中被称为旅行推销员问题(TSP),一个推销员从他们的家乡出发,想要访问多个城市,然后以尽可能短的路径返回家乡。

映射的工具箱让我们在给定经纬度值的地图上绘制点。我们首先显示波士顿地区的所有Stop and Shop位置(用绿色标记标识)。坐标来自谷歌Maps。

这个只有13个地点的TSP并没有太大的挑战,所以我们随机选择了11个地点(显示为暗红色),以及大波士顿食品银行(显示为蓝色)。

wmmarker(Lats(1:13), Lons(1:13), 'Icon', 'stopandshoplogo.jpg') wmmarker(Lats(14:24), Lons(14:24), 'color', darkred) wmmarker(Lats(25), Lons(25), 'color', ' blue ')

之前的Cleve’s Corner帖子描述了旅行推销员问题的一个近似最优解。我们可以把坐标传递给旅行者,以获得他们之间的最短路径。我们也可以使用映射工具箱来查看这条路径:

背阔肌,背阔肌(路径);朗=经度(路径);wmline(背阔肌,经度)

虽然返回的路径没有考虑道路的确切路径,但我们仍然得到了一个很好的最短路径和行走距离的估计。驾驶一辆18轮马车的费用是每英里1美元多一点,我们可以计算出这趟旅程的汽油总成本——大约30美元。

此外,我们可以使用一些数据国家资源保护委员会来计算一下,美国的杂货店平均每周在水果和蔬菜上浪费7500美元。这意味着,通过完成这次往返,我们将从波士顿地区过去一周的这些地点回收价值近20万美元的水果和蔬菜,否则这些水果和蔬菜会被浪费掉。很好!

想参与挑战吗?

希望这篇文章已经让你了解了MATLAB是如何轻松地对数据进行分析、可视化和执行计算。要查看以上问题的完整MATLAB解,请从文件交换下载文件

此外,如果你知道任何高中三年级和四年级的学生对这个挑战感兴趣,鼓励他们参加!该挑战是免费参加的,并有10万美元的奖学金。这项挑战完全是在网上完成的,有大量的参考资料可以帮助团队准备。欲了解更多信息,请访问以下链接:

https://m3challenge.siam.org/participate

|
  • 打印
  • 发送电子邮件

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。

Baidu
map