Предположим, у меня есть некоторый вычислимый предикат, P, который отображает целые числа в bools.Я знаю, что P 0
- это правда, и я знаю такой N, что P N
- это ложь.Я также знаю, что P n = false
подразумевает, что P (n + 1) is false
[*].Я хочу найти максимальное значение n, такое, что P n
истинно.
Ясно, что я могу найти решение этой проблемы путем деления пополам.К сожалению, оценка P стоит дорого (возможно, это займет час или около того).У меня также есть блестящий сервер со многими ядрами.
Если оценка P заняла постоянное время, и у меня было 2 потока (скажем), я могу видеть, как я буду выполнять поиск.Я бы разделил интервал [a, b] на три сегмента и оценил бы P (2a + b)/3
и P (a + 2b)/3
.После того, как обе оценки будут завершены, я буду знать, в какой из трех сегментов перейти.Используя две темы, мое время поиска будет сокращено на треть.Отлично!
Однако, что если оценка P занимает много раз?В моем конкретном примере это может занять от 10 секунд до часа или около того.Предположим еще раз, что у меня есть 2 потока и я разделил интервал, как указано выше.Возможно, первый поток (оценивающий P (2a+b)/3
) заканчивается первым.Как мне решить, где запустить следующий?
Я предполагаю, что есть какая-то ссылка на теорию информации или подобное, потому что я пытаюсь запустить тест, который даст мне больше информации, учитывая мои текущие знания.Но похоже, что это должна быть проблема, которую исследовали другие - кто-нибудь может указать мне на бумаги или подобные?
[*] В конкретном случае, который меня волнует, тест включает запуск решателя SMT, пытающегося найтирешение X задачи ограничения с одним дополнительным ограничением вида X ≥ n, где n - целое число выше.