很多在现实世界里看似很简单,很轻松就能解决的问题,但要通过程序让计算机来完成,就没那么容易了,因为这涉及到一个很重要的问题——数学建模。
刚上大学那会儿,院里让我报名上数学建模课,我以为仅仅只是MATLAB之类的枯燥乏味的内容,现在过来看是自己太肤浅了。
任何实际问题转换让计算机完成都跨不过以下两步:
1、建立模型——将实际问题转化成数学关系
2、设计算法——将数学问题转化成程序代码
同一个问题,不同的人会可能会建立不同的模型,这将会进一步影响后期程序执行的速度和效率,这是个很高深的话题,在此我不做深入讨论。接下来我们以一个“农夫过河”的故事,初步认识一下什么是建模
话说一位农夫带着一只狼、一只羊和一筐菜过河,无奈船小,农夫每次只能运送一样东西,但狼和羊不能单独待在一起,羊和菜也不能单独在一起。这个农夫该肿么办呢?
第一步、数学建模
这个问题的核心是狼、羊、菜两两之间的位置关系怎么转化成数学关系,可以给三个实物分别赋予三个数值“狼=1、羊=2、菜=3”,如果他们之间的差值等于“1”或“-1”,就认为他们不能单独在一起。
第二步、算法设计
有了以上数学思想,就可以着手设计核心算法了。
我们建立两个空列表分别存贮“左岸”和“右岸”的物品列表,船移动时从哪边运走某物品,就在该列表中删除相应列表项,在另一边列表中增加一个列表项
装船后或卸货前,求一次列表长度,如果长度为2,需要计算两个列表项的差值,如果差值的绝对值为1,输出当前的两个物品不能单独待在一起,如此反复,直到右岸列表项长度为3就说明游戏完成。