57 lines
1.9 KiB
Python
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
|
|
|
|
|