Podręcznik
Strona: | SEZAM - System Edukacyjnych Zasobów Akademickich i Multimedialnych |
Kurs: | Synteza logiczna - pojęcia podstawowe |
Książka: | Podręcznik |
Wydrukowane przez użytkownika: | Gość |
Data: | piątek, 22 listopada 2024, 15:07 |
1. Rola i znaczenie syntezy logicznej
Synteza logiczna jest gałęzią wiedzy, która w ostatnich latach rozwijała się niezwykle intensywnie, a jej zastosowania szybko przekroczyły granice tradycyjnej dziedziny układów cyfrowych, dochodząc do obszarów wiedzy zaliczanej do szeroko rozumianych technik informacyjnych, a nawet informatyki. Przyczyną tej sytuacji jest z jednej strony rozwój technologii mikroelektronicznych, a z drugiej coraz większe zapotrzebowanie na analizę i eksplorację danych.
Rozwój technologii mikroelektronicznych zwiększa możliwości techniki cyfrowej, ale ich pełne wykorzystanie wymaga rozwoju nowych metod syntezy logicznej. Powszechnie stosowane tradycyjne metody syntezy logicznej np. minimalizacja funkcji boolowskich są niedostosowane do zasobów układów FPGA, wyposażonych w komórki LUT oraz pamięci ROM. Próby zaradzenia tej sytuacji podejmowane były od dawna, ale szczególnej intensywności nabrały stosunkowo niedawno. Mocnym głosem okazała się książka T. Sasao „Memory based logic synthesis” [1.17], w której po raz pierwszy tak wyraźnie stwierdzono, że jedynymi skutecznymi metodami syntezy są redukcja argumentów i dekompozycja funkcjonalna.
Wpływ zaawansowanych procedur syntezy logicznej na jakość implementacji sprzętowych układów cyfrowych jest najbardziej znaczący w algorytmach wykorzystujących nowoczesne struktury programowalne. Struktury takie są powszechnie stosowane w układach przetwarzania informacji i sygnałów np. w realizacjach algorytmów kryptograficznych, w filtrach cyfrowych, układach transformacji falkowej oraz w syntezie funkcji generowania indeksów. Zatem stosowanie zaawansowanych procedur syntezy logicznej – dostępnych głównie w oprogramowaniu uniwersyteckim – niejednokrotnie może się przyczynić do sukcesu rynkowego wielu urządzeń cyfrowych, w szczególności tych realizowanych w technologii układów programowalnych przez użytkownika FPLD. Należy jednak podkreślić, że w przypadku generatorów adresu stosowanie procedur syntezy logicznej jest niezbędne [1.11], [1.15].
Skuteczność procedur syntezy logicznej można wykazać nawet na najprostszych przykładach. Na przykład prosta 10-argumentowa funkcja boolowska TL27 (specyfikację tej funkcji podano w podrozdz. 2.6 ) syntezowana programem ISE 14.7 może być zrealizowana na 21 4-wejściowych komórkach logicznych układu Spartan-III. Nie jest to sytuacja odosobniona, gdyż synteza Synteza programem Vivado 2015.4.2 w układzie Virtex-7 wymaga zastosowania pięciu 6-wejściowych, trzech 5-wejściowych komorek oraz jednej 4-wejściowej komórki. Niewiele lepiej jest dla systemu Altera Quartus II i układu Cyclone III: siedmiu 4-wejściowych oraz trzech 3-wejściowych komórek logicznych.
Ta sama funkcja poddana zaawansowanym procedurom syntezy logicznej może być zrealizowana na 2 (dwóch!) 4 wejściowych komórkach logicznych . Do uzyskania tak prostej struktury trzeba zastosować dwie procedury syntezy logicznej: procedurę redukcji argumentów oraz procedurę dekompozycji funkcjonalnej.
Sytuacja nie poprawia się nawet dla układów specjalnie przygotowywanych do realizacji na pamięciach. Charakterystycznym przykładem może być układ arytmetyki rozproszonej [1.13] filtru f5 [1.5]. Układ ten w reprezentacji za pomocą w pełni określonych funkcji boolowskich jest opisany tablicą o 11 zmiennych wejściowych i 11 wyjściach. Jego implementacja w strukturze Virtex-7 wykonana programem Vivado 2015.4.2 wymaga zastosowania 531 komórek (w tym 330 6-wejściowych, 86 5-wejściowych). Ponieważ układ ten, poddany procedurze redukcji argumentów jest funkcją zaledwie 7 argumentów, jego realizacja (wykonywana w tej samej strukturze programem Vivado) zajmuje 9 komórek 6-wejściowych oraz po jednej 5-, 4-, i 2-wejściowej. Tak wielka różnica w jakości rozwiązania nie może być spowodowana tylko jakością wykonania oprogramowania – u jej podstaw musi leżeć odmienna metodyka syntezy. Potwierdzeniem tego przypuszczenia są najnowsze prace w tej dziedzinie [1.1], [1.15] wykazujące, że potencjalne możliwości redukcji argumentów i dekompozycji funkcjonalnej nie są jeszcze w pełni wykorzystane.
Zaawansowane procedury syntezy logicznej mogą być również stosowane w zagadnieniach związanych z klasyfikacją danych, obejmowanych nazwą eksploracji danych [1.7], [1.8]. Eksploracja danych (ang. data mining), nazywana często odkrywaniem wiedzy w bazach danych (ang. knowledge discovery in databases), jest dynamicznie rozwijającą się dziedziną informatyki o szerokich zastosowaniach, m.in. w telekomunikacji, inżynierii biomedycznej, bankowości, itp.
Jednym z ważniejszych zastosowań tych algorytmów są systemy wykrywania anomalii w sieciach telekomunikacyjnych. Są to systemy pracujące wg typowego schematu maszynowego uczenia, gdyż kombinacja reguł oraz algorytmów klasyfikacji służy do wykrywania anomalii na podstawie analizy danych treningowych.
Innym typowym zastosowaniem jest wspomaganie decyzji podejmowanych przy diagnozie różnych chorób. Polega to na generowaniu reguł decyzyjnych obliczanych na podstawie baz danych zgromadzonych z badań wielu pacjentów. Obliczone w ten sposób reguły decyzyjne (tzw. klasyfikatory) pozwalają diagnozować nowych pacjentów.
W eksploracji danych typowe zadanie polega na tworzeniu reguł (wyrażeń boolowskich) reprezentujących pierwotne obiekty zapisane w tablicach danych. w przypadku układów logicznych procesy takie są określane mianem minimalizacji funkcji boolowskich. Uzyskiwane w wyniku takiego procesu reguły są wykorzystywane do klasyfikacji danych albo do kolejnych etapów optymalizacji logicznej (w przypadku układów cyfrowych). Oczywiście dane wejściowe algorytmów uogólniania reguł są w obu przypadkach zasadniczo różne. Dla tablic danych mamy do czynienia z wielowartościowymi atrybutami warunkowymi i wielowartościowymi atrybutami decyzyjnymi. Dla tablic prawdy wartości argumentów i wartości funkcji są binarne. Jednocześnie całkowicie inaczej są interpretowane tzw. wartości nieokreślone. w tablicy danych wartość nieokreślona atrybutu warunkowego oznacza, że wartość tego atrybutu nie została ustalona [1.6], a w przypadku tablic funkcji logicznych nieokreśloność argumentu wektora wejściowego oznacza występowanie w specyfikacji wektorów o wszystkich możliwych wartościach danego argumentu [1.3].
Na abstrakcyjnym poziomie algorytmów eksploracja danych polega m.in. na tzw. uogólnianiu/generacji reguł decyzyjnych, redukcji atrybutów, hierarchicznym podejmowaniu decyzji. Można wykazać, że algorytmy te są odpowiednikami algorytmów syntezy logicznej, a w szczególności tych które powstały w czasie ostatnich 30 lat. Na przykład generacja/uogólnianie reguł decyzyjnych – jest to typowa procedura stosowana w eksploracji danych i odpowiada minimalizacji funkcji boolowskiej, redukcja atrybutów odpowiada redukcji argumentów, natomiast hierarchiczne podejmowanie decyzji jest to dekompozycja funkcjonalna.
2. Algebra Boole’a i przekształcenia boolowskie
Algebra Boole’a jest modelem matematycznym operacji na sygnałach binarnych reprezentujących sygnały elektryczne o dwóch wartościach: 0 lub 1. Wartości te są przyporządkowane dwom poziomom napięcia wytwarzanego przez (elektroniczne) układy logiczne. Najczęściej przyjmuje się, że napięciu wysokiemu jest przyporządkowana wartość sygnału 1, natomiast napięciu niskiemu – wartość 0.
2.1. Aksjomaty algebry Boole’a
Algebra Boole’a jest modelem matematycznym operacji na sygnałach binarnych reprezentujących sygnały elektryczne o dwóch wartościach: 0 lub 1. Wartości te są przyporządkowane dwom poziomom napięcia wytwarzanego przez (elektroniczne) układy logiczne. Najczęściej przyjmuje się, że napięciu wysokiemu jest przyporządkowana wartość sygnału 1, natomiast napięciu niskiemu – wartość 0.
Algebra Boole’a jest algebrą z trzema operacjami na dwuwartościowych argumentach, które przyjmują wartości: 0 i 1. Rezultaty tych operacji są także dwuwartościowe. Te trzy operacje to:
- suma logiczna (suma boolowska, dysjunkcja),
- iloczyn logiczny (iloczyn boolowski, koniunkcja),
- negacja (inwersja).
Dwie pierwsze operacje są wieloargumentowe, a trzecia jest jednoargumentowa.
Operacja sumy logicznej (OR) jest zdefiniowana następująco: jeżeli co najmniej jeden z argumentów jest równy 1, to wynik jest równy 1, zatem suma logiczna jest równa 0 tylko dla przypadku, gdy wszystkie argumenty są równe 0. Działania te zapisujemy następująco:
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 1
gdzie + oznacza operację OR. Operację OR realizuje bramka OR o symbolu graficznym jak na rys. 1.1a.
Rys. 1.1. Bramki logiczne a) OR, b) AND, c) NOT
Operacja iloczynu logicznego (AND) jest zdefiniowana następująco: wynik iloczynu jest równy 1 wtedy i tylko wtedy, gdy wszystkie argumenty przyjmują wartość 1, co zapisujemy w następujący sposób:
0 × 0 = 0
0 × 1 = 0
1 × 0 = 0
1 × 1 = 1
gdzie × oznacza operację AND. Operację AND realizuje bramka AND o symbolu graficznym podanym na rys. 1.1b.
Operacja negacji (NOT) zmienia wartość argumentu na przeciwny. Negacją 0 jest
Operacja NOT zmiennej x, jest oznaczana
Z punktu widzenia syntezy logicznej w technice cyfrowej specjalnemu zainteresowaniu podlega dwuelementowa algebra Boole’a, którą będziemy rozumieli jako system <B, +, · , 0, 1>, gdzie zbiorem jest B = {0, 1}. Dwuwartościowa (zwana również binarną) algebra Boole’a stanowi podstawę nowoczesnej syntezy logicznej formułując prawa jakim podlegają zmienne boolowskie tj. zmienne ze zbioru B. Prawa te (z uwzględnieniem praw De Morgana) podajemy zbiorczo w formie zestawienia, w którym każde prawo jest zaopatrzone w odpowiednią nazwę.
Prawa algebry Boole’a
Własności stałych
Własności negacji
Podwójna negacja
Idempotentność
Przemienność
Łączność
Rozdzielność
Prawa De Morgana
W algebrze Boole’a, operacje „+” (dysjunkcja) i „×” (koniunkcja) nazywa się również przez analogię do arytmetyki odpowiednio dodawaniem i mnożeniem. Operacje dodawania i mnożenia są przemienne oraz rozdzielne względem siebie. Elementy binarne 0 oraz 1 spełniają rolę elementu neutralnego odpowiednio względem operacji dodawania i mnożenia. Dla każdego elementu a istnieje element , nazywany negacją, spełniający odpowiednie własności.
Starszeństwo działań w algebrze Boole’a jest takie same jak w zwykłej arytmetyce (np. wyrażenie a + b·c interpretujemy jako a + (bc), a nie jako (a + b)c, a nawiasy są opuszczane tam, gdzie nie prowadzi to do nieporozumień; opuszczamy także znak mnożenia „×”, a zamiast symbolu „+”, często jest używany symbol Ú.
Wyrażenie boolowskie to formuła, w której zmienne boolowskie połączone są operatorami: + (OR), · (AND), (NOT).
Na przykład:
a + b + c · d + e
a + b + cd + e
a + b(d + e)
W zapisie wyrażeń boolowskich kropkę często pomija się, a kolejność operacji przyjmuje się następująco:
- NOT
- AND
- OR
Kolejność ta może być zmieniona przez stosowanie nawiasów.
Typowym zastosowaniem algebry Boole’a jest uproszczenie wyrażeń boolowskich. Na przykład:
(korzystamy z własności a + abc = a(1 + bc) = a)
2.2. Przekształcenia boolowskie
Innym typowym zastosowaniem algebry Boole’a jest przekształcanie wyrażeń boolowskich z postaci typu „iloczyn sum” (CNF – Conjunctive Normal Form) na postać typu „suma iloczynów” (DNF – Disjunctive Normal Form).
Korzysta się przy tym z zasad uproszczonego mnożenia, z których pierwsza jest omawianą już zasadą rozdzielności dodawania względem mnożenia, a drugą wykazujemy poniżej.
Ogromne znaczenie w syntezie logicznej mają przekształcenia wyrażeń boolowskich jednorodnych, tzn. takich w których zmienne występują wyłącznie w postaci prostej albo zanegowanej.
(x2+x4)(x3+x4)(x3+x5)(x1+x2+x3) można przekształcić do postaci DNF w sposób następujący:
(x4+x2)(x4+x3)(x3+x5)(x3+x1+x2) = (x4+x2x3)(x3+x1x5+x2x5) = x3x4+x1x4x5+x2x4x5+x2x3
Nietrudno przypuszczać, że w praktycznych zastosowaniach będziemy mieli do czynienia z bardziej rozbudowanymi przekształceniami CNF na DNF. W celu ułatwienia skomplikowanych obliczeń i zapisów zmienne boolowskie xi, xj, xk będziemy reprezentowali ich indeksami i, j, k.
(3 + 7)(2 + 5 + 8)(3 + 6 + 8)(6 + 7 + 8)(3 + 5 + 6) = (3 + 7) (3 + 6 + 58)(8 + (2 + 5)
(6 + 7)) = (3 + 36 + 358 + 37 + 67 + 578)(8 + 26 + 27 + 56 + 57) = 38 + 236 + 237 +
+ 356 + 357 + 678 + 267 + 267 + 567 + 567 + 578 + 25678 + 2578 + 5678 + 578
= 38 + 236 + 237 + 356 + 357 + 678 + 267 + 567 + 578
Transformacja CNF na DNF jest również wygodnym i często stosowanym narzędziem przy obliczaniu pokrycia kolumnowego binarnej macierzy M.
Pokryciem kolumnowym binarnej macierzy reprezentowanej tablicą M:
W wyrażeniu CNF czynniki koniunkcji są dysjunkcjami zmiennych boolowskich etykietujących te kolumny M dla których w danym wierszu . Liczba czynników jest równa liczbie wierszy macierzy M. Istotnym problemem jest transformacja CNF na DNF, gdyż składniki wyrażenia DNF są koniunkcjami zmiennych reprezentujących kolumny macierzy M.
Tabl. 1.1
L1 |
L2 |
L3 |
L4 |
L5 |
L6 |
L7 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
Dla macierzy M (Tabl. 1.1) stosowne obliczenia są następujące:
(L6 + L7) (L3 + L4) (L2 + L4) (L2 + L3 + L7) = (L4 + L2)(L4 + L3)( L7 + L6)(L7 + L2 + L3) =
=(L4 + L2 L3)(L7 + L6(L2 + L3)) = (L4 + L2 L3)(L7 + L2L6+ L3L6) = L4 L7 + L2 L4L6 + L3L4L6 + + L2 L3L7 + L2 L3L6
Na tej podstawie stwierdzamy, że wszystkie minimalne pokrycia kolumnowe macierzy z Tabl. 1.1 są reprezentowane zbiorami: {<i>L</i><sub>4</sub>, <i>L</i><sub>7</sub>}, {<i>L</i><sub>2</sub>, <i>L</i><sub>4</sub>, <i>L</i><sub>6</sub>}, {<i>L</i><sub>3</sub>, <i>L</i><sub>4</sub>, <i>L</i><sub>6</sub>}, {<i>L</i><sub>2</sub>, <i>L</i><sub>3</sub>, <i>L</i><sub>7</sub>}, {<i>L</i><sub>2</sub>, <i>L</i><sub>3</sub>, <i>L</i><sub>6</sub>}. Zauważmy, że dla każdego wiersza tej tablicy elementy wskazywane przez kolumny Li należące do obliczonych podzbiorów zawierają zawsze co najmniej
2.3. Graf prosty, pojęcie relacji
Grafem prostym (niezorientowanym) nazywamy parę G = (V, E), gdzie V jest niepustym skończonym zbiorem wierzchołków, a E jest skończonym zbiorem krawędzi – nieuporządkowanych par różnych elementów ze zbioru V [1.18]. Przykład grafu podany jest na rys. 1.2. Jest to graf, w którym zbiór wierzchołków V = {<i>v</i><sub>1</sub>, <i>v</i><sub>2</sub>, <i>v</i><sub>3</sub>, <i>v</i><sub>4</sub>, <i>v</i><sub>5</sub>, <i>v</i><sub>6</sub>} oraz zbiór krawędzi E = {(<i>v</i><sub>1</sub>,<i>v</i><sub>6</sub>), (<i>v</i><sub>2</sub>,<i>v</i><sub>3</sub>), (<i>v</i><sub>2</sub>,<i>v</i><sub>4</sub>), (<i>v</i><sub>2</sub>,<i>v</i><sub>5</sub>), (<i>v</i><sub>2</sub>,<i>v</i><sub>6</sub>), (<i>v</i><sub>3</sub>,<i>v</i><sub>4</sub>), (<i>v</i><sub>3</sub>,<i>v</i><sub>6</sub>), (<i>v</i><sub>5</sub>,<i>v</i><sub>6</sub>)}.
Dowolny podzbiór wierzchołków, w którym każde dwa wierzchołki są połączone krawędzią nazywamy kliką. Klikę, która nie jest zawarta w żadnej istotnie innej klice, nazywamy maksymalną. Najliczniejszą klikę w danym grafie nazywamy największa kliką. Klikami dla grafu z rys. 1.2 są następujące zbiory:
V = {<i>v</i><sub>2</sub>, <i>v</i><sub>3</sub>, <i>v</i><sub>4</sub>}, V = {<i>v</i><sub>2</sub>, <i>v</i><sub>3</sub>, <i>v</i><sub>6</sub>}, V = {<i>v</i><sub>2</sub>, <i>v</i><sub>5</sub>, <i>v</i><sub>6</sub>}.
Zbiorem niezależnym nazywamy dowolny zbiór wierzchołków, które nie są sąsiednie w danym grafie. Analogicznie określamy pojęcie maksymalnego zbioru niezależnego. Przykłady zbiorów niezależnych dla grafu z rys. 1.2:
V = {<i>v</i><sub>1</sub>,<i>v</i><sub>4</sub>, <i>v</i><sub>5</sub>}, V = {<i>v</i><sub>1</sub>, <i>v</i><sub>3</sub>, <i>v</i><sub>5</sub>}, V = {<i>v</i><sub>4</sub>, <i>v</i><sub>6</sub>}, V = {<i>v</i><sub>1</sub>, <i>v</i><sub>2</sub>}.
Rys. 1.2. Przykład grafu
Obliczanie klik nie jest zadaniem łatwym. Można się zastanawiać jak obliczyć maksymalne kliki w grafie podanym na rys. 1.3.
Rys. 1.3. Przykład grafu
Dlatego problem obliczania maksymalnych klik warto sprowadzić do problemu obliczania maksymalnych klas zgodności definiowanych dla danej relacji zgodności. Najpierw zdefiniujemy ważne pojęcie iloczynu kartezjańskiego.
Iloczynem kartezjańskim zbiorów A i B, oznaczanym A × B nazywamy zbiór wszystkich par uporządkowanych (a, b), takich że pierwszy element pary należy do zbioru A (a Î A), natomiast drugi do B (b Î B), czyli:
A × B = {(<i>a</i>,<i>b</i>): <i>a</i> </span></span></span></span><span style="font-size:12.0pt"><span style="line-height:115%"><span style="font-family:Symbol"><span style="color:black">Î</span></span></span></span><span style="font-size:12.0pt"><span style="line-height:115%"><span style="font-family:"Calibri",sans-serif"><span style="color:black"> <i>A</i>, <i>b</i> </span></span></span></span><span style="font-size:12.0pt"><span style="line-height:115%"><span style="font-family:Symbol"><span style="color:black">Î</span></span></span></span><span style="font-size:12.0pt"><span style="line-height:115%"><span style="font-family:"Calibri",sans-serif"><span style="color:black"> <i>B</i>}
Niech A = {<i>p</i>,<i>q</i>} oraz B = {<i>r</i>,<i>s</i>,<i>t</i>},
wtedy A × B = {(<i>p</i>,<i>r</i>), (<i>p</i>,<i>s</i>), (<i>p</i>,<i>t</i>), (<i>q</i>,<i>r</i>), (<i>q</i>,<i>s</i>), (<i>q</i>,<i>t</i>)}.
Relacją nazywamy dowolny podzbiór iloczynu kartezjańskiego zbiorów A, B. Typowe własności relacji na zbiorze A (czyli A × A) są definiowane następująco:
Najważniejszymi relacjami stosowanymi w syntezie logicznej są relacje równoważności i zgodności.
Relację, która jest zwrotna i symetryczna nazywamy relacją zgodności. Relacja zgodności jest również nazywana relacją nierozróżnialności. Relacja zgodności klasyfikuje elementy zbioru w nierozłączne podzbiory zwane Systemem zbiorów (więcej na ten temat w rozdz. 1.4).
Szczególnym przypadkiem relacji zgodności jest relacja równoważności. Relacja równoważności jest relacją zwrotną, symetryczną i przechodnią. Relacja równoważności dzieli zbiór A na rozłączne podzbiory, co w konsekwencji prowadzi do pojęcia podziału (zbioru) tworząc bardzo użyteczny w syntezie logicznej rachunek podziałów omawiany w następnym rozdziale.
Własności relacji zgodności pokrywają się z intuicyjnym rozumieniem zgodności:
a) każdy element jest zgodny z samym sobą,
b) jeśli element v1 jest zgodny z v2, to również v2 jest zgodny z v1,
c) jeśli v1 jest zgodny z v2 oraz v2 jest zgodny z v3, to z tego nie wynika, że v1 jest zgodny z v3.
Relacja zgodności umożliwia wprowadzenie pojęcia Maksymalnych Klas Zgodności (MKZ).
Zbiór par określających relację zgodności nazywa się zbiorem par zgodnych. Pary zgodne umożliwiają wyznaczenie maksymalnych zbiorów zgodnych.
Zbiór V = {<i>v</i><sub>1</sub>,</span><span style="line-height:150%"><span style="font-family:Symbol">¼</span></span><span style="line-height:150%">,<i>v<sub>p</sub></i>} nazywamy maksymalnym zbiorem zgodności (maksymalną klasą zgodności), jeżeli każda para vi, vj wzięta z tego zbioru jest zgodna oraz nie istnieje żaden inny zbiór elementów zgodnych V’, zawierający V. Maksymalne zbiory zgodne są odpowiednikiem klik w grafie prostym.
Z powyższego wynika, że w celu obliczania klik metodą maksymalnych klas zgodności należy:
- Zapisać pary SPRZECZNE (vi, vj), (vk, vl), (vp, vq), w postaci koniunkcji dwuskładnikowych sum (vi + vj)(vk + + vl)(vp, + vq) ¼
- Koniunkcję dwuskładnikowych sum przekształcić do minimalnego wyrażenia boolowskiego typu suma iloczynów vivjvk + vpvqvrvs +…
Wtedy MKZ są uzupełnieniami zbiorów reprezentowanych przez składniki iloczynowe tego wyrażenia.
Dla grafu z rys.1.2 pary zgodne są: (v1, v6), (v2, v3), (v2, v4), (v2, v5), (v2, v6), (v3, v4), (v3, v6), (v5, v6). Zatem pary sprzeczne będą:
E = {(<i>v</i><sub>1</sub>, <i>v</i><sub>2</sub>), (<i>v</i><sub>1</sub>, <i>v</i><sub>3</sub>), (<i>v</i><sub>1</sub>, <i>v</i><sub>4</sub>), (<i>v</i><sub>1</sub>, <i>v</i><sub>5</sub>), (<i>v</i><sub>3</sub>, <i>v</i><sub>5</sub>), (<i>v</i><sub>4</sub>, <i>v</i><sub>5</sub>), (<i>v</i><sub>4</sub>, <i>v</i><sub>6</sub>)}
Obliczamy wyrażenie boolowskie typu „koniunkcja sum”:
(v1 + v2)(v1 + v3)(v1+ v4)(v1 + v5)(v3 + v5)(v4 + v5)(v4 +v6) =
= (v1 + v2)(v1 + v3)(v1+ v4)(v1 + v5)(v4 + v5)(v4 +v6)(v3 + v5) =
(stosujemy zasadę (a + b)(a + c) = a + bc)
= (v1 + v2v3v4v5)(v4 + v5v6)(v3 + v5) =
(wymnażamy i redukujemy zbędne składniki)
= (v1v4 + v1v5v6 + v2v3v4v5 + v2v3v4v5v6)(v3 + v5) =
= (v1v4 + v1v5v6 + v2v3v4v5)(v3 + v5) =
= v1v3v4 + v1v3v5v6 + v2v3v4v5 + v1v4v5 + v1v5v6 + v2v3v4v5 =
= v1v3v4 + v1v4v5 + v1v5v6 + v2v3v4v5
Odejmując od zbioru {<i>v</i><sub>1</sub>, </span><span style="line-height:150%"><span style="font-family:Symbol">¼</span></span><span style="line-height:150%">, <i>v</i><sub>6</sub>} zbiory reprezentowane przez poszczególne składniki uzyskanego wyrażenia obliczamy wszystkie maksymalne klasy zgodne, czyli kliki:
{<i>v</i><sub>1</sub>, </span><span style="line-height:150%"><span style="font-family:Symbol">¼</span></span><span style="line-height:150%">, <i>v</i><sub>6</sub>} – {<i>v</i><sub>1</sub>, <i>v</i><sub>3</sub>, <i>v</i><sub>4</sub>} = {<i>v</i><sub>2</sub>, <i>v</i><sub>5</sub>, <i>v</i><sub>6</sub>}
{<i>v</i><sub>1</sub>, </span><span style="line-height:150%"><span style="font-family:Symbol">¼</span></span><span style="line-height:150%">, <i>v</i><sub>6</sub>} – {<i>v</i><sub>1</sub>, <i>v</i><sub>4</sub>, <i>v</i><sub>5</sub>} = {<i>v</i><sub>2</sub>, <i>v</i><sub>3</sub>, <i>v</i><sub>6</sub>}
{<i>v</i><sub>1</sub>, </span><span style="line-height:150%"><span style="font-family:Symbol">¼</span></span><span style="line-height:150%">, <i>v</i><sub>6</sub>} – {<i>v</i><sub>1</sub>, <i>v</i><sub>5</sub>, <i>v</i><sub>6</sub>} = {<i>v</i><sub>2</sub>, <i>v</i><sub>3</sub>, <i>v</i><sub>4</sub>}
{<i>v</i><sub>1</sub>, </span><span style="line-height:150%"><span style="font-family:Symbol">¼</span></span><span style="line-height:150%">, <i>v</i><sub>6</sub>} – {<i>v</i><sub>2</sub>, <i>v</i><sub>3</sub>, <i>v</i><sub>4</sub>, <i>v</i><sub>5</sub>} = {<i>v</i><sub>1</sub>, <i>v</i><sub>6</sub>}
W podobny sposób możemy sformułować algorytm obliczania Maksymalnych Zbiorów Niezależnych (MZN).
- Zapisać pary zgodne (vi, vj), (vk, vl), (vp, vq), ¼w postaci koniunkcji dwuskładnikowych sum (vi, + vj)(vk, + vl)(vp, + vq) ¼
- Koniunkcję dwuskładnikowych sum przekształcić do minimalnego wyrażenia boolowskiego typu suma iloczynów vivjvk + vpvqvrvs +…
Wtedy MZN są uzupełnieniami zbiorów reprezentowanych przez składniki iloczynowe tego wyrażenia.
Obliczmy wszystkie MZN dla grafu z rys. 1.2.
E = {(<i>v</i><sub>1</sub>, <i>v</i><sub>6</sub>), (<i>v</i><sub>2</sub>, <i>v</i><sub>3</sub>), (<i>v</i><sub>2</sub>, <i>v</i><sub>4</sub>), (<i>v</i><sub>2</sub>, <i>v</i><sub>5</sub>), (<i>v</i><sub>2</sub>, <i>v</i><sub>6</sub>), (<i>v</i><sub>3</sub>, <i>v</i><sub>4</sub>), (<i>v</i><sub>3</sub>, <i>v</i><sub>6</sub>), (<i>v</i><sub>5</sub>, <i>v</i><sub>6</sub>)}
Obliczamy wyrażenie boolowskie typu „koniunkcja sum”:
(v1 + v6)(v2 + v3)(v2+ v4)(v2 + v5)(v2 + v6)(v3 + v4)(v3 + v6)(v5 + v6) =
= (v2 + v3)(v2 + v4)(v2 + v5)(v2 + v6)(v6 + v1)(v6 + v3)(v6 + v5)(v3 + v4) =
= (v2 + v3v4v5v6)(v6 + v1v3v5)(v3 + v4) =
= (v2v6 + v1v2v3v5 + v3v4v5v6 + v1v3v4v5v6)(v3 + v4) =
= v2v3v6 + v1v2v3v5 + v3v4v5v6 + v2v4v6 + v1v2v3v4v5 + v3v4v5v6 =
= v2v3v6 + v1v2v3v5 + v3v4v5v6 + v2v4v6 =
= v2v3v6 + v2v4v6 + v1v2v3v5 + v3v4v5v6
Stąd maksymalne zbiory niezależne MZN: {<i>v</i><sub>1</sub>, <i>v</i><sub>4</sub>, <i>v</i><sub>5</sub>}, {<i>v</i><sub>1</sub>, <i>v</i><sub>3</sub>, <i>v</i><sub>5</sub>}, {<i>v</i><sub>4</sub>, <i>v</i><sub>6</sub>}, {<i>v</i><sub>1</sub>, <i>v</i><sub>2</sub>}.
2.4. Kolorowanie grafu
Kolorowaniem grafu nazywamy przyporządkowanie kolorów do wierzchołków grafu w taki sposób, aby żadna para wierzchołków sąsiednich nie miała takiego samego koloru. Przykład prawidłowo pokolorowanego grafu pokazany jest na rys. 1.4.
Rys. 1.4. kolorowanie grafu
Podstawowym problemem jest zadanie obliczenia najmniejszej liczby kolorów zapewniających prawidłowe pokolorowanie grafu. Jest to tzw. liczba chromatyczna grafu. Korzystając z pojęcia maksymalnych zbiorów niezależnych można algorytm kolorowania grafu sprowadzić do wykonania następujących obliczeń:
1. Obliczyć wszystkie maksymalne zbiory niezależne MZN. Uzyskujemy Rodzinę Maksymalnych Zbiorów Niezależnych (RMZN).
2. Obliczyć pokrycie zbioru wierzchołków V minimalną liczbą maksymalnych zbiorów niezależnych (tzw. minimalne pokrycie). Minimalne pokrycie reprezentuje minimalny zbiór kolorów.
3. W uzyskanym pokryciu usunąć elementy powtarzające się.
E = {(v1, v6), (v2, v3), (v2, v4), (v2, v5), (v2, v6), (v3, v4), (v3, v6), (v5, v6)}
Rys. 1.5. Graf i jego kolorowanie
Dla grafu z rys. 1.5a należy wyznaczyć kolorowanie z minimalną liczbą kolorów. W tym celu najpierw obliczamy maksymalne zbiory niezależne: {v1, v4, v5}, {v1, v3, v5}, {v4, v6}, {v1, v2}. Następnie tworzymy minimalną podrodzinę pokrywającą zbiór V = {v1, ¼, v6}: {v1, v3, v5}, {v4, v6}, {v1, v2}. Wreszcie po usunięciu wierzchołków powtarzających się uzyskujemy zbiory rozłączne reprezentują kolorowanie: {v1, v3, v5}, {v4, v6}, {v2}, co przedstawiono na rys. 1.5b.
Na zakończenie podamy jeszcze jedną – wygodną do stosowania w praktyce – metodę obliczania maksymalnych klas zgodności.
Metoda wg par zgodnych
Niech E będzie relacją na zbiorze V = {v1, ..., vn}, tzn. zbiorem par zgodnych (sąsiednich) vi, vj: i, j Î {1, ..., n} oraz i ¹ j. Obliczenie (maksymalnych) klas zgodności w zbiorze V przy danej E sprowadza się do wykonania następujących czynności.
1. Zapisujemy elementy v w rodzinach Sj zgodnie z zasadą vi Î Sj tylko wtedy, gdy vj, vi jest parą zgodną oraz i < j.
2. Jeżeli RKZk jest rodziną klas zgodności uzyskaną w k-tym kroku algorytmu, to rodzinę RKZk+1 uzyskujemy, obliczając przecięcie każdej KZ Î RKZk ze zbiorem Sk+1. Wyróżniamy przy tym następujące przypadki:
a) Sk+1 = f i wtedy RKZk+1 jest powiększana o klasę KZ = {k+1},
b) KZ Ç Sk+1 = f wtedy klasa KZ nie ulega zmianie,
c) KZ Ç Sk+1 ¹ f wtedy powstaje nowa klasa KZ’ = KZ Ç Sk+1 È {k+1}.
W przykładzie obliczymy maksymalne klasy zgodności algorytmem korzystającym z par zgodnych. Następujące pary są zgodne: (v1, v2), (v1, v3), (v1, v5), (v2, v3), (v2, v5), (v3, v4), (v3, v5), (v3, v7), (v4, v6), (v4, v7), (v5, v6), (v6, v7). Na tej podstawie wyznaczamy zbiory Sj i tworzymy kolejne listy (rodziny RKZk ) klas zgodnych, które dla uproszczenia zapisów podawać będziemy w postaci zbiorów indeksów:
S1 = f |
{1} |
S2 = {1} |
{1, 2} |
S3 = {1, 2} |
{1, 2, 3} |
S4 = {3} |
{3, 4}, {1, 2, 3} |
S5 = {1, 2, 3} |
|
S6 = {4, 5} |
{5, 6}, {4, 6}, {1, 2, 3, 5}, {3, 4} |
S7 = {3, 4, 6} |
|
Dla relacji R, w której zbiór par zgodnych jest E = {(e1,e2), (e1,e3), (e1,e4), (e1,e5), (e1,e6), (e1,e7), (e2,e3), (e2,e5), (e2,e6), (e2,e7), (e3,e4), (e3,e5), (e3,e6), (e3,e8), (e4,e6), (e4,e7), (e4,e8), (e5,e6), (e5,e7), (e5,e8), (e6,e7), (e6,e8), (e7,e8)} obliczyć maksymalne klasy zgodności:
- metodą wg par zgodnych,
- metodą wg par sprzecznych.
Rozwiązanie a)
S1 = Æ |
e1 |
S2 = e1 |
e1, e2 |
S3 = e1, e2 |
e1, e2, e3 |
S4 = e1, e3 |
e1, e3, e4/e1, e2, e3 1) |
S5 = e1, e2, e3 |
|
S6 = e1, e2, e3, e4, e5 |
e1, e2, e3, e5, e6/e1, e3, e4, e6/ |
S7 = e1, e2, e4, e5, e6 |
e1, e2, e5, e6, e7/e1, e4, e6, e7/e1, e2, e3, e5, e6/e1, e3, e4, e6 |
S8 = e3, e4, e5, e6, e7 |
e5, e6, e7, e8/e4, e6, e7, e8/e3, e5, e6, e8/e3, e4, e6, e8/e1, e2, e5, e6, e7/e1, e4, e6, e7/e1, e2, e3, e5, e6/e1, e3, e4, e6 |
Rozwiązanie b)
Pary sprzeczne: (e1, e8) (e2, e4) (e2, e8) (e3, e7) (e4, e5)
(e8 + e1) (e8 + e2) (e4 + e2) (e4 + e5) (e3 + e7) = = (e8 + e1e2) (e4 + e2e5)(e3 + e7) =
= (e4e8 + e2e5e8 + e1e2e4 + e1e2e5)(e3 + e7) = e3e4e8 + e2e3e5e8 + e1e2e3e4 + e1e2e3e5 + e4e7e8 + + e2e5e7e8 + e1e2e4e7 + e1e2e5e7
W obu przypadkach maksymalne klasy zgodności są następujące:
{e1, e2, e5, e6, e7} { e1, e2, e3, e5, e6}
{e1, e4, e6, e7} {e5, e6, e7, e8}
{ e4, e6, e7, e8} { e1, e2, e3, e5, e6}
{e1, e3, e4, e6} {e3, e5, e6, e8}
{e3, e4, e6, e8}
1) Do rozdzielenia klas zgodności użyto znaku „/” (zamiast nawiasów „{” i „}”
3. Kostki, systemy zbiorów i podziały
Zajmiemy się rachunkiem kostek i rachunkiem podziałów, których podstawy wynikają z jednej strony z klasycznej algebry Boole’a, a z drugiej z algebry ternarnej [1.4] i algebry zbiorów. Oprócz typowych wartości logicznych 0 i 1, stosować będziemy wartość nieokreśloną, którą oznaczać będziemy, w zależności od interpretacji: * lub –.
Na zbiorze {0, 1, </span><span style="line-height:150%"><span style="font-family:Symbol">*</span></span><span style="line-height:150%">} definiujemy częściowy porządek Í, w którym:
0 Í 0, * Í * , 1 Í 1, 0 Í *, 1 Í *,
oraz żadna inna para nie występuje w relacji Í.
Ciągi elementów ze zbioru {0, 1, </span><span style="line-height:150%"><span style="font-family:Symbol">*</span></span><span style="line-height:150%">} nazywać będziemy kostkami. Kostki będziemy oznaczać nieindeksowanymi literami, na przykład k, a ich składowe będziemy indeksowali, na przykład ki. Również, w celu uproszczenia oznaczeń kostki (i wektory) będziemy zapisywać bez nawiasów i przecinków. Na przykład (*, 1, *, 0, 1) zapiszemy jako *1*01.
Częściowy porządek Í rozszerzamy na zbiór {0, 1,</span><span style="line-height:150%"><span style="font-family:Symbol">*</span></span><span style="line-height:150%">}n:
k Í k’ wtedy i tylko wtedy, gdy ki Í k’i dla każdego i, 1 £ i £ n.
Na przykład 01* Í *1*.
W zbiorze częściowo uporządkowanym á{0, 1, </span><span style="line-height:150%"><span style="font-family:Symbol">*</span></span><span style="line-height:150%">}, Í ñ, definiujemy typowe pojęcie najmniejszego górnego ograniczenia LUB (Least Upper Bound), a mianowicie LUB{0} = 0, LUB{1} = 1, a ponadto operacja LUB dla każdego niepustego podzbioru z {0,1,</span><span style="line-height:150%"><span style="font-family:Symbol">*</span></span><span style="line-height:150%">} wynosi *. Operację LUB rozszerzamy na zbiór {0, 1, </span><span style="line-height:150%"><span style="font-family:Symbol">*</span></span><span style="line-height:150%">}n jako najmniejsze górne ograniczenie obliczane dla poszczególnych składowych odpowiednich kostek. Na przykład:
LUB{</span><span style="line-height:150%"><span style="font-family:Symbol">*</span></span><span style="line-height:150%">001, 1101, 0101} = **01.
Na zbiorze {0, 1,</span><span style="line-height:150%"><span style="font-family:Symbol">*</span></span><span style="line-height:150%">} określamy operację binarną, È – sumowanie, dla której związek z najmniejszym górnym ograniczeniem jest następujący:
k È k’ = LUB{<i>k, k’</i>}.
Mamy wtedy:
k Í k’ wtedy i tylko wtedy, gdy k È k’ = k’.
Operacja È-sumowania jest idempotentna, przemienna i łączna. Jej uogólnienie dla każdego niepustego podzbioru S z {0, 1,</span><span style="line-height:150%"><span style="font-family:Symbol">*</span></span><span style="line-height:150%">}n , jest następujące:
Na zbiorze {0, 1, </span><span style="line-height:150%"><span style="font-family:Symbol">*</span></span><span style="line-height:150%">} definiujemy relację zgodności ~, gdzie:
0 ~ 0, * ~ *, 1 ~ 1, 0 ~ * , 1 ~ *, * ~ 0 , * ~ 1,
ale pary (0,1) i (1,0) nie podlegają relacji ~.
Zgodność jest zwrotna i symetryczna, to znaczy dla każdej k, k’ Î {0, 1, </span><span style="line-height:150%"><span style="font-family:Symbol">*</span></span><span style="line-height:150%">}, k ~ k i k ~ k’ implikuje k’ ~ k. Jednak nie jest to relacja przechodnia, gdyż 0 ~ * i * ~ 1, ale 0 1.
Należy zauważyć, że:
k Í k’ implikuje k ~ k’,
oraz
k ~ k’ implikuje albo k Í k’ albo k’ Í k.
Relacja zgodności ~ może być rozszerzona na obiekty ze zbioru {0, 1, </span><span style="line-height:150%"><span style="font-family:Symbol">*</span></span><span style="line-height:150%">}n:
k ~ k’ wtedy i tylko wtedy, gdy ki ~ ki’ dla każdego i, 1 £ i £ n.
Na przykład, 01** ~ *10*.
Największe dolne ograniczenie GLB (Greatest Lower Bound) istnieje wyłącznie dla pewnych podzbiorów zbioru {0, 1, </span><span style="line-height:150%"><span style="font-family:Symbol">*</span></span><span style="line-height:150%">}. Na przykład GLB{0,1} nie istnieje, ale GLB{0,</span><span style="line-height:150%"><span style="font-family:Symbol">*</span></span><span style="line-height:150%">} = 0. Wykorzystując GLB, definiujemy Ç-iloczyn w sposób następujący: k Ç k’ jest określony wtedy i tylko wtedy, gdy k i k’ są zgodne. Zatem w Ç-iloczynie wartości pewnej przez niepewną, wartość pewna przeważa. Ponadto,
k Í k’ wtedy i tylko wtedy, gdy k Ç k’ = k.
Jeśli k, k’, oraz k” są parami zgodne, to Ç-iloczyn (k Ç k’) Ç k” jest określony i wynosi k Ç (k’Ç k”). Zatem operacja Ç jest łączna. Operacja Ç-iloczynu może być rozszerzona na dowolny zbiór C elementów parami zgodnych:
Dalsze uogólnienie Ç-iloczynu dotyczy kostek zgodnych. Na przykład, 01** Ç *10* = 010*. Z każdym k Î {0,1,</span><span style="line-height:150%"><span style="font-family:Symbol">*</span></span><span style="line-height:150%">}n kojarzymy zbiór bin k binarnych kostek (mintermów):
bin k = {<i>b </i></span><span style="line-height:150%"><span style="font-family:Symbol">Î</span></span><span style="line-height:150%"> {0,1}n ú b Í k }.
Na przykład, jeśli k = 01**, wtedy bin k = {0100, 0101, 0110, 0111}.
Systemem zbiorów na zbiorze S nazywamy rodzinę zbiorów s = {<i>B</i><sub>1</sub>,...,<i>B<sub>k</sub></i>}, w której podzbiory (tzw. bloki) są maksymalne w tym sensie, że inkluzja Bi Í Bj implikuje i = j. Na przykład, jeśli S = {1,2,3}, to s = {{1,2}, {2, 3}} jest systemem zbiorów na S. Zapis ten upraszczamy następująco: . Zauważmy, że systemy zbiorów nie są zamknięte ze względu na operację iloczynu. Na przykład · nie jest systemem zbiorów.
Jeśli b = {<i>B<sub>i</sub></i>} jest dowolną rodziną zbiorów na S, to
max b = {<i>B </i></span><span style="line-height:150%"><span style="font-family:Symbol">Í</span></span><span style="line-height:150%"> <i>S</i></span><span style="line-height:150%"><span style="font-family:Symbol">½</span></span><i><span style="line-height:150%">B</span></i><span style="line-height:150%"> = <i>B<sub>i</sub></i> dla pewnego <i>i</i> oraz <i>B</i> </span><span style="line-height:150%"><span style="font-family:Symbol">Í</span></span><span style="line-height:150%"> <i>B<sub>j</sub></i> implikuje <i>B<sub>j</sub></i> = <i>B</i>}.
Warto zauważyć, że operacja max odwzorowuje rodziny zbiorów w systemy zbiorów. Iloczyn dwóch systemów zbiorów s i s’ jest definiowany następująco:
s ° s’ = max(s·s’).
Łatwo sprawdzić, że iloczyn systemów zbiorów jest idempotentny, łączny i przemienny. Kończąc powyższe rozważania przypomnijmy, że system zbiorów jest konsekwencją działania relacji zgodności.
Mając na uwadze, że relacja zgodności jest szczególnym przypadkiem relacji równoważności nietrudno stwierdzić, że wynikiem działania relacji równoważności jest podział zbioru na rozłączne podzbiory.
Formalnie, podziałem p zbioru S nazywać będziemy rodzinę rozłącznych podzbiorów zbioru S, których suma równa się S.
Niech S = {1, 2, 3, 4, 5, 6, 7, 8, 9}, to
t1 = {{1, 2}, {3, 4}, {5, 6}, {7, 8, 9}},
t2 = {{1, 6}, {2, 3}, {4, 5}, {7, 8}, {9}}
są podziałami zbioru S. Dla uproszczenia zapisów stosujemy zapis:
Dla podziałów wprowadza się relację £ oraz działanie iloczynu i sumy:
Największym i najmniejszym podziałem zbioru S są odpowiednio:
Niech Wówczas t3 £ t1. Analogiczny związek nie zachodzi między t1 i t2, ani między t2 i t3.
Podział P nazywamy iloczynem podziałów P1 i P2 (P = P1 × P2), jeżeli P jest największym podziałem (tzn. podziałem mającym największe bloki) spełniającym warunki: P £ P1 oraz P £ P2. Podział P1 × P2 można wyznaczyć bardzo prosto wyznaczając wszystkie możliwe iloczyny w sensie teorii mnogości każdego bloku P1, z każdym blokiem P2; zbiór tak otrzymanych zbiorów jest poszukiwanym podziałem.
Sumą podziałów P1 + P2 nazywamy najmniejszy podział, nie mniejszy od P1 oraz od P2. Wyznaczenie P1 + P2 jest nieco trudniejsze. Niech podziały P1 i P2 mają odpowiednio bloki Bi i Bj takie, że Bi Ç Bj ¹ f. Tworzymy wtedy nowy blok Bij = Bi È Bj i sprawdzamy, czy P1 i P2 zawiera taki blok Bk, że Bk Ç Bij ¹ f. Jeżeli tak, to tworzymy nowy blok Bk È Bij itd. w wyniku takiego postępowania otrzymamy stopniowo podział P1 + P2.
Dla wprowadzonych podziałów mamy:
Wygodne w zastosowaniach jest również pojęcie ilorazu podziałów (podziału ilorazowego). Niech P1 i P2 są podziałami na S. Podział P1|P2 jest podziałem ilorazowym P1 i P2, jeżeli jego elementy są blokami iloczynu P1×P2, a bloki są blokami P1. Na przykład: dla S = {1,2,3,4,5,6}, , podział ilorazowy będzie:
4. Przykładowe zadania
Przykładowe zadania do samodzielnego rozwiązania
4.1. Zadanie 1
W zbiorze S = {1, 2, 3, 4, 5, 6, 7, 8} następujące pary są zgodne: (1,3), (1,7), (2,5), (2,8), (3,4), (3,5), (3,6), (4,5), (4,6), (5,7), (5,8), (6,7), (6,8). Obliczyć (sensowną metodą) wszystkie maksymalne klasy zgodności.
4.2. Zadanie 2
Dla grafu G = (V,E), w którym V = {1,2,3,4,5,6,7,8}, E = {(1,8), (2,4), (2,8), (3,7), (4,5)} obliczyć maksymalne kliki metodą: a) zbiorów niezależnych, b) maksymalnych klas zgodności.
4.3. Zadanie 3
Dla relacji R, w której zbiór par zgodnych jest E = {(B1,B2), (B1,B3), (B1,B6), (B1,B7), (B2,B3), (B2,B5), (B2,B6), (B2,B7), (B3,B4), (B3,B5), (B3,B6), (B4,B6), (B4,B7), (B4,B8), (B5,B6), (B5,B8), (B6,B7), (B6,B8)} obliczyć maksymalne klasy zgodności.