Využití vlastností databázového systému

při řešení velkých grafických úloh

 

 

Podstata metody

Podstata zde uváděné metody spočívá ve vytváření indexů pro vyjádření návaznosti jevů, podle zadaných kritérii, aniž by se záznamy přepisovaly nebo přesouvaly. Indexy se vytvářejí pomocí binárních stromů (rush more technology), což způsobuje rychlé zpracování rozsáhlých úloh.

Všechny jevy mají svou příčinu a důsledek. U většiny jevů dokážeme jak příčinu tak důsledek definovat. Vztah příčiny a důsledku jevu se nazývá kauzální vztah.

Od tohoto názvu odvodíme pojem kauzalita, kterým označíme objekt popsaný atributy příčina, důsledek a jev. Nejde tedy o implicitu, která je logickým operátorem ani o expertní systém, který je tvořen logickými vztahy a databází znalostí.

 

Kauzality

Kauzality jsou zvláštním typem úloh, řešených v relačním databázovém systému. Řešení kauzálních úloh se od expertních systémů odlišuje jednoduchostí formulace zadání a pořízení údajů, ( zejména však tím, že nejde o systém ale o řešení úlohy). Obvykle se odlišuje i rozsahem. Například počet kauzalit ve FoxPro může být až jeden bilión, a přesto budou výsledky získány mnohem rychleji.

Když množinu příčin označíme P, množinu důsledků D a atributy popisující jev označíme jako množinu M, pak můžeme definovat kauzality:

Kauzalita K je podmnožina kartézského součinu množin P, D, M. K = P x D x M

Množiny P a D jsou podmnožinami jevů. To znamená, že některé prvky P mohou být současně prvky množiny D a naopak. Například první kauzalita: "pití alkoholu má za důsledek poruchu jater", druhá kauzalita: "porucha jater se projevuje skvrnami na kůži". Zde "porucha jater" je důsledkem první kauzality a příčinou druhé. Z toho logicky plyne, že kauzality lze spojovat, a když spojovat tak i větvit. Pak má smysl mluvit o prvotních příčinách ( v příkladu "pití alkoholu" ) a konečných důsledcích (v příkladu " skvrny na kůži"). Lze tedy získat informaci, že pití alkoholu může způsobit skvrny na kůži a naopak jednou z příčin skvrn na kůži může být pití alkoholu.

Jiný příklad lze sestavit jako dopravní problém. Příčinami a důsledky jevů (vzdálenost, povolené maximální zatížení poloosy, max. přepravní rychlost) jsou jména nákladních nádraží. Příklad "cesta (jev) z Brna (příčina) do Blanska (důsledek) měřila 14 km (atribut jevu)". Pokud by byla tato cesta obousměrná, pak by bylo nutné zapsat i opačnou kauzalitu. (Degenerovaný typ řešení dovoluje automatické zaměňování příčin a důsledků). Takto sestavená úloha umožní výpočet nejkratší cesty nebo při poškození některého úseku výpočet náhradní cesty z výchozího místa (prvotní příčina) do místa určení (konečný důsledek).

Úlohu o informačním systému lze řešit tak, že příčinou existence určité informace (jev) je dílčí činnost, ve které tato informace vznikla a důsledkem je dílčí činnost, pro kterou je informace vytvořena. Pak řešením úlohy je určit prvotní a finální informace, nebo v úlohách optimalizace informačních toků určení informačních toků dopředných i zpětných.

 

Věty o kauzalitách

Pro další výklad nutno říci věty:

1. Množina příčin P je konečná neprázdná množina P = {p1, p2, ... pi, pn}

2. Množina důsledků D je konečná neprázdná množina D = {d1, d2, ... dj, dm}

3. Množina atributů jevů M je konečná neprázdná množina M = {m1, m2, ..., mk,...mr}

4. Existuje množina jevů A = {a1, a2, ... am, ...,ax}, pro kterou platí, že P a D jsou její podmnožiny, platí tedy A = P + D.

