Cerchi di imballaggio


21

Dai un'occhiata a questa immagine. In particolare, come sono disposti i fori alle estremità.

inserisci qui la descrizione dell'immagine

( Fonte immagine )

Notare come i tubi in questa immagine sono imballati in un modello esagonale. È noto che in 2D un reticolo esagonale è il più denso impaccamento di cerchi. In questa sfida, ci concentreremo sulla riduzione al minimo del perimetro di un impacco di cerchi. Un modo utile per visualizzare il perimetro è immaginare di mettere un elastico attorno alla collezione di cerchi.

L'obiettivo

Dato un numero intero positivo ncome input, mostra una raccolta di ncerchi pieni il più strettamente possibile.

Regole e chiarimenti

  • Supponiamo che i cerchi abbiano un diametro di 1 unità.
  • La variabile da minimizzare è la lunghezza del perimetro, che è definito come lo scafo convesso dei centri dei cerchi nel gruppo. Dai un'occhiata a questa immagine:

inserisci qui la descrizione dell'immagine

I tre cerchi in linea retta hanno un perimetro di 4 (lo scafo convesso è un rettangolo 2x0 e il 2 è contato due volte), quelli disposti in un angolo di 120 gradi hanno un perimetro di circa 3,85 e il triangolo ha un perimetro di sole 3 unità. Nota che sto ignorando le unità pi aggiuntive che il perimetro reale sarebbe perché sto solo guardando i centri dei cerchi, non i loro bordi.

  • Ci possono essere (e quasi sicuramente ci saranno) più soluzioni per ogni dato n. È possibile produrre uno di questi a propria discrezione. L'orientamento non ha importanza.
  • I cerchi devono essere su un reticolo esagonale.
  • I cerchi devono avere un diametro di almeno 10 pixel e possono essere riempiti o meno.
  • È possibile scrivere un programma o una funzione.
  • L'input può essere preso tramite STDIN, come argomento di funzione o equivalente più vicino.
  • L'output può essere visualizzato o output in un file.

Esempi

Di seguito ho esempi di output validi e non validi per n da 1 a 10 (esempi validi solo per i primi cinque). Gli esempi validi sono a sinistra; ogni esempio a destra ha un perimetro maggiore del corrispondente esempio valido.

inserisci qui la descrizione dell'immagine

Mille grazie a steveverrill per l'aiuto nella stesura di questa sfida. Imballaggio felice!


3
In attesa di Hexagony, sto scommettendo. ; D
Addison Crump,

@VotoToClose: Non penso che Hexagony abbia un output grafico, ma MAN, sarebbe fantastico!
El'endia Starman,

@ El'endiaStarman Beh, si potrebbe scrivere uno SVG sullo standard output, ma non credo che ho intenzione di ...: P
Martin Ender

1
Wow, nessuno mi ha mai ringraziato in grassetto per i miei commenti nella sandbox prima. Sto arrossendo MrGreen Certo che ho commentato perché mi è piaciuta la sfida, anche se non sono sicuro che avrò tempo per rispondere.
Level River St,

Secondo la mia discussione con Reto Koradi sulla risposta di user81655, penso che il più grande esagono che vedremo con spigoli vivi sia di 7 ° (8 cerchi). Questo è N = 169 cerchi in totale. Potresti considerare di limitare il problema a quel numero, il che darebbe maggiori possibilità di ottenere una risposta corretta (al momento non ce ne sono) e di poter verificare. D'altra parte, potrebbe essere più interessante lasciare aperto il problema all'arbitrario N.
Level River St

Risposte:


4

Mathematica 295 950 byte

Nota: questa versione ancora da golf risolve i problemi sollevati da Steve Merrill in merito ai miei precedenti tentativi.

Sebbene sia un miglioramento rispetto alla prima versione, non troverà la configurazione della maniglia più densa in cui si cercherebbe una forma complessiva circolare, piuttosto che esagonale.

