我正在使用C中的蚁群优化来处理TSP问题。我认为我实现得很正确,但我的程序不起作用。我知道我的代码内存有问题,因为当我运行程序时,控制台会写"核心转储"我使用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
来自费洛蒙.c的UpdateFeromon调用来自trail.c的Length函数,接下来这个函数也从trail.c调用odleglosc。miastoA和miasto的范围从0到21。我不知道是哪个函数更改了我的值(miastoA和miastoB)以及如何修复它。
这是我的代码链接http://speedy.sh/FTTZe/mrowki.tar
这是一个复杂的代码,很难理解用我不会说的语言编写的复杂代码。不管怎样,我试着检查代码,发现了一个看起来可疑的地方。在函数inicjalizuxMrowki()中,您似乎覆盖了下面第二个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确实是个问题。我在手机上写这篇文章,所以我不能直接给你代码,但我可以给你指路。将mrow看作是指向数组的指针数组的指针。所以初始化应该是这样的(伪代码):
int **mrow;
**mrow = malloc(num_rows);
for (0 to num_rows-1) {
*mrow = malloc(num_columns);
}
编辑:我太投入了。我认为与其看代码并试图找到问题,不如花一些时间学习如何使用调试器。这会有很大帮助。