字符串变化不被捕获如果?



我已经得到了这个代码,一个广度优先搜索的AI问题是功能性工作,我现在正试图放置一个全局字符串,将根据实际的"状态"改变因为这是一个人工智能问题,所以有很多代码下面是部分代码(我们感兴趣的部分)

import math
#______________________________________________________________________________
# Missionaries and Cannibals Problem
printestado = 'teste'
class Estado():
global printestado
def __init__(self, canibal_esq, missio_esq, barco, canibal_dir, missio_dir):
self.canibal_esq = canibal_esq
self.missio_esq = missio_esq
self.barco = barco
self.canibal_dir = canibal_dir
self.missio_dir = missio_dir
self.vizinho = None
def objetivo_final(self):
if self.canibal_esq == 0 and self.missio_esq == 0:
return True
else:
return False
def eh_valido(self):
if self.missio_esq >= 0 and self.missio_dir >= 0 
and self.canibal_esq >= 0 and self.canibal_dir >= 0 
and (self.missio_esq == 0 or self.missio_esq >= self.canibal_esq) 
and (self.missio_dir == 0 or self.missio_dir >= self.canibal_dir):
return True
else:
return False
def __eq__(self, other):
return self.canibal_esq == other.canibal_esq and self.missio_esq == other.missio_esq 
and self.barco == other.barco and self.canibal_dir == other.canibal_dir 
and self.missio_dir == other.missio_dir
def __hash__(self):
return hash((self.canibal_esq, self.missio_esq, self.barco, self.canibal_dir, self.missio_dir))
def successors(estado_atual):
global printestado
children = [];
if estado_atual.barco == 'esquerda':
novo_estado = Estado(estado_atual.canibal_esq, estado_atual.missio_esq - 2, 'direita',
estado_atual.canibal_dir, estado_atual.missio_dir + 2)
printestado = 'test01'
## Dois missionários cruzam da esquerda pra direita
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
novo_estado = Estado(estado_atual.canibal_esq - 2, estado_atual.missio_esq, 'direita',
estado_atual.canibal_dir + 2, estado_atual.missio_dir)
printestado = 'test02'
## Dois canibais cruzam da esquerda pra direita
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
novo_estado = Estado(estado_atual.canibal_esq - 1, estado_atual.missio_esq - 1, 'direita',
estado_atual.canibal_dir + 1, estado_atual.missio_dir + 1)
printestado = 'test03'
## Um missionário e um canibal cruzam da esquerda pra direita
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
novo_estado = Estado(estado_atual.canibal_esq, estado_atual.missio_esq - 1, 'direita',
estado_atual.canibal_dir, estado_atual.missio_dir + 1)
printestado = 'test04'
## Um missionário cruza da esquerda pra direita
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
novo_estado = Estado(estado_atual.canibal_esq - 1, estado_atual.missio_esq, 'direita',
estado_atual.canibal_dir + 1, estado_atual.missio_dir)
printestado = 'test05'
## Um canibal cruza da esquerda pra direita
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
else:
novo_estado = Estado(estado_atual.canibal_esq, estado_atual.missio_esq + 2, 'esquerda',
estado_atual.canibal_dir, estado_atual.missio_dir - 2)
printestado = 'test06'
## Dois missionários cruzam da direita pra esquerda
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
novo_estado = Estado(estado_atual.canibal_esq + 2, estado_atual.missio_esq, 'esquerda',
estado_atual.canibal_dir - 2, estado_atual.missio_dir)
printestado = 'test07'
## Dois canibais cruzam da direita pra esquerda
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
novo_estado = Estado(estado_atual.canibal_esq + 1, estado_atual.missio_esq + 1, 'esquerda',
estado_atual.canibal_dir - 1, estado_atual.missio_dir - 1)
printestado = 'test08'
## Um missionário e um canibal cruzam da direita pra esquerda
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
novo_estado = Estado(estado_atual.canibal_esq, estado_atual.missio_esq + 1, 'esquerda',
estado_atual.canibal_dir, estado_atual.missio_dir - 1)
printestado = 'test09'
## Um missionário cruza da direita pra esquerda
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
novo_estado = Estado(estado_atual.canibal_esq + 1, estado_atual.missio_esq, 'esquerda',
estado_atual.canibal_dir - 1, estado_atual.missio_dir)
printestado = 'test10'
## Um canibal cruza da direita pra esquerda
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
return children
def Busca_em_largura():
estado_inicial = Estado(3,3,'esquerda',0,0)
if estado_inicial.objetivo_final():
return estado_inicial
nao_explorados = list()
explorados = set()
nao_explorados.append(estado_inicial)
while nao_explorados:
estado = nao_explorados.pop(0)
if estado.objetivo_final():
return estado
explorados.add(estado)
children = successors(estado)
for child in children:
if (child not in explorados) or (child not in nao_explorados):
nao_explorados.append(child)
return None
def imprime_solucao(solucao):
caminho = []
caminho.append(solucao)
vizinho = solucao.vizinho
while vizinho:
caminho.append(vizinho)
vizinho = vizinho.vizinho
for t in range(len(caminho)):
estado = caminho[len(caminho) - t - 1]
print("nCalculando: ")
print ("(" + str(estado.canibal_esq) + "," + str(estado.missio_esq) 
+ "," + estado.barco + "," + str(estado.canibal_dir) + "," + 
str(estado.missio_dir) + ")")
print(printestado)


