Алгоритм «Погане яблуко» або процес виходу з ладу спільної пісочної скриньки


9

Я шукаю алгоритм вирішення наступної проблеми, яку я (поки що) називаю алгоритмом "поганого яблука".

Проблема

  • У мене працює N процесів у M пісочницях, де N >> M.
  • Недоцільно давати кожному процесу свою пісочницю.
  • Принаймні один з цих процесів погано ведеться і збиває всю пісочницю, тим самим знищуючи всі інші процеси в тій же пісочниці.

Якщо це був один погано поводився процес, то я міг би використати просту біссекцію, щоб помістити половину процесів в одну пісочницю, а половину - в іншу пісочницю, поки не знайшов помилок.

Питання

Якщо більш ніж один процес ведеться погано, включаючи можливість того, що всі вони погано поводяться - чи працює цей наївний алгоритм? Чи гарантовано це працювати в межах певних розумних меж?

Спрощення

Для аргументації припустимо, що поганий процес миттєво збиває його пісочницю, а хороший процес ніколи не робить.


Як гарантовано, що погано себе веде процес буде принести пісочницю вниз? Я маю на увазі - чи можна припустити обмежений час, коли ми точно знаємо, що дана пісочниця виконує лише "чисті" процеси, тому що вона не вийшла з ладу?
СФ.

На жаль, ні: той факт, що пісочниця не виходить з ладу протягом 5 хвилин, не означає, що всі процеси добре ведуться, але це дає нам більше впевненості в цьому.
Роджер Ліпскомб

... але для цілей цього питання ми могли б наблизитись, передбачивши обмежений час, я думаю.
Роджер Ліпскомб

Ви повинні розпорошити те, що ви вважаєте процесом "пройшов" і "провалився". Якщо він проходить 5 хвилин без виходу з ладу, це технічно все-таки може бути поганим яблуком, але, як і проблема зупинки, ви ніколи не будете мати 100% впевненість, коли вона проходить, не роблячи в піску певних жорстких ліній.
Ніл

Здається, ви на правильному шляху. Якщо є багато процесів і кілька поганих яблук, можливо, вам доведеться використовувати велику величину M або нерівномірні групи, щоб ви могли виділити відомі хороші яблука, а потім зберегти відоме добро в одній пісочниці і продовжувати ділити невідомі процеси між ваші інші пісочниці, поки ви не визначите людей. Чим більше у вас пісочниць, тим швидше це піде. Як зазначав @Neil, це великий O алгоритму бази журналів M N, тому збільшення M скоротить ваші випробування.
GlenPeterson

Відповіді:


2

Якщо ви знайшли одне погане яблуко, то можете застосувати алгоритм:

  1. Розділіть N на M групи
  2. Виконайте тест по кожній групі.
  3. Якщо розмір групи більший за 1, поверніться до кроку 1, замінивши N числом елементів у неправильній групі.

Так само, якщо ви знаходили одне "хороше" яблуко, то застосовується той самий алгоритм, але скоріше знайти хорошу групу.

Цей алгоритм має показник продуктивності O (log_M (N)), але це залежить від того, що є лише одне погане яблуко.

Якщо ви не знаєте, скільки є хороших / поганих яблук, то ви можете використовувати наступний алгоритм:

For each M processes in N
  Test M processes

Це найгірший сценарій, але він працює в O(N/M)часі (або O(N)залежно від того, якщо ви вважаєте один прохід як єдиний тест або як збірник тестів, виконаних паралельно). З урахуванням речей, це не поганий підхід будь-якими способами.

Можливо, є алгоритми, які працюють краще, ніж це, але це вимагає, щоб ви знали, скільки поганих яблук / хороших яблук є в партії. Не знаючи цього фактора, хоча я не можу цього довести, я б хотів зробити ставку, що ви не можете зробити краще, ніж останній алгоритм, перелічений вище.

Сподіваюся, що це допомагає!

Редагувати : З практичної точки зору я розумію, що деякі з цих операцій виконуються не так просто. Це правда, однак, прикрою реальністю є те, що ви не можете точно визначити погане яблуко, з якого процесу працювали пісочниці, що працювали в той момент, не потребуючи принаймні активувати або дезактивувати процеси. Якщо питання стосується алгоритму, я думаю, що я відповів на це. Якщо питання стосується того, як вирішити подібну ситуацію, то, можливо, це питання краще підійде для суперпользователя SE.


1
На жаль, я не можу "перевірити" процеси; все, що я знаю, це те, що один з пісочниць розбився, і що це було викликано одним або декількома процесами в ньому.
Roger Lipscombe

1
Проблема полягає в тому, що після розбиття набору обидві перегородки можуть мати в них погані яблука. Що змушує мене думати, що мені потрібно більше, ніж простий розділ ...
Роджер Ліпскомб

@RogerLipscombe Ви намагаєтесь застосувати алгоритм до сценарію реального світу. Звичайно, ви не зможете тестувати процеси один за одним, і може виявитися складно перевірити ці процеси на різних машинах, однак, якщо ви хочете дійти до цього, ви збираєтесь повинні знайти спосіб так чи інакше. Якщо ви вставите змінні, які неможливо вирішити, ви просто не зможете знайти алгоритм, який би міг точно визначити погані яблука.
Ніл

Гаразд, значить, під "тестом" ви просто маєте на увазі "залишити їх працювати досить довго, щоб бути впевненими" ...?
Роджер Ліпскомб

@RogerLipscombe Я гадаю, що так. Можливо, це займе більше часу, але ви самі повинні вирішити, як довго чекати. Знаючи, що і дотримуючись цього алгоритму, ви можете технічно виявити будь-які погані яблука. Однак може бути швидше просто переглянути журнал подій Windows щодо збоїв.
Ніл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.