Você está na página 1de 6

David Kopec

Novatec
São Paulo | 2019
Original English language edition published by Manning Publications Co, Copyright © 2019 by Manning
Publications. Portuguese-language edition for Brazil copyright © 2019 by Novatec Editora. All rights reserved.
Edição original em Inglês publicada pela Manning Publications Co, Copyright © 2019 pela Manning Publica-
tions. Edição em Português para o Brasil copyright © 2019 pela Novatec Editora. Todos os direitos reservados.
Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. É proibida a reprodução desta obra,
mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da Editora.
Editor: Rubens Prates LIS20190911
Tradução: Lúcia A. Kinoshita
Revisão gramatical: Tássia Carvalho
Editoração eletrônica: Carolina Kuwabata
ISBN: 978-85-7522-805-0
Histórico de impressões:
Setembro/2019 Primeira edição
Novatec Editora Ltda.
Rua Luís Antônio dos Santos 110
02460-000 – São Paulo, SP – Brasil
Tel.: +55 11 2959-6529
E-mail: novatec@novatec.com.br
Site: www.novatec.com.br
Twitter: twitter.com/novateceditora
Facebook: facebook.com/novatec
LinkedIn: linkedin.com/in/novatec
Sumário

Agradecimentos......................................................................................................................11
Sobre o autor..........................................................................................................................13
Sobre a ilustração da capa.......................................................................................................14
Introdução..............................................................................................................................15

Capítulo 1 ■ Problemas pequenos............................................................................................22


1.1 Sequência de Fibonacci.................................................................................. 22
1.1.1 Uma primeira tentativa com recursão..................................................... 22
1.1.2 Utilizando casos de base.........................................................................24
1.1.3 Memoização para nos salvar....................................................................26
1.1.4 Memoização automática..........................................................................27
1.1.5 Fibonacci simples...................................................................................28
1.1.6 Gerando números de Fibonacci com um gerador......................................29
1.2 Compactação trivial.......................................................................................30
1.3 Criptografia inquebrável.................................................................................35
1.3.1 Deixando os dados em ordem.................................................................36
1.3.2 Criptografando e descriptografando........................................................37
1.4 Calculando pi.................................................................................................39
1.5 Torres de Hanói............................................................................................ 40
1.5.1 Modelando as torres...............................................................................41
1.5.2 Solucionando as Torres de Hanói............................................................42
1.6 Aplicações no mundo real.............................................................................. 44
1.7 Exercícios...................................................................................................... 46

Capítulo 2 ■ Problemas de busca..............................................................................................47


2.1 Busca em DNA...............................................................................................47
2.1.1 Armazenando um DNA..........................................................................48
2.1.2 Busca linear............................................................................................49
2.1.3 Busca binária.........................................................................................50
2.1.4 Um exemplo genérico.............................................................................53

7
8 Problemas Clássicos de Ciência da Computação com Python

2.2 Resolução de labirintos...................................................................................55


2.2.1 Gerando um labirinto aleatório...............................................................56
2.2.2 Miscelânea de minúcias sobre labirintos.................................................58
2.2.3 Busca em profundidade..........................................................................59
2.2.4 Busca em largura................................................................................... 64
2.2.5 Busca A*.................................................................................................68
2.3 Missionários e canibais..................................................................................75
2.3.1 Representando o problema.....................................................................76
2.3.2 Solução..................................................................................................78
2.4 Aplicações no mundo real.............................................................................. 80
2.5 Exercícios......................................................................................................81

Capítulo 3 ■ Problemas de satisfação de restrições...................................................................82


3.1 Construindo um framework para problemas de satisfação de restrições............83
3.2 Problema de coloração do mapa da Austrália.................................................. 88
3.3 Problema das oito rainhas...............................................................................91
3.4 Caça-palavras.................................................................................................93
3.5 SEND+MORE=MONEY...............................................................................97
3.6 Layout de placa de circuitos............................................................................99
3.7 Aplicações no mundo real.............................................................................100
3.8 Exercícios....................................................................................................101

Capítulo 4 ■ Problemas de grafos...........................................................................................102


4.1 Mapa como um grafo....................................................................................102
4.2 Construindo um framework de grafos...........................................................105
4.2.1 Trabalhando com Edge e Graph............................................................ 110
4.3 Encontrando o caminho mínimo..................................................................112
4.3.1 Retomando a busca em largura (BFS)....................................................112
4.4 Minimizando o custo de construção da rede.................................................. 114
4.4.1 Trabalhando com pesos........................................................................ 114
4.4.2 Encontrando a árvore geradora mínima................................................. 118
4.5 Encontrando caminhos mínimos em um grafo com peso...............................126
4.5.1 Algoritmo de Dijkstra...........................................................................126
4.6 Aplicações no mundo real.............................................................................132
4.7 Exercícios.....................................................................................................133