5. Konečné důsledky KD je taková podmnožina důsledků, které v daném okamžiku nejsou příčinou jiného jevu. Jinak: KD = D \ P

6. Prvotní příčiny PP je taková množina příčin, které v daném okamžiku nejsou důsledkem jiného jevu. Jinak: PP = P \ D

7. Kauzální závislosti se větví když existuje i',i'', pro které platí pi' = pi''. Větev končí spojením s jinou větví nebo konečným důsledkem.

8. Kauzální závislosti se spojují když existuje j',j'', pro které platí dj' = dj''.

9. Sepětí je větev, pro kterou platí, že existuje takové l pro které pl = dl. Pojem je znám z praxe. Existují jevy jejichž důsledky jsou současně jejich příčinou. Neustále se vyvolává stejný jev. V lékařství to může být například drogová závislost v informatice paměť, apod.

10. Multigraf tvoří dva nebo více jevů, které mají stejnou příčinu a důsledek. Pojem je přebrán z grafických metod, u kterých se takto nazývá množina hran vedoucích z téhož uzlu do jiného společného uzlu. Z praxe víme, že více jevů může mít stejnou příčinu i důsledek. Multigrafje velice častý v úlohách sledování informačních toků.

11. Zpětná vazba je větev, která končí již dříve vyhodnocenou příčinou. V informatice, v řízení i medicíně se zpětné vazby velice často vyskytují.

Kauzality, pro jejich obecnou definici můžeme použít k řešení rozsáhlých úloh, u kterých je nevýhodné nebo nemožné použít metod operační analýzy. Kauzality jsou zvláště výhodné, kdy v modelovaném systému jsou v okamžiku řešení některé jeho části zcela izolované. Například při průzkumu informačních toků může nastat jejich neprovázanost. Zatím co jiné metody jsou v tomto případě bezradné, kauzalitní metoda záměrně provádí izolaci nevhodných jevů restrikcí, čímž urychluje řešení.

 

Zde uváděné řešení kauzalit vzniklo při řešení problematiky diagnóz v úkolu "Časování léčebných procedur VLRZ", kde je nutno přímo předem počítat s existencí vzájemně nepropojených částí systému. Uvedené věty lze demonstrovat na grafickém zobrazení části

kauzálních závislosti

 

             ┌──┐ 
       ┌────>┤  │ m2                ┌─>┐m5 
         ┌─>┤a2├─────>┐               
           └──┘    ┌─┴┐ m2      ┌─┴┐ │ 
         │m1          ├─────>───┤  ├─┘     m4        ┌──┐ 
                   │a3├─────>───┤a4├───────────────>─│a5│ 
           ┌──┐    └─┬┘ m1      └─┬┘                 └──┘ 
         └──┤a1├─────>┘             
            └──┘  m1                
                                    
       └────────────────────────────┘ 
                   m6 

 

 

Cvičení

 

Vytvoření a naplnění souboru kauzalit

 

nazev='Vytvoření a naplnění souboru kauzalit'

SET TALK OFF

CREATE  DBF kauzality  ( vetev      N (3),;

vyhodnocen C (3),;

priciny C (2),;

dusledky C (2),;

jev C (2),;

konec_dusl C (1),;

prvot_pric C (1),;

sepeti C (1) )

INDEX ON dusledky+vyhodnocen+jev+priciny;

TAG dusledky  FOR dusledky <> priciny

INDEX ON priciny+vyhodnocen+jev+dusledky;

TAG priciny FOR dusledky <> priciny  ADDITIVE

INDEX ON vyhodnocen TAG  vyhodnocen ;

FOR !EMPTY (vyhodnocen) ADDITIVE

A="a1m1a2a1m1a3a2m2a3a3m1a4a3m2a4a4m6a2a4m5a4a4m4a5"

SET INDEX TO

GO TOP

m=1

FOR i=1 TO 8

APPEND BLANK

REPL priciny WITH SUBSTR(A,m,2), dusledky WITH SUBSTR(A,m+4,2),;

