Kako ustvariti naključno drevo?
How Generate Random Tree
Rešitev:
Iz konjev in labirintov lahko naredite drevesa ;-)
Slike za njih najdete v dokumentaciji za SkeletonTransform in Morfološki graf .
Pravzaprav so drevesa povsod. Samovoljni izrazi imajo strukturo poljubnih dreves. Predstavljajte si, da vzamete integral:
Integrirajte [Sin [(1 - x)/(1 + x)], x] ![integral Sin [(1 - x)/(1 + x)]](//my-health-software.com/img/graphs-networks/47/how-generate-random-tree-3.png)
Tako boste dobili precej naključno drevo, če uporabite algoritem iz ta odgovor - Tukaj podajam samo zadnjo vrstico s slogi:
Graf [robovi, oznake VertexLabels -> [zaščiteno z e -pošto], ImagePadding -> {{1, 35}, {0, 10}}, GraphLayout -> 'RadialDrawing', GraphStyle -> 'ThickEdge', DirectedEdges -> False] 
Zdaj pa resneje: verjetno obstaja kar nekaj različnih načinov za to. Poleg odgovora @rm -rf omenjam še 6 drugih možnosti.
Naključno združevanje dreves
Povezovanje mest z uporabo Kruskalovega algoritma - Čiste, naključne točke pri konstrukciji ravnine
Drevesna oblika korakov vrednotenja rekurzivne funkcije - lahko da ključ do drugega pristopa
Obdelava slik - glej zgoraj
Naključni izrazi - glej zgoraj
Naključno porežite popolno drevo .
Ustvarite lahko celotno drevo z določenim številom ravni in vej. Tu je drevo s 7 ravnmi in 3 vejami:
g = CompleteKaryTree [7, 3, GraphStyle -> 'LargeNetwork', GraphLayout -> 'RadialDrawing', VertexShapeFunction -> ({PointSize [0], Point [#]} &)] 
Nato spustite nadzorovano število robov in izberite največjo priključeno komponento. Tukaj je nekaj takih naključnih vzorcev:
rg = Podgraf [g, Razvrsti [ConnectedComponents [Graf [RandomSample [ #, Round [Length [ #] .6]] &@EdgeList [g]]]], [email protected] #1> [email protected] #2 &] [[1]], GraphStyle -> 'LargeNetwork', GraphLayout -> 'RadialDrawing'] & /@ Range [12] 
Upoštevajte, da uporabljamPostavitev 'RadialDrawing' povsod, kar je dobro za velika drevesa. Seveda lahko uporabite standardno:
AdjacencyGraph [#, GraphStyle -> 'LargeNetwork', AspectRatio -> .5] & /@ (AdjacencyMatrix /@ rg) 
Kljub temu je radialni odličen za velika drevesa:
g = CompleteKaryTree [10, 4, GraphStyle -> 'LargeNetwork', GraphLayout -> 'RadialDrawing', VertexShapeFunction -> ({PointSize [0], Point [#]} &)]; Podgraf [g, Razvrsti [Povezane komponente] 1]], GraphStyle -> 'LargeNetwork', GraphLayout -> 'RadialDrawing', VertexShapeFunction -> ({PointSize [0], Point [#]} &)] 
Tu je en način, kako to narediti na podlagi primera vTreePlot. Ustvarjamo funkcijo za ustvarjanje naključnega niza robov in oblikujemo graf kot:
vtx []: = Tabela [i RandomInteger [{0, i - 1}], {i, 1, 50}]; [zaščiteno po e -pošti] [] 
Ustvari več:
Tabela [[zaščitena e -pošta] [], {12}] ~ Particija ~ 4 // Mreža 
The Kombinatorika paket ima funkcijoCodeToLabeledTree [] za ustvarjanje dreves iz njihovih ustreznih kod Prüfer. Ker je bila stara funkcija prilagojena za Kombinatorika Objekti Graph [], v nasprotju z vgrajenimiObjekti Graph [], predstavljeni v različici 8, so potrebne nekatere spremembe kode v paketu:
CodeToLabeledTree [l_List, opts___]: = Modul [{m = Razpon [Dolžina [l] + 2], x, i}, TreeGraph [Dodaj [Tabela [x = Min [Dopolnilo [m, Padec [l, i - 1]) ]]; m = komplement [m, {x}]; UndirectedEdge @@ Sort [{x, l [[i]]}], {i, Length [l]}], UndirectedEdge @@ Sort [m]], opts]] /; Dopolnilo [l, obseg [dolžina [l] + 2]] == {}Iz tega lahko ustvarite naključno drevo tako:
Z [{n = 50}, ( * število oglišč *) BlockRandom [SeedRandom [42, Metoda -> 'MersenneTwister']; ( * za ponovljivost *) CodeToLabeledTree [RandomInteger [{1, n}, n - 2], GraphLayout -> 'SpringEmbedding']]] 
( Kombinatorika funkcijoRandomTree [] je izveden na ta način.)