Capítulo 5 ■ Algoritmos genéticos..........................................................................................134


5.1 Background em biologia...............................................................................134
5.2 Algoritmo genético genérico..........................................................................136
5.3 Teste simples................................................................................................144
Sumário 9

5.4 Revendo SEND+MORE=MONEY................................................................ 147


5.5 Otimizando a compactação de listas.............................................................151
5.6 Desafios para os algoritmos genéticos............................................................154
5.7 Aplicações no mundo real.............................................................................155
5.8 Exercícios.....................................................................................................156

Capítulo 6 ■ Clustering k-means.............................................................................................157


6.1 Informações preliminares.............................................................................158
6.2 Algoritmo de clustering k-means...................................................................160
6.3 Clustering de governadores por idade e longitude..........................................166
6.4 Clustering de álbuns do Michael Jackson por tamanho..................................170
6.5 Problemas e extensões do clustering k-means................................................172
6.6 Aplicações no mundo real.............................................................................173
6.7 Exercícios..................................................................................................... 174

Capítulo 7 ■ Redes neurais relativamente simples.................................................................. 175


7.1 Base biológica?.............................................................................................. 176
7.2 Redes neurais artificiais................................................................................177
7.2.1 Neurônios............................................................................................178
7.2.2 Camadas..............................................................................................179
7.2.3 Retropropagação..................................................................................180
7.2.4 Visão geral............................................................................................184
7.3 Informações preliminares.............................................................................184
7.3.1 Produto escalar.....................................................................................185
7.3.2 Função de ativação...............................................................................185
7.4 Construindo a rede.......................................................................................186
7.4.1 Implementando os neurônios.................................................................187
7.4.2 Implementando as camadas..................................................................188
7.4.3 Implementando a rede...........................................................................190
7.5 Problemas de classificação............................................................................194
7.5.1 Normalizando dados............................................................................194
7.5.2 Conjunto clássico de dados de amostras de íris......................................195
7.5.3 Classificando vinhos.............................................................................199
7.6 Agilizando as redes neurais...........................................................................202
7.7 Problemas e extensões das redes neurais........................................................203
7.8 Aplicações no mundo real.............................................................................205
7.9 Exercícios.....................................................................................................206

Capítulo 8 ■ Busca competitiva..............................................................................................207


8.1 Componentes básicos de jogos de tabuleiro...................................................207
8.2 Jogo da velha...............................................................................................209
10 Problemas Clássicos de Ciência da Computação com Python

8.2.1 Administrando os estados do jogo da velha...........................................210


8.2.2 Minimax.............................................................................................. 214
8.2.3 Testando o minimax com o jogo da velha............................................. 217
8.2.4 Desenvolvendo uma IA para o jogo da velha..........................................218
8.3 Connect Four...............................................................................................220
8.3.1 Peças do jogo Connect Four..................................................................220
8.3.2 Uma IA para o Connect Four................................................................226
8.3.3 Aperfeiçoando o minimax com a poda alfa-beta....................................228
8.4 Melhorias no minimax além da poda alfa-beta..............................................229
8.5 Aplicações no mundo real.............................................................................230
8.6 Exercícios....................................................................................................231

Capítulo 9 ■ Problemas diversos............................................................................................233


9.1 Problema da mochila....................................................................................233
9.2 Problema do Caixeiro-Viajante......................................................................239
9.2.1 Abordagem ingênua..............................................................................239
9.2.2 Avançando para o próximo nível...........................................................243
9.3 Dados mnemônicos para números de telefone...............................................245
9.4 Aplicações no mundo real.............................................................................247
9.5 Exercícios.....................................................................................................248

Apêndice A ■ Glossário...........................................................................................................249

Apêndice B ■ Outros recursos.................................................................................................255


B.1 Python.........................................................................................................255
B.2 Algoritmos e estruturas de dados..................................................................256
B.3 Inteligência artificial.....................................................................................257
B.4 Programação funcional.................................................................................258
B.5 Projetos de código aberto convenientes para aprendizado de máquina...........259

Apêndice C ■ Introdução rápida às dicas de tipo......................................................................260


C.1 O que são dicas de tipo?...............................................................................260
C.2 Como é a aparência das dicas de tipo?..........................................................261
C.3 Por que as dicas de tipo são úteis?................................................................262
C.4 Quais são as desvantagens das dicas de tipo?................................................264
C.5 Obtendo mais informações..........................................................................265

Índice remissivo....................................................................................................................267

Você também pode gostar