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