C 程序运行的时间比预期的长,运行是否正常?

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

不确定这是不是合适的地方。。。 我正在运行一个蛮力代码来解决一个不对称的旅行者销售问题。 它有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 <= 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时间,我将按照您的建议,终止进程并添加打印语句。谢谢您的时间。