jev WITH SUBSTR(A,m+2,2)

m=m+6

ENDFOR

 

 

Sepětí, konečných důsledcích a prvotních  příčinách

nazev="Kauzality - úloha o sepětí, konečných důsledcích a prvotních  příčinách"

SET TALK OFF                                            && Nezobrazovat mezivýsledky

CLEAR ALL                                                  && Výmaz paměti, uzavření souborů

USE kauzality                                                && Otevření souboru kauzalit

REPL ALL sepeti  WITH  ' ' ;

prvot_pric WITH ' ';

konec_dusl WITH ' '                           && Počáteční hodnocení => nejsou

 

* Vzájemné sepětí jevu = příčina se rovná důsledku

 

REPLA ALL sepeti WITH 'S'  FOR priciny=dusledky           && Příčina se rovná důsledku

 

* Výchozí příčiny

 

SET INDEX TO kauzality ORDER TAG dusledky

FOR i =1 TO RECCOUNT()                         && Pro všechny hrany

GO i                                                   && Ukazovátko na i-tý záznam

IF !SEEK(priciny)                              && Existuje v důsledcích příčina?

GO i                                       && Oprava ukazatele

REPL  prvot_pric WITH "P"            && Když neexistuje,=> jde

ENDIF                                                           &&   o prvotní příčinu

ENDFOR

 

* Koncové uzly

 

SET INDEX TO kauzality ORDER TAG priciny

FOR i =1 TO RECCOUNT()                                     && Pro všechny hrany

GO i                                                               && Ukazovátko na i-tý záznam

IF !SEEK(dusledky)                                      && Existuje v adresách příjemců

GO i                                                   &&   aktuální adresa odesílatele?

REPL konec_dusl WITH "K"                       && Když neexistuje, pak jde

ENDIF                                                                      &&   o konečný důsledek

ENDFOR

 

* Výsledky

 

SET INDEX TO                                                         && V původním uspořádání

BROWSE                                                                   && Zobrazení výsledků

 

Kauzality - hledání konečných důsledků

 

nazev="Kauzální úloha = hledání konečných důsledků"

CLEAR ALL                                                              && Všeobecný úklid neuškodí

SET TALK OFF

USE kauzality ORDER TAG priciny                         && Otevření souboru kauzalit

REPLACE ALL vyhodnocen WITH ' '           && Všechny kauzal. jsou zatím nevyhodnocené.

z=1                                                                && Vetveni je dynamicky se měnící

DIMENSION vetveni[z]                                && pole (dle potřeby typu LIFO nebo FIFO).

 

* Konec přípravné části,  teď od zadané příčiny ke konečnému důsledku

 

vychozi_pricina='  '

CLEAR                                                          &&  Výmaz obrazovky

@ 10,10 SAY "Napište výchozí příčinu:" ;

GET vychozi_pricina

READ

IF !SEEK(vychozi_pricina)

WAIT 'Příčina není zaznamenána,'+;

' K = konec úlohy ';

WINDOW NOWAIT                           && SEEK nejen testoval, ale provedl důležité

RETURN                                            && nastavení ukazatele na výchozí příčinu.

ENDIF                                                                       && Když příčina existuje, pak tuto kauzalitu

&& lze považovat za začátek hledání konečných důsledků.

cc=' '                                                              && Počítadlo důsledků

vv=0                                                              && Počítadlo větví

 

* Vlastní vyhodnocovací algoritmus

 

DO WHILE .T.

cc=STR(VAL(cc)+1,3)                      && Zvětěšení počítadla o 1. Znaková forma je

REPLACE vyhodnocen WITH  cc     && zde výhodná. Zapisuje se do položky

REPLACE vetev WITH  vv               && vyhodnocen= cislo.

R=RECNO()

 

* Zápis  v případě větvení kauzalit

 

IF SEEK(priciny+'   ')                                               && Větvení kauzalit (jde o nepoužitou cestu?)

vetveni[z]=RECNO()                                   && Lze zaměnit za frontu

