python讨论qq群:996113038
导语:
羊狼过河问题是一个非常有趣的小学奥数题。
简单介绍一下这个问题:
一个商人,带了一匹狼,一只羊,一筐菜。来到了一条大河边。现在商人只有一条船,而且每次只能带一样东西往返大河两岸。
在商人不在的时候,狼会吃掉羊,羊会吃掉菜。如何才能让这三件东西完好无损的到达河对岸。
代码及相关资源获取:
1:关注“python趣味爱好者”公众号,回复“羊狼过河 ”获取源代吗。
2:加入群聊:996113038。在群文件中下载源代码以及相关资料。
开发工具:
python3.6.4
相关第三方库:
pandas
numpy
基本原理:
我们将羊,狼,菜过河问题简化成一个数学问题。我们先用数学语言表述一下这个问题。
我们设定一个有四个元素的列表表示狼,羊,菜,商人的状态。
initial_state = [0, 0, 0, 0]
这个元素对应的状态为0时,代表这个元素在此岸,反之在彼岸。
我们需要做的就是讲这个状态由[0,0,0,0]变成[1,1,1,1]、也就是让所有的元素全部过河。
但是为了避免狼吃掉羊,羊吃掉菜。我们对可行的中间状态还要做一定的设置。然后用枚举法的方式列举出来。知道有一个方案能成功让[0,0,0,0]变成[1,1,1,1]为止。
效果演示:下面是计算结果
我解释一下这个计算结果的意思。
第零步:农夫,羊,狼,菜全部在此岸。
第一步:农夫带着“羊(lamb)过河”。
第二步:农夫自己返回此岸
第三步:农夫带着狼(wolf)过河
第四步:农夫带着羊回到此岸。
第五步:农夫带着菜到彼岸
第六步:农夫返回
第七步:农夫带着羊过河。
往期精选:
部分代码:
下面我解释一下下面的代码。
initial_state = [0, 0, 0, 0] # the left side of river = 0
final_state = pd.Series([1, 1, 1, 1])
首先我们设置初始状态和最终要达到的状态。也就是有[0,0,0,0]到达[1,1,1,1]。
然后定义一个farmer功能,在这个功能中,我们设置一下另一个变量,也就是当前状态。也就是在渡河过程中的中间状态。在迭代过程中,我们还要计算一下当前状态是否等于最终状态,如果相等,代表四个元素全部渡河成功。
if (current == final_state).all():
return state
另外我们要设置一下限制条件,也就是每一次渡河时,必须有商人划船。已经不让羊狼独处,不能让羊菜独处。
row = current[current == current['farmer']]
for id in range(num, len(row) - 1):
current = state.loc[len(state) - 1][state_col]
current['farmer'] = 1 - current['farmer']
current[row.index[id]] = 1 - current[row.index[id]]
if not (((current['wolf'] == current['lamb']) and (current['lamb'] != current['farmer'])) or \
((current['lamb'] == current['veg']) and (current['lamb'] != current['farmer']))):
详细代码请大家下载以后仔细了解。
感谢大家观看,有钱的老板可以打赏一下小编哦!
扫描下方二维码,关注公众号
参考来源:
https://blog.csdn.net/sinat_32682001/article/details/90039380?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
作者:齐