Este problema surgió en un contexto diferente, en el trabajo, pero me lo han traducido a la pizza.
Suponga que tiene una pizza circular de radio $R$. Sobre este disco, $n$ pepperoni serán distribuidos completamente al azar. Todos pepperoni tienen el mismo radio $r$.
Una de pepperoni es "libre" si no se sobrepone a cualquier otro de pepperoni.
Usted es libre de elegir $n$.
Supongamos que usted elija un pequeño $n$. La posibilidad de que cualquier pepperoni es gratis son muy grandes. Pero $n$ es pequeño, por lo que el número total de pepperoni es pequeño. Supongamos que usted elija de una gran $n$. La posibilidad de que cualquier pepperoni es gratis son pequeños. Pero hay un montón de ellos.
Claramente, para un determinado $R$ y $r$, hay algunos óptima $$ n que maximiza el número esperado de libre pepperoni. Cómo encontrar esta óptima?
Edit: al recoger la respuesta
Así que parece que leonbloy la respuesta que da la mejor aproximación en los casos que yo he mirado:
r/R n* by simulation n_free (sim) (R/2r)^2
0.1581 12 4.5 10
0.1 29 10.4 25
0.01 2550 929.7 2500
(Sólo hay un par de cientos de ensayos en el r=0.01 sim, por lo que 2550 podría no ser super preciso.) Así que me voy a recoger por la respuesta. Me gustaría agradecer a todos por sus aportes, esta ha sido una gran experiencia de aprendizaje.
Aquí están algunas fotos de una simulación para r/R = 0.1581, n=12:
Editar después de tres respuestas publicadas:
Escribí un poco de simulación. Voy a pegar el código de abajo, de modo que se puede comprobar (edito: se ha solucionado correctamente los puntos de recogida al azar en una unidad de disco). He mirado en dos de tres casos hasta el momento. Primer caso, r = 0.1581, R = 1, es decir p = 0,1 por mzp la notación. En estos parámetros conseguí n* = 12 (libre de pepperoni = 4.52). Arthur expresión no parece ser maximizada aquí. leonbloy la respuesta que daría 10. También hice r = 0.1, R = 1. Tengo n* = 29 (libre de pepperoni = 10.38) en este caso. Arthur expresión no fue maximizada aquí y leonbloy la respuesta que daría a 25. Finalmente, para r = 0.01 puedo obtener aproximadamente n*=2400, como se muestra aquí:
Aquí está mi (feo) de código, ahora editado correctamente de selección aleatoria de puntos en un disco:
from __future__ import division
import numpy as np
# the radius of the pizza is fixed at 1
r = 0.1 # the radius of the pepperoni
n_to_try = [1,5,10,20,25,27,28,29,30,31,32,33,35] # the number of pepperoni
trials = 10000# the number of trials (each trial randomly places n pepperoni)
def one_trial():
# place the pepperoni
pepperoni_coords = []
for i in range(n):
theta = np.random.rand()*np.pi*2 # a number between 0 and 2*pi
a = np.random.rand() # a number between 0 and 1
coord_x = np.sqrt(a) * np.cos(theta) # see http://mathworld.wolfram.com/DiskPointPicking.html
coord_y = np.sqrt(a) * np.sin(theta)
pepperoni_coords.append((coord_x, coord_y))
# how many pepperoni are free?
num_free_pepperoni = 0
for i in range(n): # for each pepperoni
pepperoni_coords_copy = pepperoni_coords[:] # copy the list so the orig is not changed
this_pepperoni = pepperoni_coords_copy.pop(i)
coord_x_1 = this_pepperoni[0]
coord_y_1 = this_pepperoni[1]
this_pepperoni_free = True
for pep in pepperoni_coords_copy: # check it against every other pepperoni
coord_x_2 = pep[0]
coord_y_2 = pep[1]
distance = np.sqrt((coord_x_1 - coord_x_2)**2 + (coord_y_1 - coord_y_2)**2)
if distance < 2*r:
this_pepperoni_free = False
break
if this_pepperoni_free:
num_free_pepperoni += 1
return num_free_pepperoni
for n in n_to_try:
results = []
for i in range(trials):
results.append(one_trial())
x = np.average(results)
print "For pizza radius 1, pepperoni radius", r, ", and number of pepperoni", n, ":"
print "Over", trials, "trials, the average number of free pepperoni was", x
print "Arthur's quantity:", x* ((((1-r)/1)**(x-1) - (r/1)) / ((1-r) / 1))