Se una soluzione approssimativa è corretta, è possibile provare un semplice algoritmo di ottimizzazione. Ecco un esempio, in Python
import random
def opt(*points):
best, dist = (0, 0), 99999999
for i in range(10000):
new = best[0] + random.gauss(0, .5), best[1] + random.gauss(0, .5)
dist_new = max(abs(new[0] - qx) + abs(new[1] - qy) for qx, qy in points)
if dist_new < dist:
best, dist = new, dist_new
print new, dist_new
return best, dist
Spiegazione: Si comincia con il punto (0, 0), o in qualsiasi altro punto casuale, e modificarlo qualche migliaio di volte, ogni volta mantenendo il meglio del nuovo e la in precedenza il punto migliore. A poco a poco, questo approssimerà l'optimum.
Nota che semplicemente prendendo la media o la mediana dei tre punti, o risolvendo per x ed y funziona indipendentemente non lavoro quando minimizzi il massima distanza di Manhattan. Counter-example: considera i punti (0,0), (0,20) e (10,10), o (0,0), (0,1) e (0,100). Se prendiamo la media dei punti più separati, questo darebbe (10,5) per il primo esempio, e se prendiamo la mediana questo sarebbe (0,1) per il secondo esempio, che hanno entrambi un massimo massimo distanza manhattan rispetto all'ottimo.
Aggiornamento: Sembra risolvendo per x e y in modo indipendente e prendendo la media dei punti più distanti fa nel lavoro fatto, a condizione che si fa un po 'di pre- e post-elaborazione, come sottolineato da thiton.
Alcuni punti non andranno persi, poiché la rotazione di 45 gradi produce un numero piuttosto elevato di numeri non interi? – nhahtdh
Quindi è solo (1) ruotare di 45 ° e (2) _quindi_ prendere la media dei punti più distanti, separatamente per xey y e (3) tornare indietro? Ancora non riesco a credere che sia così semplice, ma non riesca a trovare un difetto ... +1 –
@nhahtdh: Non farlo in aritmetica intera. Se si desidera ottenere un risultato intero, arrotondare il risultato. – thiton