2017-09-11 4 views
-1
typedef struct{ 
    int *sols; 
    int rest; 
    int fitness; 
    int num; 
    struct lista* next; 
}lista; 

lista* gere_lista(lista *solucoes, int *sol, int *grafo, int objs, int rests){ 
    int i; 
    int *nova_sol; 
    lista *temp = solucoes; 
    nova_sol = malloc(sizeof(int)*objs); 
    nova_sol = update_sol(sol, nova_sol, objs); 
    for(i=0; i<objs; i++){ 
     nova_sol = gera_vizinho3(nova_sol, i); 
     temp->sols = malloc(sizeof(int)*objs); 
     temp->sols = update_sol(nova_sol, temp->sols, objs); 
     temp->rest = calcula_restricoes(nova_sol, grafo, objs, rests); 
     temp->fitness = calcula_max(nova_sol, grafo, objs); 
     temp->num = i; 
     temp = temp->next; 
    } 
    return solucoes; 
} 

int* pesquisa_tabu(int sol[], int *grafo, int objs, int rests, int num_iter){ 
    int fitness, fitness_viz, i, memoria[objs*2/8]; 
    lista *solucoes, *temp; 

    solucoes = malloc(sizeof(lista)); 
    temp = solucoes; 

    for(i=1; i<objs; i++){ 
     temp->next = malloc(sizeof(lista)); 
    } 
    temp->next = NULL; 
    solucoes = gere_lista(solucoes, sol, grafo, objs, rests); 
    return sol; 
} 

Ich versuche, einen Tabu-Suchalgorithmus zu meiner Schulaufgabe zu machen, aber es funktioniert nicht wirklich. Dieser Code soll eine verknüpfte Liste mit der gleichen Anzahl von Links wie die Objekte in der Funktion pesquisa_tabu erstellen, dann generiert er die gleiche Nummer in den Nachbarn und fügt jedem Link einen Nachbarn hinzu, um dann alle Informationen in der pesquisa_tabu Funktion. Und ich finde nicht, was in diesem Code falsch ist, ist es immer am zweiten Iteration abstürzt ...Tabu Suchalgorithmus stürzt immer auf der zweiten Iteration ab

+3

Ihr for-Schleife ist falsch, sind die Zuweisung Sie nur Speicher auf den gleichen temp-> weiter über und über, und legen Sie es richtig auf null nach – Tyler

+0

_Questions Debugging Hilfe suchen (warum nicht dieser Code funktioniert ?) muss das gewünschte Verhalten, ein spezifisches Problem oder einen Fehler und den kürzesten Code enthalten, der notwendig ist, um es in der Frage selbst zu reproduzieren. Fragen ohne eine klare Problemstellung sind für andere Leser nicht nützlich. Siehe: Wie erstelle ich ein [mcve] ._ –

Antwort

-1
for(i=1; i<objs; i++){ 
     temp->next = malloc(sizeof(lista)); 
    } 
    temp->next = NULL; 

Was Sie Speicher für objs Anzahl der lista ‚s zugeordnet getan haben und Links verloren alle von ihnen, weil Sie immer machen temp->next zeigen Sie auf einen neuen Speicher und dann später macht es auf NULL zeigen. Sie müssen eine head der Liste beim Zuweisen von Speicher für alle Knoten pflegen.

lista *solucoes, *temp;//solucoes will act as head of list  
temp = NULL; 
solucoes = NULL; 

for(i=1; i<objs; i++) 
{ 
    if(solucoes==NULL) 
    { 
     temp = malloc(sizeof(lista)); 
     solucoes = temp; 
    } 
    else  
    { 
     temp->next = malloc(sizeof(lista)); 
     temp = temp->next; 
    } 
} 
temp->next = NULL; 
+0

Ich benutze 'temp' als temporären Zeiger, der Hauptzeiger ist' solucoes', verliere ich alle Verbindungen, selbst wenn ich einen temporären Zeiger verwende? – pedrofranco6

+0

vielen Dank: D – pedrofranco6