Neuer Automaten Generator

Benutzeravatar
davidvajda.de
Site Admin
Beiträge: 1424
Registriert: Di Jul 18, 2023 8:36 pm
Wohnort: D-72072, Tübingen
Kontaktdaten:

Re: Neuer Automaten Generator

Beitrag von davidvajda.de »

So, ich werde den Automaten jetzt verbessern. Anstatt zwei Eingabevariablen, verwende ich eine. Das lässt sich einfach erreichen. Indem man die zwei anderen Zeilen weglässt und die Ausgabe auf 0 und 1 begrenzt.

Dann bleibt das Problem unerreichbarer Zustände. Damit das nicht passiert, kann man für jeden Folgezustand einen Zähler einrichten. Am Ende müssen alle mindestens 1 sein. Damit jeder Zustand ein Mal erreicht wird.

Das müssen wir aber gar nicht fällt mir auf. Schlimm sind keine Zustände oder Knoten oder Ecken, die nicht erreicht werden. Schlimm sind verweiste Zustände. Ein Verweister Zustand ist ein Zustand, auf den weder andere verweisen, noch dass dieser auf andere verweist. Das kann allerdings dann eintreten, wenn für beide Eingaben der Folgezustand er selber ist. Und kein anderer Knoten auf diesen Zustand verweist.


Hier ist das besagt, unerwünschte gleich mal eingetreten
Bild
https://davidvajda.de/david4/2024-01-24/test4.pdf
https://davidvajda.de/david4/2024-01-24/test4.text

Hier dafür um so besser
Bild
https://davidvajda.de/david4/2024-01-24/test5.pdf
https://davidvajda.de/david4/2024-01-24/test5.tex

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define EMPTY_Z -1
#define UNINIT_Z -2

int main (void) {
    time_t t;
    int i, j;
    int z [4][4];
    int v;
    int k, l;
    int n;

    srand ((unsigned)time (&t));

    for (i = 0;  i < 4;  i++) {
        for (j = 0;  j < 4;  j++)
            z [i][j] = j;
    }

    for (n = rand () % 100; n >= 0;  n--) {
        for (i = 0;  i < 4;  i++) {
            if ((rand () % 2) == 0) {
                for (k = 0;  k < 4;  k++) {
                    for (l = k + 1;  l < 4;  l++) {
                        if (z[i][l] > z[i][k]) {
                            t = z [i][l];
                            z [i][l] = z[i][k];
                            z [i][k] = t;
                        }
                    }
                }
            }
            else {
                for (k = 0;  k < 4;  k++) {
                    for (l = k + 1;  l < 4;  l++) {
                        if (z[i][l] < z[i][k]) {
                            t = z [i][l];
                            z [i][l] = z[i][k];
                            z [i][k] = t;
                        }
                    }
                }
            }
        }
        for (j = 0;  j < 4;  j++) {
            if ((rand () % 2) == 0) {
                for (k = 0;  k < 4;  k++) {
                    for (l = k + 1;  l < 4;  l++) {
                        if (z[l][j] > z[k][j]) {
                            t = z [l][j];
                            z [l][j] = z[k][j];
                            z [k][j] = t;
                        }
                    }
                }
            }
            else {
                for (k = 0;  k < 4;  k++) {
                    for (l = k + 1;  l < 4;  l++) {
                        if (z[l][j] < z[k][j]) {
                            t = z [l][j];
                            z [l][j] = z[k][j];
                            z [k][j] = t;
                        }
                    }
                }
            }
        }
    }

/*
    for (i = 0;  i < 4;  i++) {
        for (j = 0;  j < 4;  j++)
            printf ("%i ", z[i][j]);
        printf ("\n");
    }

    printf ("Zustand\tEingabe\tAusgabe\tFolgezustand\n");
    for (i = 0;  i < 4;  i++) {
        for (j = 0;  j < 4;  j++)
            printf ("%i\t\t%i\t\t%i\t\t%i\n", i, j, rand () % 4, z[i][j]);
    }*/



printf("\\documentclass{article}\n");
printf("\\usepackage[utf8]{inputenc}\n");
printf("\\usepackage{pgf, tikz}\n");
printf("\\usetikzlibrary{arrows , automata , positioning}\n");
printf("\\begin{document}\n\n");


printf("\\begin{center}\n");
printf("\\begin{tikzpicture}[>=stealth',shorten >=1pt,auto,node distance=2.5cm]\n");
printf("\%Knoten\n");
printf("\\node (0) [state, thick] {0};\n");
printf("\\node (1) [state, thick, right of= 0] {1};\n");
printf("\\node (2) [state, thick, right of= 1] {2};\n");
printf("\\node (3) [state, thick, below of= 1] {3};\n\n");

printf("\%Verbindungen\n");
printf("\\path[thick,->]\n");


for (i = 0;  i < 4;  i++) {
        j = 0;
        if (z [i][j] == i)
            printf ("(%i) edge [loop above] node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);
        else
            printf ("(%i) edge node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);
        j = 1;
        if (z [i][j] == i)
            printf ("(%i) edge [loop] node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);
        else
            printf ("(%i) edge [bend angle=15, bend left,below] node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);
        /*j = 2;
        if (z [i][j] == i)
            printf ("(%i) edge [loop] node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);
        else
            printf ("(%i) edge [bend angle=15, bend right,below] node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);
        j = 3;
        if (z [i][j] == i)
            printf ("(%i) edge [loop] node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);
        else
            printf ("(%i) edge [bend angle=15, bend left,above] node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);*/
}
/*
printf("(1) edge node {1/0} (2)\n");
printf("(1) edge [bend angle=15, bend left] node {0/0} (4)\n\n");

printf("(2) edge [bend angle=15, bend left,pos=0.4] node {0/0}(3)\n");
printf("(2) edge node {1/0} (4)\n\n");

printf("(3) edge [bend angle=15, bend left,below] node {0/0} (2)\n");
printf("(3) edge [bend angle=35, bend right, above] node {1/0} (1)\n\n");

printf("(4) edge [right] node {1/0} (3)\n");
printf("(4) edge [bend angle=15, bend left] node {0/0} (1)\n");*/
printf(";\n");
printf("\\end{tikzpicture}\n");
printf("\\end{center}\n");
printf("\\end{document}\n");


return 0;
}
Antworten