21

グラフィックを制作することになると、私は完璧に麻痺します。ビジュアルの対称性が完全に調査されていないと、何が起こっているのかを理解するのが難しくなります. 私は非常に視覚的な学習者でもあり、学んだことを単純化して紙に描くのが大好きです.

Graphviz は自動的に描画するための優れたツールですが、もっと優れている可能性があります。良いグラフの例から始めましょう。むしろステートマシンです。品質は気にしないでください (より良いツールで再描画できます)。これはほぼ完璧ですが、対称性を明確にするために反時計回りに 45 度回します。これにより、状態 q1 と q2 がどのように類似しており、どこが異なるかを理解するのにかかる時間が短縮されます。その隣に他のグラフィックスがないことを考えると、その図を表す最善の方法は 1 つしかないと私は主張します。

http://gallery.hd.org/_exhibits/maths/math-finite-state-machine-DHD.gif
(ソース: gallery.hd.org )

ここで、完全ではない描写を見てみましょう。

http://linux.softpedia.com/screenshots/Graphviz_1.png
(出典: softpedia.com )

これは、graphviz が生成するもののように見えます。はい、エッジは滑らかですが、GAAAAWWWD これは不要な混乱です! マインド マップのように見えますが、すぐに使用できる完成した図ではありません。私は、人間の目は(それ以上に)対称性を切望していると信じています。はい、階層なども重要な要素です。

これより優れたアルゴリズムが利用できないことに驚いています。まったく視覚的に学習できない人もいます。記号を読むことで抽象的な概念を把握できる。私じゃない!

それで、私の質問は何ですか?小規模から中規模のグラフを描画するための、より優れたフリー ソフトウェアはありますか? 多分

ありがとうございました!

この投稿を改善する方法を教えてください。

PS dia で同様の十分なクローンを引き出すのに 10 分かかりました。まだ完璧ではありませんが、すべてがグリッドにスナップされるため、作成するのに便利でした (また、細部をいくつか見逃していましたが、再アップロードする気はありません)。LR_0 は、ユーザーが開始状態をより早く把握できるように、上からの「開始--->」が必要です。

有限ステート マシン

4

4 に答える 4

23

グラフの描画を何度か試みた後、「最適」と思われるレイアウトを取得できなかったので、ここで質問を投げかけましたレイアウトアルゴリズムを評価するためにあなたが与えた唯一の基準は、それらが「その図を表現するための最良の方法」にどれだけ近づいているかです。もちろん、「最高」はあなたが決めることです。

これは、特定のプログラミング言語を使用して問題を解決しようとして失敗し、より良いプログラミング言語を求めることとほぼ同じです。

グラフ描画アルゴリズムの中心にあるのは、評価ソリューションを生成する最適化ルーチンです (ここでの「ソリューション」とは、レイアウトを構成する各ノードの座標を指します)。これらの解は、単一の基準または一連のランク付けされた基準の最小化 (つまり、グラフの 1 つまたは複数の属性の最小化) に従って評価されます。たとえば、交差するエッジの総数、または距離の合計です。ノード間(または両方の組み合わせ、またはこれら2つの重み付けされた組み合わせ)、または対称構成への近さ。Graphviz は、6 つの異なるレイアウト アルゴリズム (dot neato、fdp、sfdp、twopi、および circo) で構成されています。これらのうち、ドットのみを使用したようです。でも、

第二に、質問のテキストは「グラフ」とグラフ描画に向けられています。完全な説明を読んだ後、あなたの質問はどちらの概念とも関係がないと思います。

一般的なグラフ描画アルゴリズム (graphviz など) を超えて、いくつかのドメイン固有のレイアウト アルゴリズムがあります。 Erdos-Renyi (ランダム グラフ)。これらの各アルゴリズムは、ドメインによって提供される基準と制約に基づいてグラフ レイアウトを生成します。これは、すべてのドメインで単一の「最適な」レイアウトが存在しないことを示しているはずです。質問で「グラフ」という用語を使用しましたが、あなたの説明は、問題が状態マシンの描画に関連していることを示しています。これは非常に特異なタイプのグラフです。一般的なグラフ描画アルゴリズムは、ドメインについて何も知らないため、この種の特殊なグラフを描画するのが苦手なことがよくあります。実際、私は' フロー図のレイアウト アルゴリズムがないのと同じように、状態図のレイアウト アルゴリズムを認識していません (同じではありませんが、似ています)。ワークフロー的には、graphviz でグラフを描画し、それを Omnigraffle にインポートして微調整することができます。Omnigraffle では、ノードとエッジの配置をきめ細かく制御できます。

于 2010-02-18T23:49:59.533 に答える
4

一部のソフトウェアでは、マウスでノードを移動する限り、ユーザーはリアルタイムでレイアウト アルゴリズムを微調整できます。このアプローチは、より大きなグラフの場合に非常に役立ちます。

私は主にGephiを知っています (免責事項: 私は開発者です)。

于 2012-04-25T22:31:53.637 に答える
3

私が知っているいくつかのオプションがあります:

  • Prefuse - Java のバージョンが古い。最新バージョンは Flash であり、いくつかの優れたレイアウトがあります。そのプレフューズフレアと呼ばれます。デモ ページは、そのレイアウト機能の一部を示しています。
  • JUNG には、多数のレイアウト オプションと、強力なグラフ分析機能が含まれています。ここにいくつかの例があります。
  • Networkx には、多数のレイアウト機能も含まれています。それらのいくつかはここにリストされています。
于 2010-02-17T03:23:16.330 に答える
2

TikZは美しいグラフ レイアウトを生成します。最小限のヒントを指定できる手動レイアウトを使用することも、自動レイアウトを要求することもできます。デフォルトは適切で、完全に微調整するためのフックが存在します。

半手動レイアウトでは、すべての詳細を宣言する必要はありません。

  • ノードを他のノードに対して「上」、「右下」などとして宣言します。
  • ノードを行列として入力することで、ノードをラスターに配置します。いくつかの位置を空のままにしたい場合に非常に便利です。
  • エッジが入る方向、出る方向、曲がる方向、または角を取る方向を簡単に指定できます

自動レイアウト用に、TikZ のgraphdrawingライブラリにはかなり洗練されたアルゴリズムがいくつかあります。

手動レイアウトとそれを取得するために使用される TeX コードの例を次に示します。

グラフの例

\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\usepackage[latin1]{inputenc}
\begin{document}
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
                    semithick]
  \tikzstyle{every state}=[fill=red,draw=none,text=white]

  \node[initial,state] (A)                    {$q_a$};
  \node[state]         (B) [above right of=A] {$q_b$};
  \node[state]         (D) [below right of=A] {$q_d$};
  \node[state]         (C) [below right of=B] {$q_c$};
  \node[state]         (E) [below of=D]       {$q_e$};

  \path (A) edge              node {0,1,L} (B)
            edge              node {1,1,R} (C)
        (B) edge [loop above] node {1,1,L} (B)
            edge              node {0,1,L} (C)
        (C) edge              node {0,1,L} (D)
            edge [bend left]  node {1,0,R} (E)
        (D) edge [loop below] node {1,1,R} (D)
            edge              node {0,1,R} (A)
        (E) edge [bend left]  node {1,0,R} (A);
\end{tikzpicture}
\end{document}
于 2014-10-26T09:35:25.797 に答える