Цикл while с синхронизированным условием не прерывается

0

Я занимаюсь домашней проблемой, связанной с локальным поиском. Я хотел бы перезапустить поиск, используя новое начальное состояние через некоторое время. Для этого я включил условие времени в мой цикл 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
    Здравствуй. Просить людей обнаруживать ошибки в вашем коде не особенно продуктивно. Вы должны использовать отладчик (или добавить операторы печати), чтобы изолировать проблему, отслеживая ход вашей программы и сравнивая его с тем, что вы ожидаете. Как только они расходятся, вы нашли свою проблему. (И затем, если необходимо, вы должны создать минимальный тест-кейс .)
  • 0
    Покажите нам tim и timer , и как уже упоминалось @OliCharlesworth, лучше иметь минимальные самодостаточные примеры.
Показать ещё 1 комментарий
Теги:
struct
while-loop
initialization
time

1 ответ

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.
  • 0
    @krandiash Тогда, может быть, только начальное состояние структуры; должен быть снаружи, см. отредактированное предложение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню