Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner 1
Heurístico para Problemas de
Restrições
Heurístico para Problemas de
Restrições
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
2
Introdução
Fundamentação teórica
Desenvolvimento
Operacionalidade
Resultados e discussão
Conclusão
Extensões
Relevância pessoal
Introdução
Fundamentação teórica
Desenvolvimento
Operacionalidade
Resultados e discussão
Conclusão
Extensões
Relevância pessoal
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
3
Contexto
Acadêmicos se entusiasmam também com a
disciplina de inteligência artificial
Problemas de satisfação de restrições (PSR) ou,
em inglês, Constraint Satisfaction Problems (CSP)
Aluno faz a especificação do CSP, porém não
observa internamente como chegou-se a solução
Objetivos
Implementar algoritmo de busca para CSP
Disponibilizar heurísticas na busca Integrar com o CSP&Cop Builder
Contexto
Acadêmicos se entusiasmam também com a
disciplina de inteligência artificial
Problemas de satisfação de restrições (PSR) ou,
em inglês, Constraint Satisfaction Problems (CSP)
Aluno faz a especificação do CSP, porém não
observa internamente como chegou-se a solução
Objetivos
Implementar algoritmo de busca para CSP Disponibilizar heurísticas na busca
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
4
Constraint Satisfaction Problems
Constraint Satisfaction Problems
Conjunto de variáveis: {V1, V2, ...,V
n}
Conjunto de restrições: {R1, R2, ..., R
m}
Cada variável V
item um domínio D
i
Cada restrição R
jenvolve um subconjunto de
V
i
Um estado é uma atribuição de todas as
variáveis V com um valor do domínio D
Uma solução é uma atribuição consistente
com todas as restrições
Conjunto de variáveis: {V1, V2, ...,V
n}
Conjunto de restrições: {R1, R2, ..., R
m}
Cada variável V
item um domínio D
i
Cada restrição R
jenvolve um subconjunto de
V
i
Um estado é uma atribuição de todas as
variáveis V com um valor do domínio D
Uma solução é uma atribuição consistente
com todas as restrições
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
5
CSP – Coloração de Mapas
CSP – Coloração de Mapas
Fonte: Russell e Norvig (2004, p. 135). Fonte: Russell e Norvig (2004, p. 135).
Definição do problema
Definição do problema Problema como um CSPProblema como um CSP
Variável (nodo) Restrição
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
6
Especificação de um CSP
Especificação de um CSP
Variáveis = { AO, TN, Q, NGS, V, AM, T } Restrições = { (AO ≠ TN), (AO ≠ AM), (TN ≠ AO), (TN ≠ AM), (TN ≠ Q) ..., (NGS ≠ V) }
Domínio para as variáveis = { vermelho, verde, azul } Solução possível = { (AO = vermelho),
(TN = verde), (Q = vermelho), (NGS = verde), (V = vermelho), (AM = azul), (T = vermelho) }
Fonte: Russell e Norvig (2004, p. 135).
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
7
Problema das N-Rainhas
Problema das N-Rainhas
Fonte: Tsang (1993, p. 2). Fonte: Tsang (1993, p. 2).
Definição do problema
De acordo com Tsang:
As variáveis são as rainhas As restrições são:
nenhuma das rainhas podem estar em posição de ataque
Os valores do domínio de
cada variável são as
posições da coluna em que cada uma pode estar na sua linha.
Definição do problema
De acordo com Tsang:
As variáveis são as rainhas As restrições são:
nenhuma das rainhas podem estar em posição de ataque
Os valores do domínio de
cada variável são as
posições da coluna em que cada uma pode estar na sua linha.
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
8
Busca-com-retrocesso
Busca-com-retrocesso
É um algoritmo recursivo de busca em
profundidade
Aprofundamento da árvore pela esquerda
Cada vez que encontra uma inconsistência,
efetua um retrocesso na árvore, tentando
pelo ramo mais a direita do nível atual
Russel e Norvig propõem a implementação
deste, demonstrando o algoritmo em sua
literatura
É um algoritmo recursivo de busca em
profundidade
Aprofundamento da árvore pela esquerda
Cada vez que encontra uma inconsistência,
efetua um retrocesso na árvore, tentando
pelo ramo mais a direita do nível atual
Russel e Norvig propõem a implementação
deste, demonstrando o algoritmo em sua
literatura
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
9
Árvore gerada pelo algoritmo
Árvore gerada pelo algoritmo
Fonte: Russell e Norvig (2004, p. 135).
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
10
Heurísticas
Heurísticas
Procuram reduzir o número de passos, ou
seja, verificações de consistência (VC), até
que se chegue a solução
São estratégias de busca que são
programadas independentes de qualquer
problema em particular, ou seja, podem
servir para diversos problemas
Heurística de variável mais restritiva
Prefere pela variável envolvida com mais
restrições
Procuram reduzir o número de passos, ou
seja, verificações de consistência (VC), até
que se chegue a solução
São estratégias de busca que são
programadas independentes de qualquer
problema em particular, ou seja, podem
servir para diversos problemas
Heurística de variável mais restritiva
Prefere pela variável envolvida com mais
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
11
Heurísticas
Heurísticas
Heurística de variável mais restringidaPrefere pela variável que tem menos valores em seu
domínio
Busca Local com a heurística de conflitos mínimos Conflitos mínimos prefere pelo valor que resulta no menor
número de conflitos com outras variáveis e pode ser aplicada no algoritmo de busca local
Busca local, utiliza uma formulação de estados completos e
utiliza como função sucessor a alteração do estado de uma variável de cada vez
Tem um número máximo de passos na busca
Russel e Norvig também sugerem a implementação deste
em sua literatura
Heurística de variável mais restringida
Prefere pela variável que tem menos valores em seu
domínio
Busca Local com a heurística de conflitos mínimos
Conflitos mínimos prefere pelo valor que resulta no menor
número de conflitos com outras variáveis e pode ser aplicada no algoritmo de busca local
Busca local, utiliza uma formulação de estados completos e
utiliza como função sucessor a alteração do estado de uma variável de cada vez
Tem um número máximo de passos na busca
Russel e Norvig também sugerem a implementação deste
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
12
Exemplo de Conflitos Mínimos
Exemplo de Conflitos Mínimos
Variáveis conflitantes
Variáveis conflitantes
Valores Conflitos mínimos
Valores Conflitos mínimos
Posição/Valor escolhido
Posição/Valor escolhido
Primeiro é gerado uma
atribuição aleatória
Primeiro é gerado uma
atribuição aleatória
Número de conflitos gerados/ataques
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
13
Exemplo de Conflitos Mínimos
Exemplo de Conflitos Mínimos
Variáveis conflitantes
Variáveis conflitantes
Valor Conflitos mínimos
Valor Conflitos mínimos
Posição/Valor escolhido
Posição/Valor escolhido
Número de conflitos gerados/ataques
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
14
Exemplo de Conflitos Mínimos
Exemplo de Conflitos Mínimos
Atribuição completa!
Solucionado em apenas
dois passos, ou seja, com duas verificações de consistência
Atribuição completa!
Solucionado em apenas
dois passos, ou seja, com duas verificações de consistência
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
15
dyn
DCSP
dyn
DCSP
Projeto do Grupo de Inteligência Artificial da
Furb
É um trabalho correlato
Seu framework possui algoritmo de resolução de
CSP de forma distribuída, um Distributed Constraint Satisfaction Problem (DCSP)
Disponibiliza uma Biblioteca que provê a
representação de CSPs em classes Java
Possui uma linguagem que possibilita a
especificação de CSPs no CSP&Cop
Builder
Projeto do Grupo de Inteligência Artificial da
Furb
É um trabalho correlato
Seu
framework
possui algoritmo de resolução deCSP de forma distribuída, um Distributed Constraint Satisfaction Problem (DCSP)
Disponibiliza uma Biblioteca que provê a
representação de CSPs em classes Java
Possui uma linguagem que possibilita a
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
16
Pacote CSP do
dyn
DCSP
Pacote CSP do
dyn
DCSP
Fonte: Santos (2005, p. 39). Fonte: Santos (2005, p. 39).
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
17
CSP&COP
Builder
CSP&COP
Builder
Ferramenta que possibilita a especificação de CSPs
por meio de uma linguagem própria e de alto nível
Contém um parser que gera como saída, uma
instância do objeto CSP contendo toda a especificação do CSP
Possui uma interface gráfica, porém só pode ser
executado a partir do framework dynDCSP
Tanto o dynDCSP quanto o CCB surgiram a partir
dos trabalhos correlatos descritos em Tralamazza e Santos
Ferramenta que possibilita a especificação de CSPs
por meio de uma linguagem própria e de alto nível
Contém um parser que gera como saída, uma
instância do objeto CSP contendo toda a especificação do CSP
Possui uma interface gráfica, porém só pode ser
executado a partir do
framework dyn
DCSPTanto o
dyn
DCSP quanto o CCB surgiram a partirdos trabalhos correlatos descritos em Tralamazza e Santos
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
18
Interface e visão geral do CCB
Interface e visão geral do CCB
Ao lado, observa-se a
interface gráfica do
editor e a visão geral
do CCB
Ao lado, observa-se a
interface gráfica do
editor e a visão geral
do CCB
Fonte: Santos (2005, p. 39). Fonte: Santos (2005, p. 39).
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
19
Especificação no CCB
Especificação no CCB
Csp
Id: coloração de mapas; Version: 1.0;
Description: exemplo de definição CSP na linguagem do CCB; Domains
// as cores como domínio. 1 = vermelho, 2 = verde e 3 = azul cores : {1,2,3}
Variables
// Os estados como variáveis ao, tn, q, ngs, v, am, t: cores; Constraints
//as restrições de vizinhança, note que “t” não tem vizinhança alguma, logo // não terá restrições.
ao != tn; ao != am; tn != am; tn != q; am != q; am != ngs; am != v; q != ngs; ngs != v;
Especificação do CSP de coloração de mapas
Especificação do CSP de coloração de mapas
Fonte: Russell e Norvig (2004, p. 135). Fonte: Russell e Norvig (2004, p. 135).
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
20
GNUProlog
GNUProlog
Compilador da linguagem Prolog
Possui algoritmo de resolução de CSPs de
forma centralizada
Foi desenvolvido com a linguagem C
Utiliza-se de várias heurísticas e técnicas de
propagação de restrições como:
Consistência de arcos, uma técnica/heurística
capaz de verificar ciclos a partir da atribuição
Assim, é possível detectar com antecedência arcos
inconsistentes, evitando buscas inúteis em ramos onde nunca se encontrará uma solução
Compilador da linguagem Prolog
Possui algoritmo de resolução de CSPs de
forma centralizada
Foi desenvolvido com a linguagem C
Utiliza-se de várias heurísticas e técnicas de
propagação de restrições como:
Consistência de arcos, uma técnica/heurística
capaz de verificar ciclos a partir da atribuição Assim, é possível detectar com antecedência arcos
inconsistentes, evitando buscas inúteis em ramos onde nunca se encontrará uma solução
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
21
Técnicas e ferramentas utilizadas
Técnicas e ferramentas utilizadas
Na especificação utilizou-se a ferramenta
Enterprise Arquitect com o padrão UML
Na programação utilizou-se a linguagem Java
e o paradigma de orientação a objetos
Como ambiente de desenvolvimento
utilizou-se o Ecliputilizou-se
Na especificação utilizou-se a ferramenta
Enterprise Arquitect com o padrão UML
Na programação utilizou-se a linguagem Java
e o paradigma de orientação a objetos
Como ambiente de desenvolvimento
utilizou-se o Ecliputilizou-se
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
22
Diagrama de caso de uso
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
23
Diagrama de atividades
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
24
Diagrama de classes
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
25
Busca-com-retrocesso
Busca-com-retrocesso
Onde inicia o algoritmo de busca
Instancia a atribuição, inicialmente vazia Cria o primeiro nível da recursividade
Verifica a consistência da atribuição
Percorre as variáveis e valores do domínio Insere e remove da atribuição
Cria os próximos níveis da recursividade
Por fim retorna true para aprofundar a árvore ou
false
para fazer um retrocesso
Onde inicia o algoritmo de busca
Instancia a atribuição, inicialmente vazia Cria o primeiro nível da recursividade
Verifica a consistência da atribuição
Percorre as variáveis e valores do domínio Insere e remove da atribuição
Cria os próximos níveis da recursividade
Por fim retorna
true
para aprofundar a árvore oufalse
para fazer um retrocesso+ pesquisaComRetrocesso(CSP, int, boolean) : Assignment
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
26
Heurísticas
Heurísticas
Criam a lista de variáveis e ordenam pela
prioridade
Pega a primeira variável da lista ordenada sendo
que a mesma não deve ter sido atribuída
Criam a lista de variáveis e ordenam pela
prioridade
Pega a primeira variável da lista ordenada sendo
que a mesma não deve ter sido atribuída
- ordenarVariavelMaisRestritiva(CSP): void - ordenarVariavelMaisRestringida(CSP): void
- getVariavelMaisRestritiva(Assignment): Variable - getVariavelMaisRestringida(Assignment): Variable
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
27
Heurísticas – Conflitos Mínimos
Heurísticas – Conflitos Mínimos
+ iniciaConflitosMinimos(CSP, int, ResolveCSP): Assignment
Controla o número de etapas/repetições
Se consistente, retorna atribuição completa Adiciona e remove variáveis da atribuição
Gera uma atribuição inicial e aleatória, podendo
ou não ser consistente
Retorna um valor que gere menos conflitos para
uma variável informada
Controla o número de etapas/repetições Se consistente, retorna atribuição completa Adiciona e remove variáveis da atribuição
Gera uma atribuição inicial e aleatória, podendo
ou não ser consistente
Retorna um valor que gere menos conflitos para
uma variável informada
- atribuicaoAleatoria(CSP): Assignment
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
28
Problema das 4 rainhas
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
29
Coloração de mapas
Coloração de mapas
Verifições de consistência
Verifições de consistência
21 15 8 0 5 10 15 20 25Busca-com-retrocesso Busca-com-retrocesso com variável mais restritiva
Conflitos Mínimos V e ri fi c a ç õ e s d e C o n s is tê n c ia ( V C )
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
30
Tempo em milisegundos
Tempo em milisegundos
Coloração de mapas
Coloração de mapas
0,6 7,4 5,5 34,8 0,0 5,0 10,0 15,0 20,0 25,0 30,0 35,0 40,0Gnu Prolog Busca-com-retrocesso
Busca-com-retrocesso com
Variável mais restritiva
Conf litos Mínimos
T e m p o e m m il is e g u n d o s
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
31
N-rainhas com n=4
N-rainhas com n=4
Verifições de consistência
Verifições de consistência
58 58 58 16,8 0 10 20 30 40 50 60 70 Busca-com-retrocesso Busca-com-retrocesso com variável mais restritivaBusca-com-retrocesso com variável mais restringida Conflitos Mínimos V e ri fi c a ç õ e s d e C o n s is tê n c ia ( V C )
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
32
Tempo
Tempo
N-rainhas com n=4
N-rainhas com n=4
18,7 17,5 19,0 10,6 52,6 0,0 10,0 20,0 30,0 40,0 50,0 60,0Gnu Prolog Busca-com-retrocesso Busca-com-retrocesso com variável mais restritiva Busca-com-retrocesso com variável mais restringida Conflitos Mínimos T e m p o e m m il is e g u n d o s
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
33
Algoritmo busca-com-retrocesso se mostrou
eficaz na resolução de CSPs
Ganhos nítidos do custo da busca do
algoritmo quando aliado as heurísticas,
satisfazendo as expectativas apontadas na
literatura
Integração com o CCB foi obtida
Diante desses resultados, conclui-se que o
trabalho atendeu a todos os objetivos
previamente formulados
Algoritmo busca-com-retrocesso se mostrou
eficaz na resolução de CSPs
Ganhos nítidos do custo da busca do
algoritmo quando aliado as heurísticas,
satisfazendo as expectativas apontadas na
literatura
Integração com o CCB foi obtida
Diante desses resultados, conclui-se que o
trabalho atendeu a todos os objetivos
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
34
Portabilidade
Programado em Java
Toda a especificação disponível e código
fonte todo comentado!
Trabalho completo com editor, compilador e
algoritmo de resolução heurístico
Pode ser usado didaticamente no ensino de
CSP para alunos de inteligência artificial
Portabilidade
Programado em Java
Toda a especificação disponível e código
fonte todo comentado!
Trabalho completo com editor, compilador e
algoritmo de resolução heurístico
Pode ser usado didaticamente no ensino de
CSP para alunos de inteligência artificial
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
35
Uso de heurísticas combinadas
Tempo gasto com as heurísticas não pode
ser gerenciado, devido ao alto
processamento
Para isso deve-se usar técnicas de propagação de
restrições, evitando buscas inúteis em ramos que nunca se encontrará a solução e são descritas em Russell e Norvig.
Escolher o número de passos do algoritmo
de Busca Local com a heurística de Conflitos
Mínimos
Uso de heurísticas combinadas
Tempo gasto com as heurísticas não pode
ser gerenciado, devido ao alto
processamento
Para isso deve-se usar técnicas de propagação de
restrições, evitando buscas inúteis em ramos que nunca se encontrará a solução e são descritas em Russell e Norvig.
Escolher o número de passos do algoritmo
de Busca Local com a heurística de Conflitos
Mínimos
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
36
Orientação a Objetos x Estruturada
Orientação a Objetos x Estruturada
Porque implementou-se em Java?
Linguagem atual e provê portabilidade
O dynDCSP e o CCB foram programados em Java
A literatura expõe algoritmos estruturados
Por isso, os métodos foram implementados basicamente em
programação estruturada
Pra fins didáticos é ótimo, pois o que o aluno visualiza no
algoritmo, é exatamente o que foi programado.
Isto facilita o aprendizado!
Apesar do algoritmo ser estruturado, há classes,
métodos e relações como em Orientação a Objetos
Porque implementou-se em Java?
Linguagem atual e provê portabilidade
O dynDCSP e o CCB foram programados em Java
A literatura expõe algoritmos estruturados
Por isso, os métodos foram implementados basicamente em
programação estruturada
Pra fins didáticos é ótimo, pois o que o aluno visualiza no
algoritmo, é exatamente o que foi programado.
Isto facilita o aprendizado!
Apesar do algoritmo ser estruturado, há classes,
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
37
Implementação de mais heurísticas e
métodos de propagação de restrições
Com a Consistência de arcos, já é possívelgerenciar o tempo gasto com as heurísticas, de acordo com Russel e Norvig
Depuração detalhada do algoritmo afim de
otimizar o desempenho e código fonte
Implementação de algoritmos de ordenação
para as heurísticas
Implementação de mais heurísticas e
métodos de propagação de restrições
Com a Consistência de arcos, já é possível
gerenciar o tempo gasto com as heurísticas, de acordo com Russel e Norvig
Depuração detalhada do algoritmo afim de
otimizar o desempenho e código fonte
Implementação de algoritmos de ordenação
para as heurísticas
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
38
Conhecimentos em Java e orientação a objetos
Contato com a linguagem somente na disciplina
Durante todo o curso, praticamente só utilizei a
linguagem do ambiente de programação Delphi
Aprendi Java e OO fazendo este trabalho!
Conhecimentos no Eclipse
Nunca tive contato com este ambiente de
desenvolvimento
Capacidade de entender, estender e integrar
sistemas feitos por outros acadêmicos
CCB e dynDCSP
Conhecimentos em Java e orientação a objetos
Contato com a linguagem somente na disciplina Durante todo o curso, praticamente só utilizei a
linguagem do ambiente de programação Delphi
Aprendi Java e OO fazendo este trabalho!
Conhecimentos no Eclipse
Nunca tive contato com este ambiente de
desenvolvimento
Capacidade de entender, estender e integrar
sistemas feitos por outros acadêmicos
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
39
Diante de todo o desafio proposto
por mim mesmo, me sinto
realizado pela conclusão com
sucesso deste trabalho!
Fim.
Diante de todo o desafio proposto
por mim mesmo, me sinto
realizado pela conclusão com
sucesso deste trabalho!
Por: Alexsandro Santos Pires Orientação: Prof. Jomi Fred Hübner
40
DIAS, D. The Gnu Prolog web site. France, 2003. Disponível em: < http://gnu-prolog.inria.fr/>. Acesso em: 8 abr. 2006.
FILHO, E. C. B. C. et al. Constraint Satisfaction Problems. Recife, [1998?]. Disponível em: < http://www.cin.ufpe.br/~compint/aulas-IAS/csp.ppt>. Acesso em: 10 abr. 2006.
RICH, E.; KNIGHT, K. Inteligência artificial. Tradução Maria Cláudia Santos Ribeiro Ratto. São Paulo: Makron, 1993.
RUSSELL, S. J.; NORVIG, P. Inteligência artificial. Tradução PubliCare Consultoria. Rio de Janeiro: Elsevier, 2004.
SANTOS, F. Implementação distribuída do algoritmo Adopt. 2005. 115 f. Trabalho de Conclusão de Curso (Bacharelado em Ciências da Computação) – Centro de Ciências Exatas e Naturais, Universidade Regional de Blumenau, Blumenau.
_______. ccb_short_guide.pdf. Blumenau, 2006. 1 arquivo (98 Kbytes). Adobe Acrobat Reader 7. Disponível em: <
http://www.inf.furb.br/gia/dynDCSP/doc/ccb/ccb_short_guide.pdf>. Acesso em: 9 abr. 2006.
TRALAMAZZA, D. M. Desenvolvimento de um algoritmo para problema de satisfação
de restrição distribuída. 2004. 37 f. Trabalho de Conclusão de Curso (Bacharelado em
Ciências da Computação) – Centro de Ciências Exatas e Naturais, Universidade Regional de Blumenau, Blumenau.