سؤال

لدي شلل الكمال عندما يتعلق الأمر بإنتاج شيء ما. إذا لم يتم استكشاف التماثلات المرئية بالكامل ، فأنا أواجه صعوبة في فهم ما يجري. أنا متعلم بصري للغاية ، وأحب تبسيط الأشياء التي تعلمتها للتو ورسمها على الورق.

GraphViz هي أداة رائعة لرسم شيء تلقائيًا ، ولكن قد يكون ذلك أفضل. لنبدأ بمثال على رسم بياني جيد) آلة الحالة بدلاً من ذلك). لا تهتم بالجودة (يمكن إعادة رسمها باستخدام أداة أفضل) هذا الصدد مثالي تقريبًا ، باستثناء أنني سأحولها في اتجاه عقارب الساعة 45 درجة لجعل التماثل واضحًا. يجب أن يستغرق القارئ وقتًا أقل لمعرفة كيف تتشابه الدول Q1 و Q2 وكيف تختلف. أنا أزعم أن هناك أفضل طريقة واحدة لتمثيل هذا الرسم التخطيطي ، بالنظر إلى أنه لا توجد أجزاء أخرى من الرسومات بجانبها.

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 هذا أمر غير ضروري! يبدو وكأنه خريطة ذهنية ، وليس مخططًا نهائيًا جاهزًا للاستهلاك. أعتقد أن العيون البشرية تتناغم (لا تقل). نعم ، التسلسل الهرمي ، وما إلى ذلك هي أيضًا عوامل مهمة.

أنا مندهش من أنه لا توجد خوارزميات أفضل. بعض الناس ليسوا متعلمين بصريين على الإطلاق ؛ يمكنهم فهم المفاهيم التجريدية من خلال قراءة الرموز. ليس انا!

إذن ، ما هو سؤالي؟ حسنًا ، هل هناك برامج مجانية أفضل متاحة لرسم الرسوم البيانية الصغيرة إلى المتوسطة؟ ربما

شكرًا لك!

اسمحوا لي أن أعرف كيف يمكنني تحسين هذا المنشور.

ملاحظة: لقد استغرقت 10 دقائق لاستخلاص استنساخ مماثل في ديا. لا يزال الأمر غير مثالي ، لكنه كان مناسبًا لأن كل شيء يستقر على الشبكة (وقد فاتني بعض التفاصيل الصغيرة ولكن لا أشعر بأنني أعيد التحميل). يحتاج LR_0 إلى "بدء --->" قادم من الأعلى للسماح للمستخدم بفهم حالة البداية عاجلاً.

Finate State Machine

هل كانت مفيدة؟

المحلول

بعد عدة محاولات لرسم الرسم البياني الخاص بك والفشل في الحصول على تخطيط تعتبره "أفضل" ، طرحت السؤال هنا: هل هناك [B] برنامج خالٍ من البرامج [ل] رسم الرسوم البيانية الصغيرة إلى المتوسطة." المعيار الوحيد الذي قدمته لتقييم خوارزميات التخطيط هو مدى وصولهم إلى "أفضل طريقة لتمثيل هذا الرسم البياني". "الأفضل" بالطبع ، ترك لك أن تقرر.

هذا هو نفس أو أقل من محاولة حل مشكلة باستخدام لغة برمجة معينة ، وفشل ، ثم طلب لغة برمجة أفضل.

في قلب خوارزميات رسم الرسم البياني ، توجد إجراءات التحسين التي تولد حلول التقييم ("الحل" هنا يشير إلى الإحداثيات لكل عقدة تشتمل معًا على تخطيط). يتم تقييم هذه الحلول وفقًا لتقليل معيار واحد أو سلسلة من المعايير المصنفة-IN ، إلى الحد الأدنى من السمة أو أكثر من السمة من الرسم البياني-على سبيل المثال ، أو إجمالي عدد الحواف التي تعبر ، أو مجموع المسافات بين العقد (أو مزيج من كليهما ، أو مزيج مرجح من هذين) ، أو التقارب من التكوين المتماثل. يتكون GraphViz من ستة خوارزميات تخطيط مختلفة (DOT Neato و FDP و SFDP و TWOPI و Circo). من هؤلاء ، يبدو أنك استخدمت نقطة فقط ؛ ومع ذلك ، ربما يكون Twopi و Circo خيارات أفضل نظرًا لقيود التماثل الصارمة التي يبدو أنها تتطابق مع فكرتك الخاصة برسم بياني مرسومة بشكل صحيح.

