python实现M-C问题的A*算法,采用h(n)=m+c-2b(或具有更多启发信息的)作为启发?

作者&投稿:帛庙 (若有异议请与网页底部的电邮联系)
~ M-C问题是一个经典的人工智能问题,它描述了一个传教士和食人族的河岸过河问题。A*算法是一种启发式搜索算法,它可以找到从初始状态到目标状态的最优路径。A*算法的核心是使用一个函数f(n)来评估每个状态的优先级,f(n)等于g(n)和h(n)的和,其中g(n)是从初始状态到当前状态的实际代价,h(n)是从当前状态到目标状态的预估代价。h(n)越接近真实代价,A*算法越有效。
为了用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):
# 判断一个状态


用Python编写,当M>N时,计算M!\/(N!*(M-N)!),M和N由键盘输入?
def nj(n):if n == 0 or n == 1:return 1 else:return (n*nj(n-1))这是计算n!的函数。m!的你也可以这样计算。然后按顺序乘除就可以了

python完成程序输入m个成绩,输出最高分最低分平均成绩
python完成程序输入m个成绩,输出最高分最低分平均成绩 grades = []min_grade = None max_grade = None sum_grade = 0.0 m = int(raw_input("Input m: "))for i in range(m):grade = float(raw_input("Input grade %s: " % i))grades.append(grade)sum_grade += grade if not ...

设计一个本原多项式f(x)=1+x+x^3的m序列产生器。其周期是多少?写出状 ...
状态转移方程:S_n = [S_(n-1) S_(n-4)] + [1 0 0 1 0 0 0],其中“+”表示GF(2)中的按位异或运算。初始状态为S_0 = [1 0 0 0],每次生成一个输出b_n = S_(n-1)[0]。下面是一个简单的Python代码实现:def lfsr():初始化状态 state = [1, 0, 0, 0]系数多项式...

python中max函数是什么意思?
max{x,y}表示x、y两个数中的最大值,min{x,y}表示x、y两个数中的最小值。M=max(X,Y)表示M这个随机变量是X与Y中较大者M=min(X,Y)表示M这个随机变量是X与Y中较小者。max{x,y}是取x,y中的最大值;min{x,y}是取x,y中的最小值;当x=y时max{x,y} =min{x,y};当x≠y...

Python语句m-=n可以写成什么?
Python语句 m-=n 等价于 m = m - n。其中 -= 是 Python 中的一个赋值运算符,它表示“减等于”,也就是将等号左边的变量减去等号右边的值,然后将结果赋给左边的变量。所以,m -= n 操作可以理解为 m = m - n 操作的简写形式。

python代码:用户输入n和m,编程打印整数1~n的平方,输出格式是每行m个...
n=int(input("Please input n(n>=1): "))m=int(input("Please input m(m>0):"))count = 0;for i in range(1,n+1): print("%10d" %(i*i),end=' ') count += 1 if(count%m==0): print(end='\\n')

python:定义函数,输入一个m维数组X和一个整数n,输出一个n*m的矩阵M...
Python3.6import numpy as npwhile True: x = input("输入一个m维数组,元素以空格分开:") try: # split input x = x.split() s = [] # iterate:str-->int for i in x: s.append(int(i)) x = s break except: print("输入有错,请重新输...

帮写段Python 我菜鸟 大概意思是 设X=3 Y=2 M=X+Y 输出M
x=3 y=2 m=x+y print(m)你自己不是已经写出来了么。上面的print是python3的,2的写法好像是没有括号

python中m=x[0:fh]是什么意思?
答: X表示一个可迭代对象。比如列表。而中括号里面的部分表示取列表当中的部分值,并将其赋给m。比如说x为[1,2,3,4,5],fh为4 ,0:fh将会从0到 fh-1取值,既左闭右开。所以最后的结果为[1,2,3],并将其赋值给m。 希望能够帮助到你。同时0:fh默认的步幅为一,根据自己的需要,我们也...