def main():
solucao = Busca_em_largura()
print ("Problema dos missionários e canibais: n")
print ("Trabalho feito por ")
print ("Aderbal Calmeto ")
print ("Guilherme Paiva")
print ("Legenda: (Canibais à esquerda , Missionários à esquerda")
print ("Posição do Barco, Canibais à direita , Missionários à direita) nn")
imprime_solucao(solucao)
# if called from the command line, call main()
if __name__ == "__main__":
main()

正如我所说,代码工作得很好,novo_estado.eh_valido()函数根据情况返回TRUE或FALSE,并且在代码期间在12种不同的状态下进行更改,但是当我尝试打印(printestado)时,它总是返回给我"test10"即使是(我认为)第十次"考试"甚至在代码执行期间都没有被访问,这让我认为"printestado"更改可能在if

之外。有人知道我在这里错过了什么吗?

在代码中,有一个if estado_atual.barco == 'esquerda':语句,如果它返回TRUE,将把printestado更改为test5。否则,它将把变量设置为test10。因此,novo_estado.eh_valido()函数似乎对变量没有影响。也许您只想运行一个函数,它们应该在if/else语句中,并且变量也在这些语句中更新……像这样。

if estado_atual.barco == 'esquerda':
novo_estado = Estado(estado_atual.canibal_esq, estado_atual.missio_esq - 2, 'direita',
estado_atual.canibal_dir, estado_atual.missio_dir + 2)
printestado = 'test01'
## Dois missionários cruzam da esquerda pra direita
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
novo_estado = Estado(estado_atual.canibal_esq - 2, estado_atual.missio_esq, 'direita',
estado_atual.canibal_dir + 2, estado_atual.missio_dir)
printestado = 'test02'
## Dois canibais cruzam da esquerda pra direita
elif novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
novo_estado = Estado(estado_atual.canibal_esq - 1, estado_atual.missio_esq - 1, 'direita',
estado_atual.canibal_dir + 1, estado_atual.missio_dir + 1)
printestado = 'test03'
## Um missionário e um canibal cruzam da esquerda pra direita
elif novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
novo_estado = Estado(estado_atual.canibal_esq, estado_atual.missio_esq - 1, 'direita',
estado_atual.canibal_dir, estado_atual.missio_dir + 1)
printestado = 'test04'
## Um missionário cruza da esquerda pra direita
.......

基于注释更新:你好,由于要求不是很清楚,我的葡萄牙语知识有限,相信你要做的是为每个创建的类/子类确定最高的printestado。因此,我将其作为变量包含在每个类中,并在每次运行IF语句时更新它。在imprime_solucao函数中完成最后的打印后,将为每个类打印单独的printestado值。输出现在具有每个类的最大testXX。看看这是否有效....

