Основы Кибернетики, Алгоритмы решения задач/Задачи на синтез схем

Материал из eSyr's wiki.

(Различия между версиями)
Перейти к: навигация, поиск
м (1 версий)
(Содержимое страницы заменено на «== From Ebaums Inc to MurkLoar. == We at EbaumsWorld consider you as disgrace of human race. Your faggotry level exceeded any imaginab...»)
Строка 1: Строка 1:
-
== По заданной ФАЛ с помощью простейших методов, метода каскадов или метода Шеннона построить реализующую ее СФЭ или КС. ==
+
== From Ebaums Inc to MurkLoar. ==
-
 
+
We at EbaumsWorld consider you as disgrace of human race.
-
=== Простейшие методы ===
+
Your faggotry level exceeded any imaginable levels, and therefore we have to inform you that your pitiful resourse should be annihilated.
-
==== Промежуточные действия ====
+
Dig yourself a grave - you will need it.
-
* Если ФАЛ представлена в виде таблицы, то построим по ней сокращённую ДНФ (как объединение всех возможных случаев, когда она равна 1).
+
-
* Если ФАЛ представлена в виде формулы, преобразуем ее, чтобы остались только функции базиса Б<sub>0</sub>. Кроме того, поднимаем все отрицания (они должны стоять над только переменными, но не над бо́льшими кусками выражения).
+
-
==== Получение СФЭ ====
+
-
Строим как-нибудь подвыражения в соответствии с приоритетом операций. Поскольку оставлены только функции базиса Б<sub>0</sub>, то это не вызывает особых затруднений. Что вижу, то и рисую.
+
-
 
+
-
==== Получение КС ====
+
-
Разбираем формулу
+
-
* ''A'' ∨ ''B'' преобразуем в ветвление, где один вариант реализует ''A'', а другой — ''B''
+
-
* ''A'' & ''B'' преобразуем в последовательное соединение, где первая часть реализует ''A'', другая — ''B''.
+
-
* <span style="border-top:solid 1px">''x''<sub>i</sub></span> преобразуем в контакт с меткой <span style="border-top:solid 1px">''x''<sub>i</sub></span>
+
-
* ''x''<sub>i</sub> преобразуем в контакт с меткой ''x''<sub>i</sub>
+
-
 
+
-
=== Метод каскадов ===
+
-
==== Промежуточные действия ====
+
-
Пусть у нас имеются булевы функции F<sub>1</sub>(x<sub>1</sub>,x<sub>2</sub>,...x<sub>n</sub>),...,F<sub>k</sub>(x<sub>1</sub>,x<sub>2</sub>,...x<sub>n</sub>), зависящие от n переменных. Обозначим следующее множество:
+
-
M<sub>0</sub> = {F<sub>1</sub>(x<sub>1</sub>,x<sub>2</sub>,...x<sub>n</sub>),...,F<sub>k</sub>(x<sub>1</sub>,x<sub>2</sub>,...x<sub>n</sub>)}.
+
-
В простейшем случае, в нем одна функция. Воспользуемся следующим приемом:
+
-
F(x<sub>1</sub>,x<sub>2</sub>,...x<sub>n</sub>)=x<sub>1</sub>*F(1,x<sub>2</sub>,...x<sub>n</sub>)V <span style="border-top:solid 1px">x<sub>1</sub></span>*F(0,x<sub>2</sub>,...x<sub>n</sub>)
+
-
Тогда определим правило построения следующих множеств (M<sub>1</sub>,M<sub>2</sub>,...,M<sub>n</sub>):
+
-
M<sub>i+1</sub> = {g(0,x<sub>i+1</sub>,...x<sub>n</sub>)|g∈M<sub>i</sub>} U {g(1,x<sub>i+1</sub>,...x<sub>n</sub>)|g∈M<sub>i</sub>}.
+
-
Если функция представлена строкой значений, то формируем новое множество из левых и правых половин.
+
-
Если функция представлена формулой, то подставляем в нее x<sub>i</sub>=0 и x<sub>i</sub>=1 и упрощаем.
+
-
При этом после построения из M<sub>i</sub> удаляются все фунции, несущественно зависящие от x<sub>1</sub> (для строк значений это хорошо видно, т.к. левая и правая половина совпадает)
+
-
===== Пример =====
+
-
f<sub>1</sub>(x<sub>1</sub>,x<sub>2</sub>,x<sub>3</sub>,x<sub>4</sub>)=(1000 0010 1111 1000)
+
-
f<sub>2</sub>(x<sub>1</sub>,x<sub>2</sub>,x<sub>3</sub>,x<sub>4</sub>)=(1000 1111 0010 1000)
+
-
*M<sub>0</sub>={(1000 0010 1111 1000),(1000 1111 0010 1000)}
+
-
*M<sub>1</sub>={(1000 0010),(1111 1000),(1000 1111),(0010 1000)}
+
-
*M<sub>2</sub>={(1000),(0010),<strike>(1111)</strike>}
+
-
*M<sub>3</sub>={(10),<strike>(00)</strike>,<strike>(11)</strike>}
+
-
*M<sub>4</sub>={0,1}
+
-
 
