7/15 数学建模培训笔记 记录一个感兴趣的例题和题目的讲到的解答方法以及想到的变种问题
【商人过河】 有三个商人和三名随从在河的一边,随从们商量好只要在河的某岸随从人数超过商人,就一起杀掉商人。一条船上最多同时乘坐两人。问应当如何安排过河策略,以让所有商人存活。(PS:随从多半练过武,类似民间侍卫,出其不意袭击的话其实一个随从杀掉三个商人也未必很难,假如商人没有随身携带武器并且习过武 咳咳)
这好像是数学建模里一个经典问题,我们老师直播时放在第三道例题来讲。思路如下:
1、选定需要关心的“量”,或者“状态”,用数学符号表示它们。这一点非常重要,因为如果我们选择了无关紧要的量或者选择的东西之前存在较多重合关系、包含关系,将大大增加问题的繁琐度。
2、根据这些选中的东西之间的逻辑上的联系写出数学关系式,不一定是严格的数学式子,还可以是图像、不等式、集合以及其它我们大一还没有接触到的表达形式。
PPT如下
从老师的建模
来看,有一个很明显的利于计算的特点是:所有涉及到的状态量都包含“k",也就是和渡河的次数挂钩,并且渡河的来与回和-1奇偶性挂钩。这样我们便不用每次渡河使用新的字母来表示各种量,编程时利用循环遍历也可也i非常方便的利用角标k完成相应的计算。并且,这个建模用了一个看似比较抽象的集合——决策,这是我第一次见到这种设未知量的方法(太菜了哈哈哈)。
这么一大片列下来,看起来有点复杂,手算肯定麻烦。因此要用到编程。老师提供的第一种方法是穷举法,编程上机。就是创建出所有相关的量,把所有的可能方案遍历一遍,每次遍历都要满足两个等式:河两岸的商人数量大于等于随从数量,然后筛选出合格的方案。这个也比较麻烦,还占用较多计算资源。
第二种方法:图解法。这个方法和高中数学概率小题里的“棋盘法”有点像,都是在网格图上存在一些点和特殊的走法规则(例如只能左下一格或者向右平移一格),然后计算有哪些移动方式可以从起点到达终点。
PPT如下
这个方法变成编程问题可以储存为二维数组里的1和0,有点的地方为1,数组位置序号类比坐标,然后让计算机戴着镣铐跳舞,在上述移动规则下遍历情况,看看有什么样的步骤能够成功。
变种。当商人或随从的基数大了之后,移动的规则并没有改变,遍历起来的代码也会比前者更清晰、套路更明确、计算量更小。这种问题也可以推广到其它带有较多限制条件的问题上,限制的越多”点“越少、移动的规矩更严,但总体思路是一样的。