Hledám způsob, jak vytvořit Hasseův diagram z dané části objednejte binární relaci. Relace bude uvedena explicitně, například: Hasse[{{1,2},{2,3},{1,3}}]
a výstupem bude odpovídající graf.
Vyhledal jsem řešení , a našel jsem nějaké řešení, ale nedostal jsem, jak jej používat .. zde je to, co jsem našel.
Pokud existuje způsob, jak vygenerovat Hasseův diagram pro podmíněnou množinu dílčího řádu a pro konečný vztah (samozřejmě mě v tomto případě zajímá pouze přibližný diagram), rád bych o tom uslyšel také.
Komentáře
- Které části kódu, na kterou jste odkazovali, jste ' nerozuměli?
- No, nerozuměl jsem ' tomu, jak to použít pro můj účel. význam, jak tedy definuji vztah explicitně (jako příklad výše). zdá se, že to umožňuje jen mě nakreslit graf pouze pro podmíněný vztah .. no mohl bych definovat vztah s podmínkou, ale není tam ' něco jednoduššího? a ještě jeden problém, trochu jsem si s tím pohrál a nemohl jsem najít způsob, jak změnit velikost písma štítků .. Chci zkopírovat graf do slova a štítky musí být čitelné, a ne tak malé.
- Pokud zadáte vztahy mezi uzly výslovně, nejde ' pouze o graf?
- I ' Je mi líto, ' m jsem v Mathematice nová. Všechno, co by vypadalo jako graf mého popisu, by bylo v pořádku. Nemusím ' z toho dělat výpočty. Mám ale hodně grafů, které jsem mohl nakreslit, a doufal jsem, že existuje speciální funkce pro mé potřeby. pokud máte jiné řešení, neváhejte a dejte mi vědět .. mějte však na paměti, že jsem ' m v Mathematice nový, takže jsem ' nejsem obeznámen se spoustou základních metod programu.
- Vítejte na Mathematica Stack Exchange RB14, brzy pošlu odpověď (dobře … po obědě :-))
Odpověď
Ve verzích 10+ můžeme sestavit TransitiveReductionGraph a RelationGraph k získání funkce Hasse diagramu s stejnými argumenty a možnostmi jako RelationGraph
:
ClearAll[hasseF] hasseF = TransitiveReductionGraph @* RelationGraph
Příklady:
hasseF[SubsetQ, Subsets[Range[4]], VertexShapeFunction -> "Name"]
substringQ[s1_, s2_] := UnsameQ[s1 , s2] && StringMatchQ[s1, ___ ~~ s2 ~~ ___] hasseF[substringQ, {"a", "b", "c","ab", "ac","abc", "abcd"}, VertexShapeFunction -> "Name"]
Odpověď
Myslím, že to, co chcete, je ve skutečnosti velmi jednoduché (poznamenal také @ SjoerdC.deVries ve svém komentáři):
Graph[{1 -> 2, 2 -> 3, 3 -> 1}, DirectedEdges -> False, GraphStyle -> "DiagramGold"]
Pokud byste naopak chtěli prozkoumat plně vybavené Hasseovy diagramy, je kód, na který jste odkazovali, dobrý začátek. Také Demonstrační projekt má několik relevantních příkladů – je je vždy dobré tam hledat.
Když se podíváte hlouběji, Mathematica zabudovaná do balíčku Combinatorica má balíček HasseDiagram
. Podívejte se na tento příklad z Dokumentace vyžaduje
<< Combinatorica` ShowGraph[HasseDiagram[MakeGraph[Subsets[4], #2 \[Intersection] #1 === #1 && #1 != #2 &]]]
Pro ještě hlubší funkce můžete kontaktovat autoři tohoto příspěvku:
„Balíček Mathematica, který zvládne částečně objednané sady“ , P. Codara
nebo si získejte tuto knihu:
Komentáře
- Pokud žadatel chce skutečný Hasseův diagram, určitě chce automatický způsob výpočtu přechodné zmenšení směrovaného grafu generovaného binárním vztahem. Myslím, že šipky by měly být nasměrovány a šipky mezi 1 a 3 by tam neměly být '.
- @JOwen Víte, proč tedy standardní reprezentace je neřízený? alturl.com/jribp
- I ' nejsem si jistý, ale myslím, že existuje směr informace na okrajích.V odkazu, který jste zveřejnili, se říká, že je třeba nakreslit " úsečku nebo křivku, která jde nahoru [kurzíva v originále] od x do y, kdykoli y pokryje x (tj. Kdykoli x < y a neexistuje z takové, že x < z < y) "