-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathperturbacao.c
executable file
·89 lines (89 loc) · 2.5 KB
/
perturbacao.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
* Perturbação realizada por trocas.
*/
int* perturbacao(float **distancia, int quantCidade, int capacidade, int *cidadeD, int *rotas, int quantRotas, int depositoCentral){
int *novasRotas, i, a, b, aux, capacidadeRota;
float custoRota;
/*
* Alocação do vetor que irá conter a resposta (novasRotas) do problema.
*/
novasRotas = malloc((quantRotas) * sizeof(int));
if (novasRotas == NULL) {
printf( "Erro Malloc novasRotas!\n");
exit(-1);
}
/*
* Cópia da solução final para uma solução provisória.
*/
for (i = 0; i < quantRotas; ++i){
novasRotas[i] = rotas[i];
}
/*
* Cálculo do custo da solução final (rotas).
*/
custoRota = calcCusto(rotas, distancia, quantRotas);
/*
* Inicio perturbação.
*/
for (a = 1; a < quantRotas-1; a++){
for (b = a+1; b < quantRotas-1; b++){
/*
* Realiza a troca entre duas cidades.
*/
aux = novasRotas[a];
novasRotas[a] = novasRotas[b];
novasRotas[b] = aux;
/*
* Verifica se houve redução de custo final com a troca.
*/
if (custoRota > calcCusto(novasRotas, distancia, quantRotas)){
capacidadeRota = 0;
/*
* Realiza o cálculo para verificar se não foi ultrapassado a capacidade de cada veículo.
*/
for (i = 0; i < quantRotas; i++){
if (novasRotas[i] != depositoCentral ){
capacidadeRota += cidadeD[novasRotas[i]];
}else{
capacidadeRota = 0;
}
/*
* Se a capacidade da do veículo for ultrapassada.
*/
if (capacidadeRota > capacidade){
capacidadeRota = -1;
break;
}
}
/*
* Se capacidadeRota = 0 então nenhuma rota ultrapassou a capacidade do veículo.
* Se capacidadeRota = -1 então alguma rota ultrapassou a capacidade do veículo
* e deve ser retornada as cidades para a posição inicial no vetor da solução final (novasRotas).
*/
if(capacidadeRota == 0){
/*
* Atualizando o valor do custoRota para o nova solução encontrada.
*/
custoRota = calcCusto(novasRotas, distancia, quantRotas);
}else{
/*
* Retornando as cidades para a posição original
* pois alguma rota ultrapassou a capacidade do veículo.
*/
aux = novasRotas[b];
novasRotas[b] = novasRotas[a];
novasRotas[a] = aux;
}
}else{
/*
* Retornando as cidades para a posição original
* pois o novo custo é maior que o custo anterior.
*/
aux = novasRotas[b];
novasRotas[b] = novasRotas[a];
novasRotas[a] = aux;
}
}
}
return novasRotas;
}