void descida1opt(int n, int *s, int *p, int *w, int b, int penalidade, int *peso_objetos, int *fo, double percentual) { int delta, melhor_delta, melhor_posicao; int n_vizinhos = MAX(0, (int) (percentual*n)); int *vet, aux, j1, j2; melhor_delta = INT_MAX; vet = cria_vetor(n); for (int j=0; j < n; j++) vet[j] = j; while(melhor_delta > 0) //while 1 { melhor_delta = -INT_MAX; embaralha_vetor(vet, n); for (int j=0; j < n_vizinhos; j++) //for 1 { troca_bit(s, vet[j]); delta = (-p[vet[j]]*!s[vet[j]] + p[vet[j]]*s[vet[j]] + penalidade*MAX(0, *peso_objetos - b) - penalidade*MAX(0, *peso_objetos - w[vet[j]]*!s[vet[j]] + w[vet[j]]*s[vet[j]] - b)); if (delta > melhor_delta) //if 1 { melhor_delta = delta; melhor_posicao = vet[j]; }//if 1 troca_bit(s, vet[j]); }//for 1 if (melhor_delta > 0) //if 2 { *fo = *fo + melhor_delta; troca_bit(s, melhor_posicao); // s <-- sī *peso_objetos += -w[melhor_posicao] * !s[melhor_posicao] + w[melhor_posicao] * s[melhor_posicao]; }//if 2 }//while 1 printf("-------------------------------------------------\n"); printf("Melhor solucao encontrada pelo Metodo da descida 1 Optimal:\n"); printf("Funcao objetivo: %d\n", *fo); printf("Peso da mochila: %d Inviabilidade = %d \n", *peso_objetos, MAX(0,*peso_objetos - b)); printf("-------------------------------------------------\n"); libera_vetor(vet); }//descida1opt