Optimización de la tabla de estados de una máquina completamente especificada

Optimice la tabla de estado de una tabla de estado dada de una máquina completamente especificada utilizando un algoritmo basado en partición.

Ejemplos: 

Input : 
6
E 0 D 1
F 0 D 0
E 0 B 1
F 0 B 0
C 0 F 1
B 0 C 0

Output :
A    E, 0    D, 1
B    F, 0    D, 0
C    E, 0    B, 1
D    F, 0    B, 0
E    C, 0    F, 1
F    B, 0    C, 0
P1=(ACE) (BDF) 
P2=(ACE) (BD) (F) 
P3=(AC) (BD) (E) (F) 
S1=(AC) S2=(BD) S3=(E) S4=(F) 
S1    S3, 0    S2, 1
S2    S4, 0    S2, 0
S3    S1, 0    S4, 1
S4    S2, 0    S1, 0 

Enfoque utilizado: 

Para máquina de estado completamente especificada Máquina de estado completamente especificada: 

  1. Dos estados son equivalentes si las salidas son idénticas para todas las combinaciones de entrada Los siguientes estados son equivalentes para todas las combinaciones de entrada.
  2. La equivalencia de estados es una relación de equivalencia que divide los estados en clases de equivalencia disjuntas.

Máquina M1:

PD NS, Z (x=0) NS, Z (x=1)
A mi, 0 D, 0
B F, 0 D, 0
C mi, 0 segundo, 1
D F, 0 segundo, 0
mi C, 0 F, 1
F segundo, 0 C, 0
  • Paso 1 (minimización de estado): identificar y eliminar estados redundantes 
     
  • Paso 2 (Asignación de estado): asigne un código binario único a cada estado 
     
  • Paso 3 (optimización de lógica combinacional): use códigos de estado no asignados como si no les importara. 
    • P0={(ABCDEF)}: 
      Inicialmente agregamos todos los estados en una partición.
    • P1={(ACE), (BDF)}: 
      B, D, F tiene otra respuesta de entrada-salida que otros estados.
    • P2={(ACE), (BD), (F)}: 
      según la salida del siguiente estado, F tiene otra respuesta de entrada-salida que otros estados del bloque de partición anterior (BDF).
    • P3={(AC), (BD), (E), (F)}: 
      Según la salida del siguiente estado, E tiene otra respuesta de entrada-salida que otros estados del bloque de partición anterior (ACE).
    • P4={(AC), (BD), (E), (F)} : 
      igual que P3, se encontró una partición equivalente.
    • Partición equivalente: 
      P3, aquí, P3 y P4 son iguales, por lo tanto, consideramos P3 como partición equivalente.
    • Nuevos Estados: 
      S1=(AC), S2=(BD), S3=(E), S4=(F)

Aquí, los estados A, C se pueden combinar en un estado y los estados B, D se pueden combinar en otro estado. Consideramos S1, S2, S3, S4 como estados de la nueva tabla de estados optimistas.

Entonces, el número de estados se redujo a 4.

A continuación se muestra la implementación del enfoque:

