C-禁忌搜索算法总是在第二次迭代中崩溃


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函数中的对象相同数量功能。而且我找不到此代码中有什么问题,它总是在第二个迭代中崩溃...

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

您所做的是为objslista的数量分配内存,而丢失了所有链接,因为您始终将temp->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;

相关内容

  • 没有找到相关文章

最新更新