не уверен, что это правильное место ... Я использую код перебора, чтобы решить проблему с асимметричной продажей путешественников. У него 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);
}
Я протестировал приведенный выше код для экземпляра из пяти городов, и он успешно вернулся, как и ожидалось, за несколько миллисекунд. Для 17 городов я сначала думал, что это займет несколько часов, а затем пару дней. Он работает в течение 4 дней, и я начинаю подозревать, что программа по какой-то причине больше не работает, как будто она заморожена. Я не получаю никаких ошибок, но это занимает намного больше времени, чем я ожидал, программа печатает общую стоимость и путь каждый раз, когда находит путь с более низкой стоимостью, но она перестала печатать через полчаса с момента запуска.
Я использую Ubuntu 18.04, программа «работает» на терминале, системный монитор сообщает Memory: N / A, значит ли это, что он не использует память? Это также говорит CPU: 6%, я могу увеличить его? Есть ли способ проверить, работает ли он правильно? Или оценить, сколько времени потребуется, чтобы закончить? Я так не уверен в его целостности, что думаю, что должен остановить процесс, но в то же время я действительно хотел увидеть результаты.