禁忌搜索算法总是在第二次迭代

时间:2017-09-11 13:35:50

标签: c pointers linked-list malloc

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;
}

我试图在我的学校作业中使用禁忌搜索算法,但它并没有真正起作用。 这段代码应该创建一个链接列表,其链接数与pesquisa_tabu函数中的对象数相同,然后在邻居中生成相同的数字,并为每个链接添加一个邻居,然后处理pesquisa_tabu中的所有信息。功能。 而我无法在此代码中找到错误,它总是在第二次迭代时崩溃......

1 个答案:

答案 0 :(得分:-1)

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

您所做的工作是objs listatemp->next个已分配的内存以及丢失了所有这些内容的链接,因为您总是将NULL指向新内存然后使其指向head。在为所有节点分配内存时,需要维护列表的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;

 ...
 <locales>
    <add id="698" code="tr" name="Turkish" xsd:Transform="Insert"/>
    <add id="701" code="fr" name="French" />
 </locales>
 ....