我正在使用C中的蚁群优化来解决TSP问题。
我认为自己实现正确,但是我的程序无法正常工作。
我知道我的代码内存有问题,因为在我运行程序时,控制台会写“ core dumped”。
我使用gdb查找错误,并且在编写调试命令时看到了类似的内容:
Program received signal SIGSEGV, Segmentation fault.
0x08049691 in odleglosc (miastoA=1668848019, miastoB=1062464331, graf=0x804d440) at trail.c:34
34 return graf[miastoA][miastoB];
(gdb) bt
0 0x08049691 in odleglosc (miastoA=1668848019, miastoB=1062464331, graf=0x804d440) at trail.c:34
1 0x080496f1 in Length (sciezka3=0x804f5a0, graf=0x804d440, size=22) at trail.c:42
2 0x0804919d in updateFeromon (feromon=0x804f380, mrow=0x804e8a0, graf=0x804d440, parowanie=0, 10000000000000001, iloscFeromonu=2, miasta=22, mrowki=4) at pheromon.c:40
3 0x080489e3 in main (argc=1, argv=0xbffff0f4) at main.c:55
pheromon.c中的UpdateFeromon调用了trace.c中的Length函数,接下来,该函数也从Trail.c中调用了odleglosc。
miastoA和miasto的范围是0到21。
我不知道哪个函数会更改我的值(miastoA和miastoB)以及如何解决它。
这是我的代码http://speedy.sh/FTTZe/mrowki.tar的链接
最佳答案
这是一个复杂的代码,很难理解用我不会说的语言编写的复杂代码。无论如何,我试图检查代码,并看到了一个看起来可疑的地方。在函数inicjalizujMrowki()中,您似乎在下面的第二个for循环中覆盖了mrow []值:
for(i=0; i<miasta; i++)
{
mrow[i]=(int*)malloc(sizeof(int)*miasta);
}
for(j=0; j<mrowki;j++)
{
int start =0;
mrow[j]= losowaSciezka(start, miasta);
}
作为我调查的总体结果,miasta(无论是多少)是22(而不是您在问题中指出的21),并且问题肯定是分配不正确,因此上面的代码响了起来。
编辑:
经过您上面的解释,我认为割草确实是问题所在。我正在手机上编写此代码,因此无法直接给您提供代码,但可以向您展示方法。将mrow视为指向数组的指针的指针。因此初始化应如下所示(伪代码):
int **mrow;
**mrow = malloc(num_rows);
for (0 to num_rows-1) {
*mrow = malloc(num_columns);
}
编辑:我太多参与了这一点。我认为最好花一些时间来学习如何使用调试器,而不是查看代码并尝试查找问题。那会很有帮助。