double calcula_temperatura_inicial(int n, int *s, int *p, int *w, int b, int penalidade, int *peso_objetos, int *fo, double alfa, int SAmax) { double x; // numero aleatorio entre ZERO e UM double temperatura; // temperatura corrente int iter; // numero de iteracoes na temperatura corrente int posicao_escolhida; // objeto escolhido int delta; // variacao de energia int aceitos, min_aceitos; temperatura = 2; printf("Solucao inicial: fo corrente = %d peso dos objetos = %2d \n", *fo,*peso_objetos); aceitos = 0; min_aceitos = (int) (0.90*SAmax); while (aceitos < min_aceitos){ iter = 0; printf("temperatura inicial = %f \n",temperatura); while (iter < SAmax){ iter++; /* escolha um vizinho qualquer */ posicao_escolhida = random(n); troca_bit(s, posicao_escolhida); /* calcule a variacao de energia */ int peso_modificado = (*peso_objetos) - w[posicao_escolhida]*(!s[posicao_escolhida]) + w[posicao_escolhida]*s[posicao_escolhida]; delta = - p[posicao_escolhida]*(!s[posicao_escolhida]) + penalidade * calcula_inviabilidade((*peso_objetos), b) + p[posicao_escolhida]*s[posicao_escolhida] - penalidade * calcula_inviabilidade(peso_modificado,b); // printf("variacao de energia = %3d \n",delta); /* se houver melhora, aceite o vizinho */ if (delta > 0){ aceitos++; } else { /* se houver piora, aceite o vizinho com uma determinada probabilidade */ x = randomico(0,1); if (x < exp(delta/temperatura)){ aceitos++; } } troca_bit(s, posicao_escolhida); } printf("aceitos = %d min_aceitos = %d\n",aceitos, min_aceitos); if (aceitos < min_aceitos){ aceitos = 0; temperatura = temperatura * 1.1; } } printf("temperatura inicial = %f \n",temperatura); return temperatura; }