目录
更新于 2020.08.03
一、问题描述
3 名商人各带 1 名随从过河(从西岸到东岸),一只小船最多能容纳 2 人。随从们约定:在河的任意一岸,若随从人数多于商人人数,就杀人越货. 但商人们知道了他们的约定,并且掌握着过河大权,他们该采取怎样的策略才能安全过河?
二、算法思想
这个问题实际上是一个迷宫问题,为什么这样说呢?请听我慢慢道来.
首先,我们将每次渡河前西岸的人员分布和船所在的位置统称为一个"状态",用 [ u , v , 1 / 0 ] \small [u,v,1/0] [u,v,1/0] 表示,其中 u , v u,v u,v 表示商人、随从在西岸的人数,末分量表示船的位置:1 表示船在西岸,0 表示船在东岸.将符合条件的状态挑出来组成允许状态集合.
其次,船最多可容纳两个人. 将渡河方案用 [ u , v ] \small [u,v] [u,v] 表示,其中 u , v u,v u,v 分别表示上船的商人数和随从数,并将其称为决策变量,决策变量构成的集合称为决策变量集合.
共有 20 种允许状态和 5 个决策变量.
初始状态为 [ 3 , 3 , 1 ] \small [3,3,1] [3,3,1]:3 名商人、3 名随从在西岸,船停靠在西岸;
终止状态为 [ 0 , 0 , 0 ] \small [0,0,0] [0,0,0]:0 名商人、0 名随从在西岸,船停靠在东岸,此时商人和随从全部到达东岸,这样就确定了"迷宫"的入口和出口.
从一个状态变换到另一个状态是通过决策变量实现的,这里的决策变量也就相当于"迷宫"中的一段路.
所以,我们的任务就是选择可行的路径,从"迷宫"的入口走到出口.
现在你应该觉得这好像是个迷宫问题,但心中应当还存有怀疑,因为只有入口和出口的话,并不能称得上是迷宫问题,那还有什么其他的特点呢?
想想我们是怎样解决迷宫问题的?从入口出发,沿某一方向前进,若能走通,则继续往前走;如果不能走通或是有某一分叉可以抵达出口,则沿原路退回到刚刚的分叉点,换个方向继续前进. 重复这个过程,直至探索出所有可能的通路.
这个问题也是这样的,从初始状态开始,尝试某种渡河方案,若能到达未经过的允许状态,则采取该渡河方案;如果不能到达任何一种允许状态或者是能够抵达终止状态,则原路返回至刚刚的状态,尝试其他的渡河方案. 重复这个过程,直到探索出所有的渡河方案.
读到这儿,你可能会感觉到,这真的就是一个迷宫问题. 好,既然你认同了,咱就继续往下说.