Ecco un metodo per provare: una ricerca iterativa utilizzando una forza repulsiva simulato.
Algoritmo
Prima inizializzare i dati impostati disponendo i cerchi attraverso la superficie in qualsiasi tipo di algoritmo. Questo è solo per l'inizializzazione, quindi non deve essere grande. Il codice periodico della tabella funzionerà bene. Inoltre, assegna a ogni cerchio una "massa" usando il suo raggio come valore di massa.
Ora avviare l'iterazione per convergere su una soluzione. Per ogni passaggio attraverso il ciclo principale, effettuare le seguenti operazioni:
Calcolare le forze repulsive per ciascun cerchio. Modella la tua forza repulsiva dopo la formula per la forza gravitazionale, con due regolazioni: (a) gli oggetti dovrebbero essere spinti di distanza l'uno dall'altro, non attratti l'uno verso l'altro, e (b) sarà necessario modificare la "forza costante" valore per adattarsi alla scala del tuo modello. A seconda della tua abilità matematica potresti essere in grado di calcolare un buon valore costante durante la pianificazione; altri saggi sperimentano un po 'all'inizio e troverai un buon valore.
Dopo aver calcolato le forze totali su ciascun cerchio (cercare il problema con il n-corpo se non si è sicuri di come farlo), spostare ciascun cerchio lungo il vettore della sua forza calcolata totale, utilizzando la lunghezza di il vettore come distanza da spostare. Questo è dove potresti scoprire che devi modificare il valore della forza costante. All'inizio vorrai movimenti con lunghezze inferiori al 5% del raggio della sfera.
I movimenti del passaggio 2 hanno spinto i cerchi fuori dalla superficie della sfera (poiché si respingono a vicenda). Ora sposta ciascun cerchio verso la superficie della sfera, nella direzione verso il centro della sfera.
Per ciascun cerchio, calcolare la distanza dalla vecchia posizione del cerchio alla sua nuova posizione. La maggiore distanza spostata è la lunghezza del movimento per questa iterazione nel ciclo principale.
Continua a scorrere per un istante attraverso il loop principale. Nel tempo la lunghezza del movimento dovrebbe diventare sempre più piccola man mano che le posizioni relative dei cerchi si stabilizzano in una disposizione che soddisfa i tuoi criteri. Esci dal ciclo quando la legth del movimento scende sotto un valore molto piccolo.
Ottimizzare
si potrebbe scoprire che è necessario modificare il calcolo forza per ottenere l'algoritmo di convergere su una soluzione. Il modo in cui modifichi dipende dal tipo di risultato che stai cercando. Inizia a modificare la forza costante. Se ciò non funziona, potrebbe essere necessario modificare i valori di massa in alto o in basso. O forse cambia l'esponente del raggio nel calcolo della forza. Per esempio, invece di questo:
f = (k * m[i] * m[j])/(r * r);
si potrebbe provare questo:
f = (k * m[i] * m[j])/pow(r, p);
Quindi è possibile sperimentare con diversi valori di p.
È anche possibile sperimentare diversi algoritmi per la distribuzione iniziale.
La quantità di tentativi ed errori dipende dagli obiettivi di progettazione.
fonte
2014-12-15 16:26:50
Cosa stai cercando di ottimizzare? IE: la sfera più piccola per adattarsi a tutti i cerchi o massimizzare il numero di cerchi per adattarsi a una sfera di dimensioni specifiche o cosa? In relazione a questa domanda, cosa intendi con "distribuire equamente"? – Nuclearman
dai un'occhiata alla fonte di questa pagina - potrebbe darti un'idea o due; http://www.engineeringtoolbox.com/smaller-circles-in-larger-circle-d_1849.html – mike510a