为了用Python实现M-C问题的A*算法,我们需要定义以下几个部分:
- 状态:一个状态是一个三元组(m, c, b),型腔表示河的左岸有m个传教士,c个食人族,b为1表示旅唯船在左岸,为0表示船在右岸。
- 初始状态:(3, 3, 1),表示左岸有3个传教士,3个食人族,船在左岸。
- 目标状态:(0, 0, 0),表示左岸没有传教士,没有食人族,船在右岸。
- *** 作:一个 *** 作是一个二元组(x, y),表示从当前岸向另一岸运送x个传教士,y个食人族,满足以下条件:
- 0 <= x <= 1,0 <= y <= 2,x + y <= 2,x + y >0,表示每次最多运送两个人,最少运送一个人,可以是传教士或者食人族。
- 如果b为1,表示船在左岸,那么m >= x,c >= y,表示不能运送超过当前岸的人数。
- 如果b为0,表示船在右岸,那么m <= 3 - x,c <= 3 - y,表示不能运送超过另一岸的人数。
- 在任何一岸,传教士的人数不能少于食人族的人数,除非传教士的人数为0,表示不会被吃掉。
- g(n):从初始状态到当前状态的实际代价,可以简单地定义为已经运送的人数。
- h(n):从当前状态到目标状态的预估代价,可以根据题目给出的公式定义为h(n) = m + c - 2b,或者使用其他更有启发性的公式,例如h(n) = max(m, c) - b,表示至少需要运送的次数。
Python代码实现:
```python
# 定义状态类
class State:
def __init__(self, m, c, b):
self.m = m # 左岸的传教士数
self.c = c # 左岸的食人族数
self.b = b # 船的位置,1为左岸,0为右岸
def __eq__(self, other):
# 判断两个状态是否相等
return self.m == other.m and self.c == other.c and self.b == other.b
def __hash__(self):
# 为了将状态作为字典的键,需要定义哈希函数
return hash((self.m, self.c, self.b))
def __str__(self):
# 为了方便打印状态卜镇衫,需要定义字符串表示
return f"({self.m}, {self.c}, {self.b})"
def is_valid(self):
# 判断一个状态
连接和剪枝。
简言让碧带之就是对一个已知的交易坦芦数据库D,有一个最小支持阈值min_support,即为该算法的输入;算法的输出为满足最小支持阈值的频繁项集L。
具体为:扫描D,对每个交易商品(T1,...,Tk---1项候选项集)计数,找出满足计数大于min_support的项集,即为1项频繁集L1;
关键的来了:如何由1项频繁集L1产生2项候选慧陵项集C2,此步称为连接。
如何由C2得到L2,此步即为剪枝。从C2中找出计数大于min_support的项集,即为L2。
重复以上过程,增大频繁项集的长度,直至没有更长的频繁项集。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)