python中有哪些简单的算法?
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部分资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,...

呈贡县13448503386: python循环语句 -
闭霞利百: Python While循环语句 Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务.其基本形式为: while 判断条件:执行语句…… 执行语句可以是单个语句或语句块.判断条件可以是任...

呈贡县13448503386: C语言巨难的一个编程实现数据筛选,实在想不通怎么解决,请求帮助.或者有没有别的数据结构可解决此问题 -
闭霞利百: 1,从一个数组里取c个数的组合问题,这个可以用递归实现.m长度的数据,用a[M]定义,M是m的最大值 组合结果用out[MM][C]定义.MM是组合最多的上限,C是c的最大值 int Comb(int *a, int m, int c, int *out[C]) //返回值是组合的个数.{ if (m...

呈贡县13448503386: 求帮我编一个简单的python程序 -
闭霞利百: #!/usr/bin/python def Test(): Ca=0.34 Cr=float(raw_input('Cr:')) m=float(raw_input('m:')) C=Cr-Ca if C<0.06 : print 'gas-emission scope error' else : Q=(60*m*C)/0.66 print Q T=float(raw_input('T:')) W=Q*T print W if "__main__"==__name__ : Test() 无聊随便写了下,结果没问题,自己可以润色下...

呈贡县13448503386: 设计一个程序,输入a,b,c,m,n的值,输出二次函数y=ax^2+bx+c在闭区间[m,n]上的最大 值和最小值 -
闭霞利百: //y=ax^2+bx+c //参考 #include<stdio.h> #include<stdlib.h> int main() { int s,n,m,a,b,c;//定义变量 scanf("%d%d%d%d%d",&a,&b,&c,&n,&m) ; if (a==0) //a==0的情况 if (b==0) printf("ymax=%d\n",c); else printf("ymax=%d\n",abs(n+c/b)>=abs(...

呈贡县13448503386: python问题!输入为一行,包括了用空格分隔的三个整数A、B、C输出为一行,为“A+B+C”的计算结果. -
闭霞利百: 计蒜客 或者是泡面吧这些在线学习的问题,这个是Python的写法,绝对可以!亲测,自己刚写出来,也刚刚接触Python 希望多多指教. lst = raw_input().split(' ') sum = 0 for i in lst:sum = sum+int(i) print sum另外在这个博客上还看到了其他两种语言Java和C的解答: https://www.mrxn.net/codelife/A-B-C-sum-Java-c-Python.html

呈贡县13448503386: python编程.假定输入字符串中只包含字母和*号,请编写函数fun,它的功能是将字符串中间的*号 -
闭霞利百: # -*- coding: UTF-8 -*- import re __author__ = 'lpe234' raw_str = '****' def filter_star(_raw_str): begin_len = len(re.findall(r'(^\**?)[a-zA-Z]', _raw_str)[0]) if re.findall(r'(^\**?)[a-zA-Z]', _raw_str) else 0 end_len = len(re.findall(r'[a-zA-Z](\**?

呈贡县13448503386: 定义一个求阶乘的函数,然后计算1! - 2!+3! - 4!+5! - 6!+7! - 8!+9!.C语言问题 -
闭霞利百: int fact(int n) {int m = 1;while(n>0){m*=n;n--;}return m; } int main() {int i, sum=0;for(i=1;i<=9;i++){if(i%2)sum+=fact(i);elsesum-=fact(i);}printf("1!容-2!+3!-4!+5!-6!+7!-8!+9!=%d\n", sum); }

呈贡县13448503386: 编写程序求m!/(n!*(m - n)!)的值.要求:求某个数的阶乘必须用自定义的函数实现. n<=m<=20 -
闭霞利百: 1 2 3 4 5#include<stdio.h> doublef(intn) { inti; doublem=1; for( i=1;i<=n;i++ ) m*=i; returnm; } voidmain() { doubley; intm,n;scanf("%d%d",&n,&m); y=f(m)/(f(n)*f(m-n)!); printf("%lf\n",y); }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网