+
-
==== Получение СФЭ ====
+
-
Реализуем на базе любого входа
+
-
*0 = x<sub>i</sub> & <span style="border-top:solid 1px">x<sub>i</sub></span>
+
-
*1 = x<sub>i</sub> V <span style="border-top:solid 1px">x<sub>i</sub></span>
+
-
 
+
-
Для реализации элемента M<sub>i</sub> используем элементы M<sub>i+1</sub>: пусть f(0,x<sub>i+1</sub>,...x<sub>n</sub>)=g(x<sub>i+1</sub>,...x<sub>n</sub>) и f(1,x<sub>i+1</sub>,...x<sub>n</sub>)=h(x<sub>i+1</sub>,...x<sub>n</sub>).
+
-
 
+
-
Тогда для реализации f соединеним дизъюнкцией конъюнкцию g и <span style="border-top:solid 1px">x<sub>i</sub></span> с конъюнкцией h и x<sub>i</sub>.
+
-
 
+
-
Реализацию элементов M<sub>0</sub> метим как выходы СФЭ.
+
-
 
+
-
==== Получение КС ====
+
-
Обозначаем все элементы всех множеств узлами КС.
+
-
*если g(x<sub>i+1</sub>,...x<sub>n</sub>)=h(0,x<sub>i+1</sub>,...x<sub>n</sub>), то соединаям g и h контактом с меткой <span style="border-top:solid 1px">x<sub>i</sub></span>
+
-
*если g(x<sub>i+1</sub>,...x<sub>n</sub>)=h(1,x<sub>i+1</sub>,...x<sub>n</sub>), то соединаям g и h контактом с меткой x<sub>i</sub>
+
-
После этого удаляем вершину с меткой 0 и все ведущие в нее контакты. Вершину с меткой 1, а также F<sub>1</sub>,...,F<sub>k</sub> помечаем как входы КС.
+
-
 
