void descida2opt(int n, int *s, int *p, int *w, int b, int penalidade, int *peso_objetos, int *fo) { int delta, melhor_delta, melhor_posicao1,melhor_posicao2; melhor_delta = INT_MAX; while(melhor_delta > 0) //while 1 { melhor_delta = -INT_MAX; for (int i = 0; i < n-1; i++)//for1 { troca_bit(s,i); for (int j = i+1; j < n; j++) //for2 { troca_bit(s,j); delta = - p[j]*!s[j] + p[j]*s[j] -p[i]*!s[i] + p[i]*s[i] + penalidade*MAX(0, *peso_objetos - b) - penalidade*MAX(0, *peso_objetos - w[j]*!s[j] + w[j]*s[j] - w[i]*!s[i] + w[i]*s[i] - b); if (delta > melhor_delta) //if 1 { melhor_delta = delta; melhor_posicao1 = i; melhor_posicao2 = j; }//if 1 troca_bit(s,j); }//for2 troca_bit(s,i); }//for1 if (melhor_delta > 0) //if 2 { *fo = *fo + melhor_delta; troca_bit(s, melhor_posicao1); // s <-- sī troca_bit(s, melhor_posicao2); *peso_objetos += - w[melhor_posicao1] * !s[melhor_posicao1] + w[melhor_posicao1] * s[melhor_posicao1] - w[melhor_posicao2] * !s[melhor_posicao2] + w[melhor_posicao2] * s[melhor_posicao2]; }//if 2 }//while 1 printf("-------------------------------------------------\n"); printf("Melhor solucao encontrada pelo Metodo da descida 2 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"); }//descida2opt