15 personas se sentarán en una fila de 15 sillas. ¿Cómo calculo cuántos planes de asientos se pueden hacer, donde dos planes de asientos se consideran iguales si dos planes comparten cuádruples adyacentes? o ¿Cómo puedo crear un algoritmo eficiente para encontrar límites inferiores para 15 o menos personas?

Sin la condición de cuádruples, ¡habría 15! ≈ 1.3 billones de arreglos (el término matemático es permutaciones ). Con la condición de cuádruples, habrá muchos menos.

¿Cuántos cuádruples hay? 15 personas en 4 asientos tendrían [matemática] \ frac {15!} {(15-4)!} = 15 \ cdot 14 \ cdot 13 \ cdot 12 = 32,760 [/ matemática] arreglos.

Con la regla única de cuádruples vigente, ¿cuántos arreglos de asientos hay para 5 asientos? Cualquier disposición dada de cinco personas sentadas incluye dos cuádruples: (abcd) e y a (bcde) . Por lo tanto, cada disposición de cinco representa dos de las permutaciones cuádruples. Por lo tanto, hay percepciones [matemáticas] \ frac {32,760} {2} = 16,380 [/ matemáticas] para 5 personas sentadas.

¿Qué pasa si hay seis personas sentadas? Cada combinación elimina tres cuádruples de nuestra lista, por lo que hay
[matemáticas] \ frac {32,760} {3} = 10,920 [/ matemáticas]
Permutaciones válidas para seis personas sentadas.

La fórmula parece ser:

[matemáticas] a = \ frac {\ frac {p!} {(ps)!}} {p-s + 1} [/ matemáticas]

donde [math] p [/ math] es el número de personas, [math] s [/ math] es el número de asientos en una sub-disposición única (en nuestro caso, en un cuádruple), y [math] a [ / math] es el número de arreglos de asientos completos. La fórmula se puede simplificar:

[matemáticas] a = \ frac {p!} {(ps)! (p-s + 1)} [/ matemáticas]

[matemáticas] a = \ frac {p!} {(p-s + 1)!} [/ matemáticas]

Por supuesto, [matemática] p [/ matemática] debe ser mayor que [matemática] s [/ matemática] o la ecuación no es beneficiosa porque la regla de sub-disposición / cuádruples no tendría sentido.

Así, con 15 personas y 4 asientos en cada cuádruple:

[matemáticas] a = \ frac {15!} {(15-4 + 1)!} [/ matemáticas]

[matemáticas] a = \ frac {15!} {12!} [/ matemáticas]

[matemáticas] a = 15 \ cdot 14 \ cdot 13 [/ matemáticas]

[matemáticas] a = 2,730 [/ matemáticas]

Te dije que sería mucho menos de 1.3 billones.

Esta es una figura de límite superior; Algunos de estos 2.730 conjuntos podrían no funcionar realmente. No he podido pensar en una forma de determinar el límite inferior. Vea los comentarios para más detalles.

Aquí hay un algoritmo codicioso simple: realice un seguimiento de los cuádruples prohibidos, genere permutaciones aleatorias que no los usen, y cada vez que genere una permutación, actualice la lista de cuádruples prohibidos.

Implementación de muestra en Python:

from random import shuffle def without(xlist, xelement): answer = xlist[:] answer.remove(xelement) return answer def generate_next_permutation( prefix, unused_numbers, seen_quadruples ): if unused_numbers == []: return prefix shuffle(unused_numbers) for x in unused_numbers: if tuple( prefix[-3:] + [x] ) in seen_quadruples: continue attempt = generate_next_permutation( prefix+[x], without(unused_numbers,x), seen_quadruples ) if attempt != []: return attempt return [] seen_quadruples = set() while True: P = generate_next_permutation( [], [x for x in range(15)], seen_quadruples ) if P == []: break for i in range(12): seen_quadruples.add( tuple( P[i:i+4] ) ) print(P) 

La mejor de las ~ 20 carreras que he probado generó 2388 (la peor fue 2368). Esto ya está en el mismo orden que el límite superior trivial.