Як перетасувати кольорові кульки?


10

У мене 400 кульок, у яких 100 червоні, 40 - жовті, 50 - зелені, 60 - сині, 70 - фіолетові, 80 - чорні. (кулі одного кольору однакові)

Мені потрібен ефективний алгоритм перетасовки, так що після перетасування кулі знаходяться в списку, і

Будь-які 3 поспіль кулі не одного кольору. наприклад, я не можу мати "червоний, червоний, червоний, жовтий ...."

І всі перестановки, ймовірно, трапляються "однаково". (ну, якщо компроміс ефективності та неупередженості досить хороший, я не проти більшої ефективності, ніж об'єктивності).

Я намагався адаптувати Фішера-Йейтса-Кнута, але результат не є ідеальним.

Чому Фішер-Йейтс недостатньо хороший? Як FY приймає зворотну трансформацію Монте-Карло. І розподіл виходів трактує одні й ті ж кольорові кулі по-різному, тобто це дасть упереджений результат для моїх потреб.

І наївним мисленням було б відфільтрувати / відкликати всі погані перестановки з усього простору. Якщо обмеження дуже сильне, скажімо, якщо у нас є лише 300 кульок, а 100 з них червоні, то перед тим, як отримати відповідну перестановку, буде занадто багато відстеження / відмов назад.

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


3
Чи намагалися ви адаптувати відповіді з іншого питання, яке ви задали? Обидва питання виглядають дуже схоже :).
Гопі

@Gopi: так, і я сподіваюся, що відповіді на будь-яке питання принесуть натхнення іншим.
colinfang

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

3
@Gorge B.: ми розглядали, чому цей процес має упередженість щодо іншого пов'язаного питання. Як пояснює Девід Еппштейн у своїй відповіді на це питання, існує алгоритм динамічного програмування, який займає час, де - кількість кольорів. Щось більш ефективне було б непогано - навіть . k θ ( n k / 2 )θ(nk)kθ(nk/2)
Пітер Шор

2
@GeorgeB. Навіть якщо підхід Девіда Еппштейна дешевший, мені було б цікаво, як вирішити цю проблему за допомогою підходу MCMC.
Пітер Шор

Відповіді:


7

Те, що вам потрібно для того, щоб ланцюг Маркова сходився до рівномірного розподілу по всіх можливих послідовностях кульок, це те, що він оборотний: ймовірність переміщення від послідовності до послідовності така ж, як і переміщення в протилежному напрямку. Тому я пропоную вам скористатися наступними рухами (з певним фіксованим розподілом ймовірностей, щоб вибрати, який тип ходу зробити) для виконання ланцюга Маркова на всіх можливих послідовностях. Далі "пробіг" - це послідовне послідовне подання кульок одного кольору за максимальною довжиною. Цей ланцюжок Маркова покладається на те, що він має принаймні три кольори.jij

  1. Виберіть два пробіги навмання. Якщо ви можете обмінятися ними і все ще маєте законну послідовність, зробіть це.

  2. Виберіть два суміжні прогони. Якщо ви можете обмінятися ними і все ще маєте законну послідовність, зробіть це.

  3. Виберіть два тири одного кольору. Перерозподіліть кулі в них випадковим чином серед законних можливостей (тому, якщо максимальна кількість кульок за один пробіг становила 3, а у вас було 5 балів у двох обраних пробігах, перший з однаковою ймовірністю отримає 2 або 3 кулі; якщо Усього було 3 кулі, перший з однаковою ймовірністю отримає 1 або 2; якщо всього 4 кулі, 1, 2 та 3 - однаково ймовірні).

  4. Виберіть якийсь колір навмання. Розглянемо послідовність кульок з усіма видаленими кулями кольору . Тепер виберіть навмання дві точки в де торкаються сусідні кулі різних кольорів.S C i S CiSCiS

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

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

    c. Якщо в одній із цих двох точок у є лише один пробіг кольору , з ймовірністю ½ перенесіть одну кулю з пробігу в іншу точку. SCiS

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

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

Як ви можете сказати, коли це сходилося? Я б запропонував переглянути ентропію цієї послідовності та зупинити її, коли вона перестане збільшуватися. Як обчислювати ентропію? У розрахунку ентропії є два основні терміни: розподіл довжин пробігу та послідовність кольорів у кожному прогоні. Для розподілу довжини прогону припустимо, що є прогони кольору з довжиною . Внесок їх у ентропію - де - максимально допустима довжина пробігу. Тепер розглянемо внесок послідовності кольорів у ентропію. Припустимо, є i kni,kik

i log2 (kni,kni,1 ni,2  ni,r),
rmi,jмісця, де за кольором негайно йде одне з кольорів (тому ). Внесок цього в ентропію - де - кількість кольорів. ijmi,i=0
i log2 (jmi,jmi,1 mi,2  mi,c),
c

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

ОНОВЛЕННЯ:

Повинні бути способи прискорити це. Я вважаю, що для кроків c і d ви можете використовувати аналіз для виконання обох цих кроків над усіма пробіжками одного кольору одночасно. Для етапів a і b це еквівалентно питанню знайти випадкову послідовність кольорових кульок з тим обмеженням, що жодна куля одного кольору не стосується. Для цієї проблеми повинен бути хороший спосіб зробити змішування. Тоді вам просто доведеться чергувати кроки a / b з кроками c / d, де кожен крок змішується над цими двома ходами. Я думаю, що це має сходитися досить швидко, хоча у мене немає жорсткого аналізу цього ланцюга Маркова.


0

Як ви вже говорили, неможливо забезпечити рівномірність кожної перестановки і забезпечити рівномірність розподілу кольорів, оскільки одна з перестановок має всі червоні кольори підряд.

Дуже елегантним, але, очевидно, не очевидним методом забезпечення рівномірного розподілу кольорів є використання послідовності з низькою невідповідністю.

Припустимо, у вас кульок, пронумерованих від до , і значення насіння, .N=4001Ns

Переконайтесь, що всі кульки одного кольору є послідовно пронумерованими. Тобто у вашому випадку нехай перші 100 кульок будуть червоними, наступні 40 - жовтими, наступні 50 - зеленими тощо.

Потім кульку значення, таке, що: деkthxk

xk=(s+kϕ)(mod1),
  • ϕ=1+52=1.61803399... , золоте співвідношення
  • оператор , який приймає дробову частину аргументу(mod1)
  • s - будь-яке постійне значення насіння, яке ви бажаєте.

Тобто, кожному з балів буде виділено значення яке завжди буде від 0 до 1.Nxk

Тепер просто замовляйте кульки, у порядку зростання, відповідно до їх значення .xk

Наприклад, використовуючи значення насіння , кулі будуть впорядковані так: s=0

{B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,G,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,B,Y,K,B,R,P,Y,K,B,R,P,G,R,P,Y,K,B,R,P,G,K,R,B,R,K,G,R,P,Y,K,B,R,P,G,K,R,P,Y,K,B,R,P,G,K}
(де "B"= Синій, а" "= чорний).K

Нарешті, якщо ви хочете взяти інший зразок, просто виберіть інше значення насіння, .s

Код Python для цього розподілу такий:xk

n=400

phi = (1+pow(5,0.5))/2
x = np.zeros(n)                 
s = np.random.uniform(0,1)
for i in range(n):
    x = (s + phi*(i+1)) %1

print (s)
print (x)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.