ثانياً ، يتم توجيه نص سؤالك إلى "الرسوم البيانية" وتراجع الرسم البياني ، بعد قراءة وصفك الكامل ، لا أعتقد أن سؤالك له علاقة بأي من المفاهيم.

إلى جانب خوارزميات رسم الرسم البياني العام (مثل GraphViz) ، هناك عدد من خوارزميات التخطيط الخاصة بالمجال ، على سبيل المثال ، مخططات Hass (لتمثيل مجموعات مرتبة جزئيًا في نظرية الطلب) ، ورسومات Barabasi-Albert (شبكات خالية من المقياس) ، و erdos-renyi (الرسوم البيانية العشوائية). تنتج كل من هذه الخوارزميات تخطيط رسم بياني يعتمد على المعايير والقيود التي يوفرها المجال-يجب أن يشير لك إلى أنه لا يوجد تصميم "أفضل" واحد في جميع المجالات. على الرغم من أنك استخدمت مصطلح "الرسم البياني" في سؤالك ، إلا أن وصفك يشير إلى أن مشكلتك تتعلق برسم آلات الحالة-نوعًا من الرسم البياني المميز. غالبًا ما تكون خوارزميات رسم الرسم البياني العام ضعيفة في رسم الرسوم البيانية المتخصصة من هذا النوع لأن الخوارزمية لا تعرف شيئًا عن المجال. في الواقع ، لست على دراية بأي خوارزمية تخطيط لمخططات الحالة-تمامًا كما لا يوجد واحد لمخططات التدفق (ليس نفس الشيء ، ولكن مماثل). من ناحية سير العمل ، يمكنك رسم الرسم البياني في GraphViz ثم استيراده إلى Omnigraffle لتوليفه الدقيق-في Omnigraffle ، سيكون لديك تحكم دقيق في المواضع في العقدة والحافة.

نصائح أخرى

هناك عدد من الخيارات التي أعرفها:

  • prefuse - لديهم إصدار جافا الأقدم. أحدث إصدار في فلاش ولديه بعض التخطيطات الرائعة. تسمى مسبق التوهج. ال الصفحة التجريبية يوضح بعض قدراتها على التصميم.
  • يتضمن Jung عددًا من خيارات التخطيط ، بالإضافة إلى وظائف تحليل الرسم البياني القوية. هناك بعض الأمثلة هنا.
  • تتضمن NetworkX أيضًا العديد من إمكانيات التصميم. بعضها مدرج هنا.

تتيح بعض البرامج للمستخدمين تبديل خوارزميات التخطيط في الوقت الفعلي ، طالما أن نقل العقد مع الماوس. قد يساعدك هذا النهج بشكل كبير على الرسوم البيانية الأكبر.

أنا أعرف في الغالب جفي (Disclamer: أنا ديف).

تيك يولد تخطيطات الرسم البياني الجميل. يمكنك استخدام تخطيط يدوي يتيح لك تحديد الحد الأدنى من التلميحات ، أو يمكنك طلب تخطيط تلقائي. الإعدادات الافتراضية جيدة ، والخطافات موجودة لتعديل إلى الكمال.

مع التخطيط شبه اليدوي ، لا يتعين عليك إعلان كل التفاصيل ، لأنك تستطيع

  • إعلان العقد على أنها "أعلى من" ، "أسفل يمين" ، وما إلى ذلك بالنسبة للعقد الأخرى.
  • ضع العقد الخاصة بك على نقطية من خلال إدخالها كمصفوفة: مريحة للغاية إذا كنت تريد ترك بعض المواقف فارغة.
  • حدد بسهولة في الاتجاه الذي يجب أن تدخله حواف أو تركه أو ينحنيه أو أخذ زوايا

للتخطيط التلقائي ، Tikz's graphdrawing المكتبة لديها بعض خوارزميات بقعة جميلة.

فيما يلي مثال على التصميم اليدوي ورمز TEX المستخدم للحصول عليه:

example graph

\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}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top