关键词:数学建模,国赛,python,仿真,车间调度,遗传算法
主关键词:用于调度的遗传算法与生成树核
目录
一、前言
1.参赛目的
2.参赛准备
3.选题
二、问题概述
1.问题背景
2.问题简述
3.思路
三、建模经历
1.第一天
2.第二天
3.第三天
4.此刻
四、解题流程
1.目标
2.穷举思想
3.仿真
4.遗传算法
5.生成树核
五、代码编写
1.仿真
(1)引入
(2)错误类
(3)CNC与CNC状态类
(4)RGV类
(5)用法
2.生成树核
3.遗传算法
4.其他情况
六、最终感悟
1.不完全确定的错误
(1)择题
(2)休息
(3)建模步骤
(4)建模分工
2.完全确定的错误
(1)应该审核论文
(2)应该参与论文编撰
3.结语
一、前言
1.参赛目的:
作为热爱计算机学生,曾经为了机器学习学了numpy、pandas、matplotlib,然而就算暂时掌握了这些工具,却是一点机器学习的边都没搭上,苦恼时发现了学校组织参加的数学建模竞赛,竟然和机器学习如此相关,于是报名参加数学建模,纵使每次准备都是很仓促的,但这种短时间内发挥自己积累的能量、激发潜能的感觉真的很爽。
2.参赛准备:
我是队内的编程手,自然是先说我的编程能力;我之前的精力更加投入在Python Web上,Python基础语法是绝对没问题的,也因此不想现学matlab、r、lingo之类的语言或工具,之前提到的python数据科学包使用都没问题;Sympy库用于处理符号运算不错,可惜我在比赛中并没有碰到使用它的情况;像statsmodels、scipy这种库可以很快的改成我需要的代码,如果是tensorflow这种库暂时也没什么办法。
我认为我的优势是:程序的组织能力相比于纯粹的数学建模编程手要好一些,同时学过数据库的原理、操控,大批量数据处理是我的最大优势。相对的:对现有代码的改造就不如纯粹的建模编程手,毕竟数学建模比赛不需要考虑到代码的重用性,而且大量资料都是matlab的,我虽然能看懂一些,却没法像python一样应用自如。如果我遇到一些问题,会去网上寻找相关的包来解决问题,找不到的话就搜索原理实现,值得说的是,建模时间很少,能调包的就不要去自己实现,除非有特定需要改写代码的情况。还有一点是好坏均有的:作为以程序员为标准看齐的我,对程序的组织、技术的统一有级高的要求,因此我参加此类竞赛,除非有我认可水平的编程者,我不允许队伍中其他人参与编程。操作excel画画图可以,但是达到编程的级别,matlab、lingo之类的尽量都不要出现。这的确会给我不满意队友罢工的可能,但我只是希望:队友信任我的能力!在上次比赛中,建模手认为某些地方能实现,但我作为编程手,在思考每一个步骤后,认为有某些步骤不可行,并且在反复追问建模手具体步骤后依旧没得到解决,于是我决定不动手去实现。使队伍中出现了短暂的矛盾,建模手自己去用excel鼓咚数据了,最终发现了数据的范围,但没解决建模的问题……数学建模的模型选取确实是建模手的事,模型的大致步骤都应该是建模手考虑的,但编程手绝不是只去实现的工具,落实到细节,没人能比得过编程手,因为编程手是负责动手实现步骤的人!如果不解决编程手的问题,模型是绝对实现不了的。
其次是建模水平:这是我第二次参加的数学建模竞赛,第一次数学建模竞赛是东三省数学建模竞赛,本质是深圳杯的四道题再加上自己出的三道题。当时因为选题仓促,直接选了D题,是一个交通规划的题目,并且是千万数据级别的大数据题目,当时学校的老师都不建议参加,有个性格很急的老师更是直说:这是找死,学校不提供这类题的辅导。不过我在听到大数据时却很兴奋,当时我的会的模型没多少,而处理数据却是优势所在。事实证明当时的选择没错,最后还是在老师的帮助和队友的努力下完成了建模比赛并受益良多,作为唯一选择D题的队伍还拿了一等奖。
很快就到这学期的国赛了,相比于其他高校,我们学校并没有假期集训,因为学校拨款和政策支持不够,老师只能提前一个月组织我们参加培训,每周给一个题目,让我们完成,虽然时间、次数不多,但已经差不多包含了预测、评价、优化问题,我也因此掌握了几个模型。
此时我会并实现的大致有灰色预测、马尔可夫、回归、线性规划、熵值法确定权重、遗传算法。了解一些的包括:数据包络分析法、层次分析法、模糊评价法、混合规划等。为了能在比赛中更好的调包,我特地将自己实现的代码封装,事实证明,在本次比赛中是无用的,国赛提出的问题,根本不可能掉个包就出来,更需要的是根据题目改进算法。同时我发现,国赛考验的不仅仅是掌握模型数量这种表面实力,更重要的是来自各个专业领域知识的内在实力。因此,即使是学了那么多的数学专业学生,未必会比其他专业占更多优势。在这次的B题中,运筹学能起到很大的作用,同时作为计算机专业的学生,我能感觉到这个问题和操作系统中的调度问题很像,而轻工专业的学生,一定也有他们的想法吧。
3.选题:
为什么这次我们会选择B题?
首先,A题,是一个隔热服的问题(淘宝隔热服店家三天被爆),在耐心读完题,并给数据做了个图后,没有什么思路,这很正常,建模就是要慢慢打破自己思维局限的过程,但作为计算机专业的学生,对A题不是很来电,感觉没什么意思。于是看了B题,一眼过去,感觉就是控制小车给机器加料的过程,但是看到“调度”、“路径”这种词汇,瞬间就感觉很亲切,操作系统对进程的调度、数据结构的最短路径都是我们专业的范畴,即像是上次比赛一样,这是我的强项。对比下来,对A题就更不喜欢了。当然,作为编程手,如果队员都选择了A题,我也是不能强行选B的,罢工的权利不是随便用的,之前说了,选择队友就要求队友的相信,反过来说,作为编程手也不能总是让队友失望。
最终选择了B题是一个老师的助攻,嗯,就是上面说的那个急性子的老师,他表示A题是个收束的问题,结果必须要在一定范围内,而B题是发散性的问题,结果百花齐放,只要合理就可以,于是我的队友也跟着选择B题。结果是这老师又错了233,这题没有足够强的编程手支撑,简直爆炸,最后27个队伍,一开始还是对半分,最后换题的不少,参与B题的只占参赛队伍不到三分之一。
由于字数原因,请看【数学建模】2018全国大学生数学建模竞赛B题感悟(中)