import math
#______________________________________________________________________________
# Missionaries and Cannibals Problem
class Estado():
def __init__(self, canibal_esq, missio_esq, barco, canibal_dir, missio_dir):
self.canibal_esq = canibal_esq
self.missio_esq = missio_esq
self.barco = barco
self.canibal_dir = canibal_dir
self.missio_dir = missio_dir
self.vizinho = None
self.printestado = 'teste'
def objetivo_final(self):
if self.canibal_esq == 0 and self.missio_esq == 0:
return True
else:
return False
def eh_valido(self):
if self.missio_esq >= 0 and self.missio_dir >= 0 
and self.canibal_esq >= 0 and self.canibal_dir >= 0 
and (self.missio_esq == 0 or self.missio_esq >= self.canibal_esq) 
and (self.missio_dir == 0 or self.missio_dir >= self.canibal_dir):
return True
else:
return False
def __eq__(self, other):
return self.canibal_esq == other.canibal_esq and self.missio_esq == other.missio_esq 
and self.barco == other.barco and self.canibal_dir == other.canibal_dir 
and self.missio_dir == other.missio_dir
def __hash__(self):
return hash((self.canibal_esq, self.missio_esq, self.barco, self.canibal_dir, self.missio_dir))
def successors(estado_atual):
#    global printestado
children = [];
if estado_atual.barco == 'esquerda':
novo_estado = Estado(estado_atual.canibal_esq, estado_atual.missio_esq - 2, 'direita',
estado_atual.canibal_dir, estado_atual.missio_dir + 2)
estado_atual.printestado = 'test01'
## Dois missionários cruzam da esquerda pra direita
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
estado_atual.printestado = 'test02'
novo_estado = Estado(estado_atual.canibal_esq - 2, estado_atual.missio_esq, 'direita',
estado_atual.canibal_dir + 2, estado_atual.missio_dir)
## Dois canibais cruzam da esquerda pra direita
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
estado_atual.printestado = 'test03'
novo_estado = Estado(estado_atual.canibal_esq - 1, estado_atual.missio_esq - 1, 'direita',
estado_atual.canibal_dir + 1, estado_atual.missio_dir + 1)
## Um missionário e um canibal cruzam da esquerda pra direita
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
estado_atual.printestado = 'test04'
novo_estado = Estado(estado_atual.canibal_esq, estado_atual.missio_esq - 1, 'direita',
estado_atual.canibal_dir, estado_atual.missio_dir + 1)
## Um missionário cruza da esquerda pra direita
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
estado_atual.printestado = 'test05'
novo_estado = Estado(estado_atual.canibal_esq - 1, estado_atual.missio_esq, 'direita',
estado_atual.canibal_dir + 1, estado_atual.missio_dir)
## Um canibal cruza da esquerda pra direita
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
else:
novo_estado = Estado(estado_atual.canibal_esq, estado_atual.missio_esq + 2, 'esquerda',
estado_atual.canibal_dir, estado_atual.missio_dir - 2)
printestado = 'test06'
## Dois missionários cruzam da direita pra esquerda
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
estado_atual.printestado = 'test07'
novo_estado = Estado(estado_atual.canibal_esq + 2, estado_atual.missio_esq, 'esquerda',
estado_atual.canibal_dir - 2, estado_atual.missio_dir)
## Dois canibais cruzam da direita pra esquerda
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
estado_atual.printestado = 'test08'
novo_estado = Estado(estado_atual.canibal_esq + 1, estado_atual.missio_esq + 1, 'esquerda',
estado_atual.canibal_dir - 1, estado_atual.missio_dir - 1)
## Um missionário e um canibal cruzam da direita pra esquerda
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
estado_atual.printestado = 'test09'
novo_estado = Estado(estado_atual.canibal_esq, estado_atual.missio_esq + 1, 'esquerda',
estado_atual.canibal_dir, estado_atual.missio_dir - 1)
## Um missionário cruza da direita pra esquerda
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
estado_atual.printestado = 'test10'
novo_estado = Estado(estado_atual.canibal_esq + 1, estado_atual.missio_esq, 'esquerda',
estado_atual.canibal_dir - 1, estado_atual.missio_dir)
## Um canibal cruza da direita pra esquerda
if novo_estado.eh_valido():
novo_estado.vizinho = estado_atual
children.append(novo_estado)
return children
def Busca_em_largura():
estado_inicial = Estado(3,3,'esquerda',0,0)
if estado_inicial.objetivo_final():
return estado_inicial
nao_explorados = list()
explorados = set()
nao_explorados.append(estado_inicial)
while nao_explorados:
estado = nao_explorados.pop(0)
if estado.objetivo_final():
return estado
explorados.add(estado)
children = successors(estado)
for child in children:
if (child not in explorados) or (child not in nao_explorados):
nao_explorados.append(child)
return None
def imprime_solucao(solucao):
caminho = []
caminho.append(solucao)
vizinho = solucao.vizinho
while vizinho:
caminho.append(vizinho)
vizinho = vizinho.vizinho
for t in range(len(caminho)):
estado = caminho[len(caminho) - t - 1]
print("nCalculando: ")
print ("(" + str(estado.canibal_esq) + "," + str(estado.missio_esq) 
+ "," + estado.barco + "," + str(estado.canibal_dir) + "," + 
str(estado.missio_dir) + ")")
print("imprime_solucao printestado -", estado.printestado)
def main():
solucao = Busca_em_largura()
print ("Problema dos missionários e canibais: n")
print ("Trabalho feito por ")
print ("Aderbal Calmeto ")
print ("Guilherme Paiva")
print ("Legenda: (Canibais à esquerda , Missionários à esquerda")
print ("Posição do Barco, Canibais à direita , Missionários à direita) nn")
imprime_solucao(solucao)
# if called from the command line, call main()
if __name__ == "__main__":
main()

相关内容

最新更新