ia-guiao-sobre-pesquisa/constraintsearch.py

57 lines
1.9 KiB
Python

# Pesquisa para resolucao de problemas de atribuicao
#
# Introducao a Inteligencia Artificial
# DETI / UA
#
# (c) Luis Seabra Lopes, 2012-2019
#
class ConstraintSearch:
# domains é um dicionário com o domínio de cada variável;
# constaints e' um dicionário com a restrição aplicável a cada aresta;
def __init__(self,domains,constraints):
self.domains = domains
self.constraints = constraints
self.calls = 0
# domains é um dicionário com os domínios actuais
# de cada variável
# ( ver acetato "Pesquisa com propagacao de restricoes
# em problemas de atribuicao - algoritmo" )
def search(self,domains=None):
self.calls += 1
if domains==None:
domains = self.domains
# se alguma variavel tiver lista de valores vazia, falha
if any([lv==[] for lv in domains.values()]):
return None
# se nenhuma variavel tiver mais do que um valor possivel, sucesso
if all([len(lv)==1 for lv in list(domains.values())]):
# se valores violam restricoes, falha
# ( verificacao desnecessaria se for feita a propagacao
# de restricoes )
for (var1,var2) in self.constraints:
constraint = self.constraints[var1,var2]
if not constraint(var1,domains[var1][0],var2,domains[var2][0]):
return None
return { v:lv[0] for (v,lv) in domains.items() }
# continuação da pesquisa
# ( falta fazer a propagacao de restricoes )
for var in domains.keys():
if len(domains[var])>1:
for val in domains[var]:
newdomains = dict(domains)
newdomains[var] = [val]
solution = self.search(newdomains)
if solution != None:
return solution
return None