Skip to content

Commit 0757638

Browse files
committed
aula 05
1 parent 90d258e commit 0757638

File tree

4 files changed

+250
-16
lines changed

4 files changed

+250
-16
lines changed

material/aulas/aula05/index.md

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ Na aula passada você deveria ter sumido com os erros do código fornecido, e a
3232

3333
/*
3434
Função que calcula a distância euclidiana entre dois pontos.
35-
Fórmula:
36-
d = √[(x1 - x2)^2 + (y1 - y2)^2]
3735
*/
3836
double distancia(const Ponto& a, const Ponto& b) {
3937
double dx = a.x - b.x;
@@ -44,7 +42,6 @@ Na aula passada você deveria ter sumido com os erros do código fornecido, e a
4442
/*
4543
Função que calcula o custo total de uma rota completa.
4644

47-
Regras:
4845
- O motorista sai de casa.
4946
- Vai até o ponto de coleta.
5047
- Realiza as entregas na ordem definida em "rota".
@@ -64,7 +61,7 @@ Na aula passada você deveria ter sumido com os erros do código fornecido, e a
6461
int cargaAtual = CAPACIDADE_MOTO; // Quantos itens ainda cabem na moto
6562
Ponto posicaoAtual = coleta; // Começa na coleta
6663

67-
// 2) Percorre todas as entregas na ordem da permutação
64+
// 2) Percorre todas as entregas na ordem do vetor
6865
for (size_t i = 0; i < rota.size(); i++) {
6966

7067
// Se a carga acabou, volta para coleta para reabastecer
@@ -87,10 +84,9 @@ Na aula passada você deveria ter sumido com os erros do código fornecido, e a
8784
}
8885

8986
/*
90-
Função recursiva que gera TODAS as permutações possíveis
87+
Função recursiva que gera TODAS as possibilidades possíveis
9188
(busca exaustiva).
9289

93-
Parâmetros:
9490
- rota: vetor que representa a ordem atual das entregas
9591
- inicio: posição atual da recursão
9692
- melhorCusto: melhor custo encontrado até agora
@@ -105,7 +101,7 @@ Na aula passada você deveria ter sumido com os erros do código fornecido, e a
105101
vector<int>& melhorRota) {
106102

107103
// Caso base:
108-
// Se "inicio" chegou ao final, significa que temos uma permutação completa
104+
// Se "inicio" chegou ao final, significa que temos o vetor preenchido com os pontos
109105
if (inicio == rota.size()) {
110106

111107
// Calcula o custo da rota completa
@@ -180,16 +176,17 @@ Na aula passada você deveria ter sumido com os erros do código fornecido, e a
180176
{10,40}, {20,40}, {30,40}, {40,40}, {50,40}
181177
};
182178

183-
// Seleciona apenas os primeiros n pontos
179+
// Seleciona apenas os pontos até o N escolhido
184180
vector<Ponto> entregas(todos.begin(), todos.begin() + n);
185181

186-
// Vetor que representa a ordem atual das entregas
182+
// Vetor da rota das entregas
187183
vector<int> rota(n);
188184

189-
// Vetor que guardará a melhor rota encontrada
185+
// Vetor da melhor rota
190186
vector<int> melhorRota;
191187

192-
// Inicializa rota com [0,1,2,3,...,n-1]
188+
189+
// Inicializa o índice dos pontos na ordem [1,2,3 .. N]
193190
for (int i = 0; i < n; i++)
194191
rota[i] = i;
195192

@@ -537,18 +534,17 @@ A ideia central é que aleatoriedade não é “bagunça”. Ela é um mecanismo
537534
538535
539536
540-
541537
## Para analizar as implementações:
542538
543539
Faça os testes para **N = 10, 11, 12 e 13**
544540
545-
1- Comparando Busca Exaustiva, Branch and Bound e Hill Climbing, qual apresentou melhor escalabilidade conforme N aumentou?
541+
1- Comparando Busca Exaustiva otimizada, Branch and Bound, Hill Climbing puro e O Hill Climbing aleatório, qual apresentou melhor escalabilidade conforme N aumentou?
546542
547543
548-
2 - O Hill Climbing encontrou a mesma solução que a busca exaustiva? Se não, o que explica essa diferença?
544+
2 - O Hill Climbing puro encontrou a mesma solução que a busca exaustiva? O que será que aconteceu?
549545
550546
551-
3 - O uso de solução inicial aleatória e/ou Multi-Start melhorou a qualidade média das soluções? Houve aumento significativo no tempo total? Analise o custo-benefício.
547+
3 - Usando O Hill Climbing aleatório, melhorou a qualidade média das soluções? Houve aumento significativo no tempo total? Analise o custo-benefício.
552548
553549
554550
4 Se você tivesse que resolver o problema para N = 100, qual abordagem escolheria e por quê? Considere tempo, qualidade da solução e escalabilidade.

material/aulas/aula05/run.exe

139 KB
Binary file not shown.

material/aulas/aula05/teste.cpp

Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
#include <iostream> // Entrada e saída (cout, cin)
2+
#include <vector>
3+
#include <cmath> // Função sqrt para cálculo de distância
4+
#include <limits> // numeric_limits (usado para infinito)
5+
#include <cstdlib> // atoi (converter string para inteiro)
6+
#include <chrono> // Medição de tempo de execução
7+
8+
using namespace std;
9+
10+
/*
11+
Capacidade máxima da moto.
12+
Ela só pode transportar 5 itens por viagem.
13+
Quando zera, precisa voltar ao ponto de coleta.
14+
*/
15+
const int CAPACIDADE_MOTO = 5;
16+
17+
/*
18+
Estrutura que representa um ponto no plano cartesiano.
19+
Cada ponto tem coordenadas (x, y).
20+
*/
21+
struct Ponto {
22+
double x;
23+
double y;
24+
};
25+
26+
/*
27+
Função que calcula a distância euclidiana entre dois pontos.
28+
*/
29+
double distancia(const Ponto& a, const Ponto& b) {
30+
double dx = a.x - b.x;
31+
double dy = a.y - b.y;
32+
return sqrt(dx * dx + dy * dy);
33+
}
34+
35+
/*
36+
Função que calcula o custo total de uma rota completa.
37+
38+
- O motorista sai de casa.
39+
- Vai até o ponto de coleta.
40+
- Realiza as entregas na ordem definida em "rota".
41+
- A cada 5 entregas precisa voltar na coleta.
42+
- Ao final de todas as entregas, retorna para casa.
43+
*/
44+
double calcularCusto(const Ponto& motorista,
45+
const Ponto& coleta,
46+
const vector<Ponto>& entregas,
47+
const vector<int>& rota) {
48+
49+
double custo = 0.0;
50+
51+
// 1) Motorista vai até o ponto de coleta
52+
custo += distancia(motorista, coleta);
53+
54+
int cargaAtual = CAPACIDADE_MOTO; // Quantos itens ainda cabem na moto
55+
Ponto posicaoAtual = coleta; // Começa na coleta
56+
57+
// 2) Percorre todas as entregas na ordem do vetor
58+
for (size_t i = 0; i < rota.size(); i++) {
59+
60+
// Se a carga acabou, volta para coleta para reabastecer
61+
if (cargaAtual == 0) {
62+
custo += distancia(posicaoAtual, coleta);
63+
posicaoAtual = coleta;
64+
cargaAtual = CAPACIDADE_MOTO;
65+
}
66+
67+
// Vai até o próximo ponto de entrega
68+
custo += distancia(posicaoAtual, entregas[rota[i]]);
69+
posicaoAtual = entregas[rota[i]];
70+
cargaAtual--; // Um item foi entregue
71+
}
72+
73+
// 3) Após a última entrega, retorna para casa
74+
custo += distancia(posicaoAtual, motorista);
75+
76+
return custo;
77+
}
78+
79+
/*
80+
Função recursiva que gera TODAS as possibilidades possíveis
81+
(busca exaustiva).
82+
83+
- rota: vetor que representa a ordem atual das entregas
84+
- inicio: posição atual da recursão
85+
- melhorCusto: melhor custo encontrado até agora
86+
- melhorRota: rota correspondente ao melhor custo
87+
*/
88+
void permutar(const Ponto& motorista,
89+
const Ponto& coleta,
90+
const vector<Ponto>& entregas,
91+
vector<int>& rota,
92+
int inicio,
93+
double& melhorCusto,
94+
vector<int>& melhorRota) {
95+
96+
// Caso base:
97+
// Se "inicio" chegou ao final, significa que temos o vetor preenchido com os pontos
98+
if (inicio == rota.size()) {
99+
100+
// Calcula o custo da rota completa
101+
double custo = calcularCusto(motorista,
102+
coleta,
103+
entregas,
104+
rota);
105+
106+
// Se essa rota for melhor que a atual melhor, atualiza
107+
if (custo < melhorCusto) {
108+
melhorCusto = custo;
109+
melhorRota = rota;
110+
}
111+
112+
return;
113+
}
114+
115+
/*
116+
Geração das permutações:
117+
Fixamos o elemento da posição "inicio"
118+
e permutamos os elementos seguintes.
119+
*/
120+
for (size_t i = inicio; i < rota.size(); i++) {
121+
122+
// Troca o elemento atual
123+
swap(rota[inicio], rota[i]);
124+
125+
// Chamada recursiva para próxima posição
126+
permutar(motorista,
127+
coleta,
128+
entregas,
129+
rota,
130+
inicio + 1,
131+
melhorCusto,
132+
melhorRota);
133+
134+
// Desfaz a troca
135+
swap(rota[inicio], rota[i]);
136+
}
137+
}
138+
139+
int main(int argc, char* argv[]) {
140+
141+
/*
142+
O programa recebe como parâmetro
143+
a quantidade de pontos de entrega.
144+
145+
Exemplo:
146+
./exausto 8
147+
*/
148+
149+
int n = atoi(argv[1]);
150+
151+
if (n <= 0 || n > 20) {
152+
cout << "Escolha um numero entre 1 e 20.\n";
153+
return 1;
154+
}
155+
156+
// Posição fixa do motorista (casa)
157+
Ponto motorista{0,0};
158+
159+
// Posição fixa do ponto de coleta
160+
Ponto coleta{5,5};
161+
162+
/*
163+
Lista dos pontos de entrega
164+
*/
165+
vector<Ponto> todos = {
166+
{10,10}, {20,10}, {30,10}, {40,10}, {50,10},
167+
{10,20}, {20,20}, {30,20}, {40,20}, {50,20},
168+
{10,30}, {20,30}, {30,30}, {40,30}, {50,30},
169+
{10,40}, {20,40}, {30,40}, {40,40}, {50,40}
170+
};
171+
172+
// Seleciona apenas os pontos até o N escolhido
173+
vector<Ponto> entregas(todos.begin(), todos.begin() + n);
174+
175+
// Vetor da rota das entregas
176+
vector<int> rota(n);
177+
178+
// Vetor da melhor rota
179+
vector<int> melhorRota;
180+
181+
182+
// Inicializa o índice dos pontos na ordem [1,2,3 .. N]
183+
for (int i = 0; i < n; i++)
184+
rota[i] = i;
185+
186+
// Inicializa melhor custo como infinito
187+
double melhorCusto = numeric_limits<double>::max();
188+
189+
// Início da medição de tempo
190+
auto inicio = chrono::high_resolution_clock::now();
191+
192+
// Executa busca exaustiva
193+
permutar(motorista,
194+
coleta,
195+
entregas,
196+
rota,
197+
0,
198+
melhorCusto,
199+
melhorRota);
200+
201+
// Fim da medição
202+
auto fim = chrono::high_resolution_clock::now();
203+
chrono::duration<double> tempo = fim - inicio;
204+
205+
// Impressão da melhor rota encontrada
206+
cout << "\nMelhor rota encontrada:\n";
207+
cout << "Motorista(0,0) -> ";
208+
209+
int cargaAtual = CAPACIDADE_MOTO;
210+
cout << "Coleta(5,5) -> ";
211+
212+
for (size_t i = 0; i < melhorRota.size(); i++) {
213+
214+
// Se zerar a carga, volta na coleta
215+
if (cargaAtual == 0) {
216+
cout << "Coleta(5,5) -> ";
217+
cargaAtual = CAPACIDADE_MOTO;
218+
}
219+
220+
int idx = melhorRota[i];
221+
222+
cout << "P" << idx
223+
<< "(" << entregas[idx].x
224+
<< "," << entregas[idx].y << ") -> ";
225+
226+
cargaAtual--;
227+
}
228+
229+
cout << "Motorista(0,0)\n";
230+
231+
// Exibe custo e tempo total
232+
cout << "\nCusto total: " << melhorCusto << endl;
233+
cout << "Tempo de execucao: "
234+
<< tempo.count()
235+
<< " segundos\n";
236+
237+
return 0;
238+
}

mkdocs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ nav:
3636
- "Aula 02 - Cluster Franky": aulas/aula02/index.md
3737
- "Aula 03 - STD, Vector e Tiling": aulas/aula03/index.md
3838
- "Aula 04 - Algoritmo Busca exaustiva": aulas/aula04/index.md
39-
# - "Aula 05 - Heurísticas e Aleatoriedade": aulas/aula05/index.md
39+
- "Aula 05 - Heurísticas e Aleatoriedade": aulas/aula05/index.md
4040
# - "Aula 06 - Efeitos colaterais do paralelismo": aulas/aula06/index.md
4141
# - "Aula 07 - Programação Distribuída": aulas/aula07/index.md
4242
# - "Aula 08 - Programação Paralela e Distribuída": aulas/aula08/index.md

0 commit comments

Comments
 (0)