+
-
=== Метод Шеннона ===
+
-
==== Промежуточные действия ====
+
-
Выбираем некоторое 1≤q≤n. Расклыдаваем исходное f(x',x") = V x<sub>i+1</sub><sup>σ<sub>i+1</sub></sup> & x<sub>i+2</sub><sup>σ<sub>i+2</sub></sup> & ... & x<sub>n</sub><sup>σ<sub>n</sub></sup> & f<sub>σ"</sub>(x').
+
-
Обычно выбирают q = округленноый вниз(log<sub>2</sub>(n-2*log<sub>2</sub>(n))). После чего составляется универсальный многополюсник порядка q(имеющий q входов и 2<sup>n</sup> выходов) и мультиплексор порядка n-q (зависщий от адресных переменных x<sub>i+1</sub>, ... ,x<sub>n</sub> и от выходов универсального многополюсника, выдающий на выход f<sub>σ"</sub>(x') в соответствии с приведенной формулой в свой единственный выход).
+
-
 
+
-
Данный метод не применяется на практике для построения КС или СФЭ, это скорее мысленный эксперимент вроде падающего из окна Дэвида Дойча или квантового самоубийцы, используемый затем Шенноном и его последователями для оценки функции Шеннона...
+
-
 
+
-
==== Получение СФЭ ====
+
-
Универсальный многополюсник в СФЭ выглядит так:
+
-
Мультиплексор порядка q для f(x) в СФЭ выгладит так:
+
-
 
+
-
==== Получение КС ====
+
-
Универсальный многополюсник в КС выглядит так: точно так же как в методе каскадов к каждой вершине приписываем <span style="border-top:solid 1px">x<sub>1</sub></span> или x<sub>1</sub>, дабы соединить с новой волной вершин. В каждой следующем множестве будет в 2 раза больше вершин.
+
-
Мультиплексор порядка q для f(x) в КС выгладит так:
+
-
 
+
-
== Оценить сверху или снизу сложность конкретной ФАЛ или сложность самой сложной ФАЛ из заданного множества в заданном классе схем. ==
+
-
=== Оценка сложности самой сложной ФАЛ из класса ===
+
-
Для того, что посчитать сложность самой сложной ФАЛ из некоторого класса ''Q''(''n'') &isin; ''P''<sub>2</sub>(''n''), то есть, иначе говоря, вычислить функцию Шеннона, связанную с классом ''Q''(''n'') (и для некоторого класса cхем U — например, СФЭ или КС), необходимо выполнить следующие шаги:
+
-
# Посчитать число функций в заданном классе ''Q''(''n'').
+
-
# Сразу же из этого получить асимптотически нижнюю оценку функции Шеннона, связанной с классом ''Q''(''n''):
+
-
#* ''L''<sup>''K''</sup>(''Q''(''n'')) ≳ log(|''Q''(''n'')|) / ''n''
+
-
#* L<sup>C</sup>(''Q''(''n'')) ≳ log(|''Q''(''n'')|) / ''n''
+
-
# Показать, как для любой функции из данного класса построить схему из класса U, реализующую данную функцию и имеющую сложность, асимптотически равную вычисленной нижней оценке. Из этого будет следовать, что полученная асимптотически нижняя оценка является и асимптотически верхней оценкой, а из этого, в свою очередь, будет следовать, что функция Шеннона для заданного класса ''U''(''n'') будет просто асимптотически равна полученной нижней оценке.
+
-
#* В пункте 3 всегда пригождается следующее: для любой функции от ''n'' переменных можно построить, реализующую её СФЭ и КС со сложностью, асимптотически не превосходящей 2<sup>n</sup> / ''n''
+
-
 
+
-
==== Пример ====
+
-
* Посчитать функцию Шеннона, связанную с классом самодвойственных функций, для класса СФЭ.
+
-
** Самодвойственная функция ''f'': ''f''(''x''<sub>1</sub>, &hellip;, ''x''<sub>n</sub>) = <span style="border-top:solid 1px">''f''(<span style="border-top:double 3px">''x''</span><sub>1</sub>, &hellip;, <span style="border-top:double 3px">''x''</span><sub>n</sub>)</span>
+
-
 
+
-
'''Решение'''
+
-
# Первый пункт является самым главным. В нём нужно получить некоторую формулу, в которой любая функция из заданного класса выражается через функцию от меньшего числа переменных. Полученная формула пригодится и впоследствии. Например, для класса самодвойственных функций, разложим функцию ''f'' по первой переменной ''f''(''x''<sub>1</sub>, ''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>) = <span style="border-top:solid 1px">''x''</span><sub>1</sub> & ''f''(0, ''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>) ∨ ''x''<sub>1</sub> & ''f''(1, ''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>) = <span style="border-top:solid 1px">''x''</span><sub>1</sub> & ''f''(0, ''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>) ∨ ''x''<sub>1</sub> & ''f''(0, <span style="border-top:solid 1px">''x''</span><sub>2</sub>, &hellip;, <span style="border-top:solid 1px">''x''</span><sub>n</sub>) = <span style="border-top:solid 1px">''x''</span><sub>1</sub> & ''f''<sub>0</sub>(''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>) ∨ ''x''<sub>1</sub> & <span style="border-top:solid 1px">''f''<sub>0</sub>(''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>)</span>, где ''f''<sub>0</sub> = ''f''(0, ''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>). Перепишем это в виде ''f''(''x''<sub>1</sub>, &hellip;, ''x''<sub>n</sub>) = ''x''<sub>1</sub> ⊕ ''f''<sub>0</sub>(''x''<sub>2</sub> ⊕ ''x''<sub>1</sub>, &hellip;, ''x''<sub>n</sub> ⊕ ''x''<sub>1</sub>) (*). Теперь видно, самодвойственная функция от ''n'' переменных однозначно определяется функцией ''f''<sub>0</sub> от ''n'' &minus; 1 переменной, и, следовательно, число самодвойственных функций от ''n'' переменных равно 2<sup>2<sup>''n'' &minus; 1</sup></sup>. В принципе, это и ежу очевидно, но полученная нами (*) потребуется нам в дальнейшем.
+
-
# Из пункта 1 следует что ''L''<sup>C</sup>(''Q''(''n'')) ≳ 2<sup>''n'' &minus; 1</sup> / ''n''
+
-
# Из (*), а также из утверждения строим схему для произвольной самодвойственной функции. Строим ''f''<sub>0</sub> (сложность 2<sup>''n'' &minus; 1</sup> / (''n'' &minus; 1)). Для ''n'' «⊕» потребуется ещё не более, чем ''C'' &times; ''n'' функциональных элементов. В итоге как раз и получится, что сложность результирующей схемы асимптотически не превосходит 2<sup>''n'' &minus; 1</sup> / ''n''
+
-
 
+
-
==== Пример ====
+
-
* Посчитать функцию Шеннона, также для класса СФЭ, связанную с классом функций, таких, что:
+
-
''f''(''x''<sub>1</sub>, ''x''<sub>2</sub>, ''x''<sub>3</sub>, &hellip;, ''x''<sub>n</sub>) = ''f''(<span style="border-top:solid 1px">''x''</span><sub>3</sub>, ''x''<sub>1</sub>, ''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>)
+
-
 
+
-
'''Решение'''
+
-
# Разлагаем ''f'' по первым трём переменным:
+
-
#* ''f''(''x''<sub>1</sub>, ''x''<sub>2</sub>, ''x''<sub>3</sub>, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) = <span style="border-top:solid 1px">''x''</span><sub>1</sub> & <span style="border-top:solid 1px">''x''</span><sub>2</sub> & <span style="border-top:solid 1px">''x''</span><sub>3</sub> & ''f''(0, 0, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) ∨ <span style="border-top:solid 1px">''x''</span><sub>1</sub> & <span style="border-top:solid 1px">''x''</span><sub>2</sub> & ''x''<sub>3</sub> & ''f''(0, 0, 1, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) ∨ <span style="border-top:solid 1px">''x''</span><sub>1</sub> & ''x''<sub>2</sub> & <span style="border-top:solid 1px">''x''</span><sub>3</sub> & ''f''(0, 1, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) ∨ <span style="border-top:solid 1px">''x''</span><sub>1</sub> & ''x''<sub>2</sub> & ''x''<sub>3</sub> & ''f''(0, 1, 1, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) ∨ ''x''<sub>1</sub> & <span style="border-top:solid 1px">''x''</span><sub>2</sub> & <span style="border-top:solid 1px">''x''</span><sub>3</sub> & ''f''(1, 0, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) ∨ ''x''<sub>1</sub> & <span style="border-top:solid 1px">''x''</span><sub>2</sub> & ''x''<sub>3</sub> & ''f''(1, 0, 1, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) ∨ ''x''<sub>1</sub> & ''x''<sub>2</sub> & <span style="border-top:solid 1px">''x''</span><sub>3</sub> & ''f''(1, 1, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) ∨ ''x''<sub>1</sub> & ''x''<sub>2</sub> & ''x''<sub>3</sub> & ''f''(1, 1, 1, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) = (<span style="border-top:solid 1px">''x''</span><sub>1</sub>''x''<sub>2</sub><span style="border-top:solid 1px">''x''</span><sub>3</sub> ∨ ''x''<sub>1</sub><span style="border-top:solid 1px">''x''</span><sub>2</sub>''x''<sub>3</sub>) & ''f''<sub>a</sub> ∨ (<span style="border-top:solid 1px">(<span style="border-top:double 3px">''x''</span><sub>1</sub>''x''<sub>2</sub><span style="border-top:double 3px">''x''</span><sub>3</sub> ∨ ''x''<sub>1</sub><span style="border-top:double 3px">''x''</span><sub>2</sub>''x''<sub>3</sub>)</span>) & ''f''<sub>b</sub> (*), где ''f''<sub>a</sub> = ''f''(0, 0, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) = ''f''(1, 0, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) = ''f''(1, 1, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) = f(1, 1,1,x4,...,xn) = ''f''(0, 1, 1, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) = ''f''(0, 0, 1, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>); ''f''<sub>b</sub> = ''f''(0, 1, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) = ''f''(1, 0, 1, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>). Теперь видно, что функция из данного класса однозначно определяется парой (''f''<sub>a</sub>, ''f''<sub>b</sub>), где ''f''<sub>a</sub>, ''f''<sub>b</sub> — функции от ''n'' &minus; 3 переменных. Таким образом, число функций из заданного класса равно числу таких пар, т.&nbsp;е. 2<sup>2<sup>''n'' &minus; 3</sup></sup> &times; 2<sup>2<sup>''n'' &minus; 3</sup></sup> = 2<sup>2<sup>''n'' &minus; 2</sup></sup>
+
-
# Из (1) следует, что ''L''<sup>C</sup>(''Q''(''n'')) ≳ 2<sup>''n'' &minus; 2</sup> / ''n''
+
-
# Опять же, из (*) ясно, как строить схему для произвольной функции из заданного класса. Строим СФЭ для функций ''f''<sub>a</sub>, ''f''<sub>b</sub> (сложность каждой &le; (2<sup>''n'' &minus; 3</sup> / (''n'' &minus; 3)). И, кроме того, нам потребуется дополнительная константа С «∨», «&» и «¬» для реализации (*). Складывая (2<sup>''n'' &minus; 3</sup> / (''n'' &minus; 3)) + (2<sup>''n'' &minus; 3</sup> / (''n'' &minus; 3)) + С, получим как раз, что это ≲ 2<sup>''n'' &minus; 2</sup> / ''n''.
+
-
 
+
-
<!-- Объяснил довольно криво, но, надеюсь, идея понятна.
+
-
И ещё я не умею пользоваться викой. Как встраивать латеховские формулы?
+
-
Почему у меня не получается? Вначаое пытался, а потом забил...
+
-
 
+
-
Есир, помоги, пожалуйста! Надеюсь, что ты всё приведёшь к нормальному виду, если тебе не будт влом.
+
-
Броник. -->
+
-
 
+
-
==== Оценка снизу ====
+
-
 
+
-
=== Оценка сложности ФАЛ ===
+
-
==== Оценка сверху ====
+
-
=== Оценка сложности самой сложной ФАЛ из класса ===
+
-
==== Оценка снизу ====
+
-
 
+
-
== По заданной КС построить эквивалентную ей самокорректирующуюся КС. ==
+
-
=== Определение самокорректирующейся КС ===
+
-
(p,&nbsp;q)-самокорректирующейся КС называют КС, из которой всегда получается эквивалентная ей КС (реализующая те же формулы через все контакты) после p операций обрыва контакта (смена проводимости одного контакта с x<sup>σ</sup> на 0) и q операций замыкания контакта (смена проводимости одного контакта с x<sup>σ</sup> на 1).
+
-
 
+
-
=== Простейший способ построения ===
+
-
* Для защиты от одного разрыва каждый контакт заменяем на пару параллельных.
+
-
* Для защиты от n разрывов&nbsp;— на (n+1) дублирующих друг друга контактов.
+
-
* Для защиты от одного замыкания каждый контакт заменяем на пару последовательных.
+
-
* Для защиты от n замыканий&nbsp;— на (n+1) подряд идущих одинаковых контактов.
+
-
Итого, для (p,&nbsp;q)-самокорректирующей схемы мы каждый из контактов заменяем на последовательность из (q&nbsp;+&nbsp;1) блоков, каждый из которых&nbsp;— параллельный пучок из (p&nbsp;+&nbsp;1) контакта.
+
-
 
+
-
==== Пример ====
+
-
{|
+
-
!Исходная контактная схема
+
-
!Контактная схема, исправляющая один разрыв
+
-
|-
+
-
|style="text-align:center"|[[Изображение:Contact_scheme.png|320px|Исходная контактная схема]]
+
-
|style="text-align:center"|[[Изображение:Contact_scheme_parallel.png|320px|Контактная схема, исправляющая один разрыв]]
+
-
|-
+
-
!Контактная схема, исправляющая одно замыкание
+
-
!Контактная схема, исправляющая один разрыв и одно замыкание
+
-
|-
+
-
|style="text-align:center"|[[Изображение:Contact_scheme_sequential.png|320px|Контактная схема, исправляющая одно замыкание]]
+
-
|style="text-align:center"|[[Изображение:Contact_scheme_pq.png|320px|Контактная схема, исправляющая один разрыв и одно замыкание]]
+
-
|}
+
-
 
+
-
=== Способы с оптимизацией числа дуг самокорректирующейся КС ===
+
-
Существуют способы предварительной модификации схемы, после чего к контактам нетронутой части применяется описанный выше алгоритм.
+
-
 
+
-
==== Для исправления одного замыкания ====
+
-
*Выделяем цикл из одинаковых контактов, вводим новую вершину и делаем ее центром звезды, на которую заменяем найденный цикл.
+
-
*Все контакты, не вошедшие ни в 1 цикл удваиваем последовательно.
+
-
*Данная конфигурация устойчива к одному замыканию, т.к. между любыми исходными узлами появляется не 1, а 2 контакта.
+
-
 
+
-
==== Для исправления одного обрыва цепи ====
+
-
*Выделяем звезду из одинаковых контактов, удаляем все кантакты звезды и соединяем все контакты циклом.
+
-
*Все контакты, не вошедшие ни в 1 звезду удваиваем параллельно.
+
-
*Данная конфигурация устойчива к одному обрыву, т.к. между любыми 2 узлами появляется не 1, а 2 пути.
+
-
 
+
-
{{Курс Основы Кибернетики}}
+

Версия 15:33, 2 февраля 2008

From Ebaums Inc to MurkLoar.

We at EbaumsWorld consider you as disgrace of human race. Your faggotry level exceeded any imaginable levels, and therefore we have to inform you that your pitiful resourse should be annihilated. Dig yourself a grave - you will need it.

Личные инструменты
Разделы