Trova soluzioni costruendo un esagono interno completo (per n> = 6, quindi esamina tutte le configurazioni per completare il guscio esterno con i cerchi rimanenti.

È interessante notare che, come osservato da Steve Merrill nei commenti, la soluzione per n+1cerchi non sempre consiste nella soluzione per n cerchi con un altro cerchio aggiunto. Confronta la soluzione data per 30 cerchi con la soluzione data per 31 cerchi. (Nota: esiste una soluzione unica per 30 cerchi.)

m[pts_]:={Show[ConvexHullMesh[pts],Graphics[{Point/@pts,Circle[#,1/2]&/@ pts}], 
ImageSize->Tiny,PlotLabel->qRow[{Length[pts],"  circles"}]],
RegionMeasure[RegionBoundary[ConvexHullMesh[pts]]]};
nPoints = ((#+1)^3-#^3)&;pointsAtLevelJ[0] = {{0,0}};
pointsAtLevelJ[j_]:=RotateLeft@DeleteDuplicates@Flatten[Subdivide[#1, #2, j] &@@@
Partition[Append[(w=Table[j{Cos[k Pi/3],Sin[k Pi/3]},{k,0,5}]), 
w[[1]]], 2, 1], 1];nPointsAtLevelJ[j_] := Length[pointsAtLevelJ[j]]
getNPoints[n_] := Module[{level = 0, pts = {}},While[nPoints[level]<=n, 
pts=Join[pointsAtLevelJ[level],pts];level++];Join[Take[pointsAtLevelJ[level],n-Length[pts]],
pts]];ns={1,7,19,37,61,91};getLevel[n_]:=Position[Union@Append[ns,n],n][[1, 1]]-1;
getBaseN[n_] := ns[[getLevel[n]]];pack[1]=Graphics[{Point[{0,0}], Circle[{0, 0}, 1/2]}, 
ImageSize->Tiny];pack[n_]:=Quiet@Module[{base = getNPoints[getBaseN[n]], 
outerRing = pointsAtLevelJ[getLevel[n]], ss},ss=Subsets[outerRing,{n-getBaseN[n]}];
SortBy[m[Join[base,#]]&/@ss,Last][[1]]]

Alcuni dei controlli hanno comportato confronti di oltre centomila casi per un singolo valore di n (comprese le simmetrie). Sono stati necessari circa 5 minuti per eseguire i 34 casi di test totali. Inutile dire che con un n'sapproccio più ampio questo approccio alla forza bruta si rivelerebbe presto poco pratico. Esistono sicuramente approcci più efficienti.

I numeri a destra di ogni imballo sono i perimetri dei rispettivi scafi convessi blu. Di seguito è riportato l'output di 3 < n < 35. I cerchi rossi sono quelli aggiunti attorno a un esagono regolare.

dischi



1
Come ho detto nella risposta dell'utente 81655, il singolo cerchio sporgente su 22 (e 17, 25, 28, 31, 34) sarebbe meglio posizionato al centro della fila di cerchi su cui si trova.
Level River St,

Lo pensavo anche io, ma poi ho notato che 9, che ha anche un cerchio sporgente, era considerato corretto. Quando avrò del tempo, confronterò le misure degli scafi convessi (dei centri).
DavidC,

in 9 il cerchio sporgente è 1/4 o 3/4 lungo la fila piatta, quindi non fa alcuna differenza. in 17, 22, 25, 28, 31 il cerchio sporgente è lungo 1/6, 3/6 o 5/6, quindi la posizione centrale è migliore (pensa a tirare una corda lateralmente: è più facile tirare dal centro perché quello il modo in cui la stringa ha meno estensione da fare. In 34 (e 35) abbiamo 1/8, 3/8, 5/8 e 7/8 lungo il lato piatto. Quindi per questi dovremmo scegliere 3/8 e 5/8 prima del 1/8 e 7/8.
Level River St

Hai assolutamente ragione e questo è confermato dalle misurazioni.
DavidC,

Questo e spettacolare! La transizione 30-> 31 mostra che non possiamo semplicemente prendere la forma precedente e aggiungere un cerchio all'esterno (che avrebbe dato un perimetro di 16.464.) C'è anche almeno un caso in cui avresti potuto semplicemente aggiungere un cerchio a l'esterno, ma ha scelto una disposizione diversa: 12-> 13
Level River St
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.