z=z+1

DIMENSION vetveni[z]                    && Redimenzace zásobníku

ENDIF

GO R

 

* Hledání návazného jevu

 

IF  !SEEK(dusledky+'   ')                              && Když návazný jev neexistuje,

IF z=1                                                && pak hledej v zásobníku.

SET INDEX TO kauzality ;

ORDER TAG vyhodnocen     && Nesouvisející jevy se nezobrazují

BROWSE                                && ZOBRAZENÍ VÝSLEDKŮ

RETURN                                && Konec

ELSE                                                 && Snadno lze zásobník zaměnit za frontu (*)

r=vetveni(z-1)                                   && Poslední větvení (x)

* r=vetveni(1)                                   && První větvení (*)

* = ADEL(vetveni,1)             && Posun fronty  (*)

z=z-1

DIMENSION vetveni(z)         && Zmenšení pole

vv=vv+1                               && Načtení větve

ENDIF

GO R                                                  && Přechod na novou větev

ENDIF

ENDDO

 

 

Kauzality - hledání prvotních příčin

 

nazev="Kauzální úloha = hledání prvotních příčin"

CLEAR ALL                                                  && Všeobecný úklid neuškodí

SET TALK OFF

USE kauzality ORDER TAG dusledky          && Otevření souboru kauzalit

REPLACE ALL vyhodnocen WITH ' '           && Všechny kauzality zatím nevyhodnocené.

z=1                                                                && Větvení je dynamicky se měnící

DIMENSION vetveni[z]                                && pole (dle potřeby typu LIFO nebo FIFO).

 

* Konec přípravné části,  teď hledání

 

dusledek='  '

CLEAR                                                          &&  Výmaz obrazovky

@ 10,10 SAY "Napište důsledek:" ;

GET dusledek

READ

IF !SEEK(dusledek )

WAIT 'Důsledek není zaznamenán,'+;

' K = konec úlohy ';

WINDOW NOWAIT                           && SEEK nejen testoval, ale provedl důležité

RETURN                                            && nastavení ukazatele na výchozí příčinu.

ENDIF                                                                       && Když příčina existuje, pak tuto kauzalitu

&& lze považovat za začátek hledání konečných důsledků.

cc=' '                                                              && Počítadlo důsledků

vv=0                                                              && Počítadlo větví

 

* Vlastní vyhodnocovací algoritmus

 

DO WHILE .T.

cc=STR(VAL(cc)+1,3)                      && Zvětšení počítadla o 1. Znaková forma je

REPLACE vyhodnocen WITH  cc     && zde výhodná. Zapisuje se do položky

REPLACE vetev WITH  vv               && vyhodnocen= cislo.

R=RECNO()

 

* Zápis do zásobníku  v případě větvení kauzalit

 

IF SEEK(dusledky+'   ')                    && Větvení kauzalit (jde o nepoužitou cestu?)

vetveni[z]=RECNO()                       && Lze zaměnit za frontu

z=z+1

DIMENSION vetveni[z]        && Redimenzace zásobníku

ENDIF

GO R

 

* Hledání návazného jevu

 

IF  !SEEK(priciny+'   ')                     && Když návazný jev neexistuje,

IF z=1                                               && pak hledej větev.

SET INDEX TO kauzality ;

ORDER TAG vyhodnocen     && Nesouvisející jevy se nrzobrazují

BROWSE FIELD vetev,vyhodnocen,;

dusledky, priciny, prvot_pric,;

 jev                                        && Zobrazení výsledků

RETURN                               && Konec

ELSE                                     && Snadno lze zásobník zaměnit za frontu (*)

r=vetveni(z-1)                       && Poslední větvení (x)

* R=vetveni(1)          && První větvení (*)

* = ADEL(vetveni,1) && Posun fronty  (*)

z=z-1

DIMENSION vetveni(z)        && Zmenšení pole

vv=vv+1                   && Načtení větve

ENDIF

GO R                                      && Přechod na novou větev

ENDIF

ENDDO