C

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
typedef struct table { 
    int state; 
    int output; 
} table; 
int main() 
{ 
    char present_state, temp; 
    int ps, temp2; 
  
    // hash array 
    int hash; 
  
    // Input number of states 
    scanf("%d", &ps); 
  
    // make a table for input of next-state(NS) and output(Z) 
    table arr[2]; 
    for (int i = 0; i < ps; i++) { 
        char present_state = 'A' + i; 
  
        // next-state(NS) and output(Z) for x=0 
        scanf("%*c%c%d", &temp, &arr[i][0].output); 
  
        // generate present state(PS) 
        arr[i][0].state = (int)temp - 65; 
  
        // next-state(NS) and output(Z) for x=1 
        scanf("%*c%c%d", &temp, &arr[i][1].output); 
  
        // generate present state(PS) 
        arr[i][1].state = (int)temp - 65; 
    } 
    for (int j = 0; j < ps; j++) { 
        char present_state = 'A' + j; 
        // print the given state table 
        printf("%c %c, %d %c, %d\n", present_state, (char)(arr[j][0].state + 65), arr[j][0].output, 
                                                        (char)(arr[j][1].state + 65), arr[j][1].output); 
    } 
    int prev_result; 
    int new_result; 
    for (int i = 0; i < ps; i++) { 
        // divide P0(first partition P0=ABCDEF) according to their output in x=0, 1 
        // for x=0, x=1 whose output are same, are contained in same partition block 
        // for the example machine M1, P1 will be generated 
        // like { (ACE), (BDF) } and stored in prev_result 
        prev_result[i] = (2 * arr[i][0].output + arr[i][1].output); 
    } 
    // -------------------------------------------------------- 
  
    // run this function for generate n-tn Partition(Pn) 
    for (int j = 0; j < 100; j++) { 
        for (int i = 0; i < ps; i++) 
  
            // Load previous result in new result 
            new_result[i] = prev_result[i]; 
        for (int i = 0; i < ps; i++) 
            hash[i] = 0; 
  
        // ************ Update New Result **************** 
  
        int op = 100; 
  
        // print n-th partition (Pn) 
        printf("P%d=", j + 1); 
        for (int i = 0; i < ps; i++) { 
  
            // if i-th PS is not visited 
            if (hash[i] == 0) { 
  
                // make i-th PS visited 
                hash[i] = 1; 
                printf("("); 
                for (int j = i; j < ps; j++) { 
                    if (prev_result[i] == prev_result[j]) { 
  
                        // print n-th partition (Pn) 
                        printf("%c", j + 65); 
  
                        // increase i-th new-result 
                        new_result[j] = new_result[j] * op; 
  
                        // update new result according to next state 
                        new_result[j] += (prev_result[arr[j][0].state] * 2 + prev_result[arr[j][1].state]); 
                        hash[j] = 1; // make j-th PS visited 
                    } 
                } 
                printf(") "); 
                op += 100; 
            } 
        } 
        printf("\n"); 
  
        // Check New and Previous Result according to difference of e, If same 
  
        int flag = -1; 
        for (int x = 0; x < ps - 1; x++) { 
            for (int y = x + 1; y < ps; y++) { 
                if (prev_result[x] == prev_result[y]) { 
  
                    // compare difference of x-th and y-th result(new and prev) 
                    if (new_result[x] != new_result[y]) { 
  
                        // if difference is not same and break 
                        flag = 0; 
                        break; 
                    } 
                } 
            } 
            if (flag == 0) 
                break; 
        } 
  
        // ******************** Update Previous Result with new result ********************** 
  
        int ij = 1; 
        for (int i = 0; i < ps; i++) { 
            hash[i] = 0; 
        } 
        for (int i = 0; i < ps; i++) { 
  
            // if i-th PS is not visited 
            if (hash[i] == 0) { 
  
                // make i-th PS visited 
                hash[i] = 1; 
                for (int j = i; j < ps; j++) { 
                    if (new_result[i] == new_result[j]) { 
  
                        // change values of prev result with minimal value(ij) 
                        // (if Prev_result=[5, 8, 5, 5, 9], if change to [1, 2, 1, 1, 3]) 
                        prev_result[j] = ij; 
                        hash[j] = 1; // make j-th PS visited 
                    } 
                } 
                ij++; 
            } 
        } 
        // ********************************************************** 
  
        // Equivalent Partition Found(new result and prev result is same) 
        if (flag != 0) 
            break; 
    } 
  
    // ----------- generate optimistic state table ------------------ 
  
    int ij = 1, s; 
    for (int i = 0; i < ps; i++) { 
        hash[i] = 0; 
    } 
    for (int i = 0; i < ps; i++) { 
  
        // make i-th PS is not visited 
        if (hash[i] == 0) { 
  
            // print S-th partition block of equivalent partition 
            printf("S%d=(", ij); 
  
            // make i-th PS visited 
            hash[i] = 1; 
            for (int j = i; j < ps; j++) { 
                if (prev_result[i] == prev_result[j]) { 
  
                    // make j-th PS visited 
                    hash[j] = 1; 
  
                    // print S-th partition block of equivalent partition 
                    printf("%c", j + 65); 
                } 
            } 
            printf(") "); 
  
            // assign value of i-th PS for ij-th state 
            // of new optimistic state table 
            s[ij] = i; 
            ij++; 
        } 
    } 
    printf("\n"); 
  
    for (int j = 1; j < ij; j++) { 
        int present_state = j; 
  
        // print optimistic state table 
        printf("S%d S%d, %d S%d, %d\n", present_state, (prev_result[arr[s[j]][0].state]), 
                                                                        arr[s[j]][0].output, 
                                                            (prev_result[arr[s[j]][1].state]), 
                                                                        arr[s[j]][1].output); 
    } 
  
    // *********************** 
    return 0; 
} 

Aporte:

7
E 0 C 0
C 0 A 0
B 0 G 0
G 0 A 0
F 1 B 0
E 0 D 0
D 0 G 0 

Producción:

A    E, 0    C, 0
B    C, 0    A, 0
C    B, 0    G, 0
D    G, 0    A, 0
E    F, 1    B, 0
F    E, 0    D, 0
G    D, 0    G, 0
P1=(ABCDFG) (E) 
P2=(AF) (BCDG) (E) 
P3=(AF) (BD) (CG) (E) 
P4=(A) (BD) (CG) (E) (F) 
S1=(A) S2=(BD) S3=(CG) S4=(E) S5=(F) 
S1    S4, 0    S3, 0
S2    S3, 0    S1, 0
S3    S2, 0    S3, 0
S4    S5, 1    S2, 0
S5    S4, 0    S2, 0 

Publicación traducida automáticamente

Artículo escrito por srijan_de y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *