大家好我是一名C学习者,我编写了一个程序来解决最短路径问题(简单版本)(通过实现模拟退火算法)但我在执行时遇到问题。当我在Code :: blocks中运行调试器时,它在行混合器中给了我分段错误(参见代码),但我不知道为什么。现在令人惊讶的是,当我移除循环或设置特定数字(测试100次迭代)时,它正确运行,但是当我将其设置为高(例如1000)时它会停止。那么您认为导致问题的是什么(如果您希望看到我可以发布的完整代码,我只是不知道如何使用法语写的大部分内容,请原谅我)。任何帮助表示赞赏。链接到项目:https://gist.github.com/melkanas/a1909439f6c3f9a33b8552a04ddadd77 编辑::我认为这是一个stackoverflow错误,因为问题只有在我尝试大量迭代(而不是无限)时才会发生。
srand(time(NULL));
double temperature = (double) 1000;
int choix = 1; //choice
int i = 0;
Tour *Trajet =NULL;
Tour *Meilleur = NULL; // the best solution
Tour *nouveauTour =NULL; //the new randomly generated combination
Tour *nettoyer = NULL; // to free memory of old (not referenced anymore)
int tailleTrajet =0;
double probalea =0; // random (probability related to the algorithme
double ratio = 0.0001; // to minimize temperature
int nombreAleatoire = 0; // to divide the trajectory into two pieces
printf("Creation du Tour"); //
while(choix)
{
Ville *V = malloc(sizeof(Ville));
V->nom = malloc(sizeof(char)*TAILLE_MAX);
i++;
printf("Ville Num %d\n",i);
initialiserVille(V);
Trajet = InsererEnQueue(&Trajet,*V);
free(V);
printf("votre choix (0/1): ");
scanf("%d",&choix);
}
printf("Tour initiale: \n");
AffichageTour(Trajet);
printf("\nAvec une distance de %lf",distanceTour(Trajet));
Meilleur = Trajet;
tailleTrajet = Trajet->taille;
int q =1; // this is just to count the number of iteration before the
//program stops
//this part underneath is where the mess
while(temperature>1)
{
nombreAleatoire = (int) rand()%(tailleTrajet-1) +1;
nouveauTour = mixer(Trajet,nombreAleatoire); // creates a new
//Trajectory (allocates memory)
probalea = rand()/(double)RAND_MAX;
double pro = probabilite(distanceTour(Trajet),distanceTour(nouveauTour),temperature);
//returns 1 if new Trajectory is best(short or long but has a good probability) //else 0
if(pro>probalea )
{
Trajet = nouveauTour;
}
else
{
Liberer(nouveauTour); //free new generated solution(not a good solution)
nouveauTour = NULL;
}
if(distanceTour(Trajet)<distanceTour(Meilleur))
{
nettoyer = Meilleur; // to keep the old best solution
Meilleur = Trajet; // move to the new best
Liberer(nettoyer); // dealocate memory (last best)
nettoyer =NULL;
}
temperature=temperature*((double)(1.0-ratio)); // the cast was just to make sure(after the problem occured)
printf("\n iteration : %d",q);// minimiser la temperature
q++;
}
printf("Trajet optimal :\n"); // shows the best(shortest) trajectory
AffichageTour(Meilleur);
printf("\nAvec une distance de %lf",distanceTour(Meilleur));
答案 0 :(得分:0)
我发现问题与stackoverflow无关,或者它只是结构的一个属性,它是一个整数,在函数混合器中没有初始化。