Member 14193707 Ответов: 2

Код C++ для алгоритма оптимизации муравьиной колонии


чтобы найти кратчайший путь между несколькими узлами

Что я уже пробовал:

#include <iostream>

using namespace std;
#define INT_MAX  999999

int n=4;
int dp[16][4];
int dist[10][10]={
    {0,20,42,25},
    {20,0,20,34},
    {42,30,0,10},
    {25,34,10,0},
};
int VISITED_ALL=(1<<n)-1;

int tsp(int mask,int pos){
   if(mask==VISITED_ALL){
     return dist[pos][0];
 }
   if(dp[mask][pos]!=-1)
 {
     return dp[mask][pos];
 }
    int ans=INT_MAX;
      for(int city=0;city<n;city++)
      {
        if(mask&(1<<city)==0)
     {
         int newAns=dist[pos][city]+tsp(mask|(1<<city),city);
         ans=min(ans,newAns);
     }
 }
 return dp[mask][pos]=ans;
}
int min (int a, int b)
{
    int p,q;
    
    if(p<q){
     printf("p");
    }
    else{
     printf("q");
    }
}
   
int main()
{
    for(int i=0;i<(1<<n);i++){
        for(int j=0;j<n;j++)
        {
            dp[i][j]=-1;
        }}
        cout<<tsp(1,0)<<endl;
        return 0;
}

это код, который я пробовал, но он не дает правильного вывода

Patrice T

Показать пример входных данных, результат и ожидаемый результат.

CPallini

Не могли бы вы подробно описать свой сценарий? Как Карстенк как уже было отмечено, ваш код выглядит следующим образом с несколькими ошибками.

2 Ответов

Рейтинг:
1

KarstenK

Вам нужно использовать отладчик. Я вижу некоторые серьезные ошибки в одной функции.

int min (int a, int b)
{
    //int p,q; not needed
    if(a<b){
     printf("p");
     return a;
    }
    else{
     printf("q");
     return b;
    }
}
И вам нужно вызвать весь код в основной функции. Так что используйте отладчик!!!


CPallini

Действительно. Мой 5.

Stefan_Lang

Действительно.

Или просто используйте std::min() вместо того, чтобы изобретать колесо и заканчивать с квадратом...

Рейтинг:
0

OriginalGriff

Цитата:
это не дает правильного результата
Ничего не говорит нам о том, что происходит: это бесполезный отчет об ошибке.

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы вход / выход был таким:
Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!


CPallini

5.