2014-02-02 2 views
0

Я занимаюсь домашней проблемой, связанной с локальным поиском. Я хотел бы перезапустить поиск, используя новое начальное состояние через некоторое время. Для этого я включил условие времени в мой цикл while.while цикл с временным условием не заканчивается

void run_local_search() 
{ 
    while (time(NULL) - timer < (tim * 60) - 1) // tim is some user defined time in minutes. I've initialized timer in my main function right before calling the run_local_search(). 
    { 
     struct state initial; // Declaring the initial state structure 

     start_state(&initial); // Generates a random starting state. 
     if (initial.profit > best.profit) 
     { 
      best = initial; 
     } 
     local_search(&initial); 
    } 
} 

Моей главная функция локального поиска

void local_search(state* s) 
{ 
    clock_t searchtime; 
    searchtime = clock(); // I initialize the clock right before the search loop here 
    while ((clock() - searchtime)/CLOCKS_PER_SEC < 2) // I want the loop to run for 2 seconds 
    {...} 
    cout << "Done" << endl; 
} 

Я обнаружил, что состояние структуры начального; оператор не повторно инициализирует исходную структуру через итерации цикла while. То же самое значение для начального переноса происходит в новой итерации цикла while, поэтому моя функция start_state, которая генерирует случайное значение, оказывается бесполезной! Как я могу это исправить?

+1

Привет. Просить людей обнаружить ошибки в коде не особенно продуктивно. Вы должны использовать отладчик (или добавить заявления печати), чтобы изолировать проблему, отслеживая ход вашей программы и сравнивая ее с тем, что вы ожидаете. Как только двое расходятся, вы нашли свою проблему. (И затем, если необходимо, вы должны построить [минимальный тестовый сценарий] (http://sscce.org).) –

+0

Покажите нам 'tim' и' timer', и, как упоминалось @OliCharlesworth, лучше иметь минимальный самодостаточные примеры. – mockinterface

+0

Привет! Я добавил утверждения печати (я не показал их в коде), и я выделил проблему, связанную с тем, как структура (struct state initial;) инициализируется в цикле while. Кажется, он сохраняет постоянную ценность в итерациях цикла. Как я могу убедиться, что значение структуры можно переопределить и повторно инициализировать? – krandiash

ответ

0

Из маленькой информации вы дали, я догадываюсь об алгоритме должен быть инициализирован один раз, перед тем ТИМ минут петля:

void run_local_search(){ 
    struct state initial; 
    //  start_state(&initial); //moved into loop 
    while (time(NULL) - timer < (tim * 60) - 1){ 
    start_state(&initial); 
    if (initial.profit > best.profit){ 
     best = initial; 
    } 
    local_search(&initial); 
    } 
} 
+0

Я хотел бы, чтобы начальное состояние структуры; оператор, который должен храниться в цикле, чтобы запустить функцию start_state (она генерирует случайное начальное состояние каждый раз). Но когда я держу его в цикле, «начальное» состояние имеет постоянное значение в итерациях цикла while. – krandiash

+0

@krandiash Тогда, может быть, только начальное состояние структуры; должен быть снаружи, см. отредактированное предложение. – laune

Смежные вопросы