C 程序运行的时间比预期的长,运行是否正常?
不确定这是不是合适的地方。。。 我正在运行一个蛮力代码来解决一个不对称的旅行者销售问题。 它有17个城市,一个是固定的,所以它会有16个!(>20万亿)个排列要检查C 程序运行的时间比预期的长,运行是否正常?,c,ubuntu,C,Ubuntu,不确定这是不是合适的地方。。。 我正在运行一个蛮力代码来解决一个不对称的旅行者销售问题。 它有17个城市,一个是固定的,所以它会有16个!(>20万亿)个排列要检查 unsigned long TotalCost(unsigned long *Matrix, short *Path, short Dimention) { unsigned long result = 0; unsigned long Cost; int iD; for (iD = 1; iD
unsigned long TotalCost(unsigned long *Matrix, short *Path, short
Dimention)
{
unsigned long result = 0;
unsigned long Cost;
int iD;
for (iD = 1; iD <= Dimention; iD++)
{
Cost = Matrix[Dimention*Path[iD - 1] + Path[iD]];
if (Cost > 0)
{
result = result + Cost;
}
else
{
return 4099999999;
}
}
return result;
}
void swapP(short *x, short *y)
{
short temp;
temp = *x;
*x = *y;
*y = temp;
}
void permute(unsigned long *Matrix, short Dimention, unsigned long *CurrentMin, short *PerPath, short **MinPath, short l, short r)
{
short i;
unsigned long CCost;
if (l == r)
{
CCost = TotalCost(Matrix, PerPath, Dimention);
if (CCost < (*CurrentMin))
{
for (i = 0; i <= Dimention; i++)
{
(*MinPath)[i] = PerPath[i];
}
(*CurrentMin) = CCost;
PrintResults(Matrix, PerPath, Dimention, 2);
}
}
else
{
for (i = l; i <= r; i++)
{
swapP((PerPath+l), (PerPath+i));
permute(Matrix, Dimention, CurrentMin, PerPath, MinPath, l+1, r);
swapP((PerPath+l), (PerPath+i)); //backtrack
}
}
}
int main (void)
{
// The ommited code here, allocs memory for the matrix, HcG and HrGR array
// it also initializes them
permute(Matrix, Dimention, &TotalMin, HcG, &HrGR, 1, Dimention - 1);
}
unsigned long TotalCost(unsigned long*矩阵、short*路径、short
尺寸)
{
无符号长结果=0;
未签字长期成本;
int-iD;
对于(iD=1;iD 0)
{
结果=结果+成本;
}
其他的
{
返回409999999;
}
}
返回结果;
}
无效交换(短*x,短*y)
{
短期温度;
温度=*x;
*x=*y;
*y=温度;
}
无效置换(无符号长*矩阵,短维度,无符号长*当前最小值,短*每路径,短**最小路径,短l,短r)
{
短i;
未签名长代码;
如果(l==r)
{
成本=总成本(矩阵、路径、尺寸);
如果(成本<(*CurrentMin))
{
对于(i=0;i我只浏览了一下您的代码,但我在过去做过很多次类似的事情。我的一般方法如下(尽管这会增加一点成本)
添加打印语句的方式(可能是使用mod计数器),使打印大约每2到3分钟打印一次。在打印中包含一些信息,以便您可以知道模拟的进展情况。(注意,在这些信息中,您可能希望确保打印出变量,如果这些变量被破坏,可能会导致无限循环,例如“Dimention”(顺便说一句,您将其拼写错误)
我个人不会从5个城市跳到17个城市,而是从5个城市跳到7个城市,然后再跳到9个或10个城市……只是为了确认一切正常,并了解您的特定CPU会增加多少时间
最后,在您现在所处的情况下,是否可以获得另一个窗口并运行“ps”来查看您的作业是否获得了CPU时间?如果没有,我的方法将是杀死它并按照上面所述实现。HTH
另外,请注意,您省略的代码(内存分配等)非常关键:编写的代码可能会越界,并且可能不会崩溃(如果只是稍微越界),但最终会破坏可能(如上所述)的变量(取决于内存布局)创建一个无限或接近无限的循环。对于递归运行数天的程序,您是否考虑过堆栈溢出的可能性?确实没有很好的方法来判断,因为它非常依赖于您的特定机器。但是,听起来它可能挂在某个地方。如果您想让它更快,您可能需要能够使用pthreads进行一些多线程处理。我考虑过,但后来我希望得到某种错误消息。我还希望堆栈最大值为16?如果在第一级递归中输出循环值,这将非常清楚它将需要多长时间。当预期的下一个提示执行时,您还将知道它是否已挂起假设“几毫秒”是3,5个城市需要测试4!排列,而17个城市需要16!排列,那么直接扩展到17个城市需要(3•10^-3)/4•16!秒,约26亿秒,即83年。我不熟悉“ps”我将进行搜索,我想访问程序内存并检查向量的当前值以查看它运行了多远,但我认为操作系统不允许我这样做。打开另一个终端(如果可以)并运行“ps-ef | grep”。它将显示到目前为止它使用了多少CPU。如果每隔几秒钟运行两次,您将看到CPU时间的增加。如果作业在后台运行,您可以在同一终端上运行ps。Protip:如果您的程序名为traveler
,则grep ps的输出为grep[t]raveler
。这样一来,grep
将找不到自己的调用。如果作业挂起,它将无法获得CPU时间,您可以杀死它。不幸的是,如果它获得CPU时间(没有打印语句或任何其他方式查看进度)你不知道它是在进步还是在漫无目的地循环。如果你不能证明它在进步,如果是我,我会减少损失,并用我在回答中概述的方法重新开始(事实上,我已经减少了我的损失,可以这么说,很多次,当时我认为如果没有打印声明的方法,我可以逃脱)。它输出:bruno 28875 27102 99 out06 pts/0 3-21:14:28。/HeuristicaRefinamento没有标题,我假设99是CPU时间,我将按照您的建议,终止进程并添加打印语句。谢谢您的时间。