2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2, 3  След.
 
 Алгоритм деления пополам для произвольной булевой функции
Сообщение07.01.2013, 12:51 
Собственно, надо доказать, что для любой булевой функции действует алгоритм деления пополам и что он выдаёт правильный ответ для монотонных и не монотонных функций. Была идея что доказываться надо опираясь на сами определения монотонной функции, но дальше чего-то не пошло.

 
 
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение07.01.2013, 17:04 
Аватара пользователя
Что это за зверь - алгоритм деления пополам - применительно к булевой функции? Что за результат должен получиться?

 
 
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение07.01.2013, 22:58 
Результатом должно быть монотонна ли функция или нет.

 
 
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение08.01.2013, 23:15 
В общем может это сейчас будет странная формулировка, что надо вообще сделать. Есть алгоритм деления пополам. Вот пример
Цитата:
По вектору значений $f= 10011111$ выяснить, является ли функция f
монотонной.

Решение. Поделим вектор пополам, тогда $1001=<1111$ . На следующем
шаге отношение предшествования нарушается для пары $10=<01$, а
$11=<11$ . Таким образом, заданная функция не является монотонной.

Из этого всего надо сделать. Описать как этот алгоритм работает для произвольной функции и доказать что он выдаёт правильный ответ на всех булевых функциях - как монотонных, так и немонотонных.

 
 
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение09.01.2013, 11:29 
Аватара пользователя
Теперь задача понятна: по записи булевой функции установить её монотонность/немонотонность.
Алгоритма пока нет, т.к. отсутствует какой-либо "принцип" перехода от отрезка к левой/правой его половине в случае неопределённости. Стандартные метОды - просмотр графа (у нас - дерева) в глубину либо в ширину.

 
 
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение09.01.2013, 12:02 
Да в принципе алгоритм понятен - последовательно проверять монотонность по каждой из переменных. Делим отрезок пополам и сравниваем левую половину с правой. Потом повторяем для каждой половины и т.д. рекурсивно. Если на каком-то этапе левая половина больше правой, это означает немонотонность функции. Если на всех этапах половинки равны, мы имеем дело с постоянной функцией.

 
 
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение09.01.2013, 12:30 
Хм, интересный алгоритм, но на практике слабо применимый... потому что на практике вы будете вектор значений булевой функции представлять как массив байтов, в каждом из которых упаковано восемь значений (т.е. эдакое big-endian число). А это значит, что эффективный алгоритм следующий:

Код:
bool checkMonotonicity(byte* arr, size_t len) {
  for (int i = 0; i < len - 1; i++) {
    if ((!isMonotonicThreeArgBoolFunction(arr[i]) || (arr[i] > arr[i+1])) return false;
  }
  return isMonotonicThreeArgBoolFunction(arr[len - 1]);
}

где isMonotonicThreeArgBoolFunction имеет прототип bool isMonotonicThreeArgBoolFunction(byte); и проверяет, является ли заданная байтом (восемью битами) булевая функция монотонной. Я бы ее сделал lookup-таблицей, или даже свитчем: не так уж и много монотонных булевых функций от трех переменных.

 
 
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение09.01.2013, 19:04 
Теперь вопрос, как это доказать математически, что это можно сделать? То есть почему именно когда мы будем сравнивать переменные, то это будет верно для проверки любой произвольной булевой функции. Я немного просто не понимаю как начать это доказывать.

 
 
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение09.01.2013, 19:48 
Аватара пользователя
involume в сообщении #669380 писал(а):
Теперь вопрос, как это доказать математически, что это можно сделать?

Что именно? Сформулируйте себе точный вопрос - получите 90% ответа :idea:

 
 
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение09.01.2013, 20:06 
Надо доказать, что взяв любую булеву функцию и прогнав её через этот алгоритм (предварительно ещё описав, что этот алгоритм делает) мы точно будем уверенны в том, что она будет либо монотонной, либо нет.

 
 
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение09.01.2013, 20:19 
Аватара пользователя
Я уже заметил, что алгоритма-то у Вас пока нет. Есть что-то вроде "исчисления", когда из данной "позиции" разрешается несколько ходов. Алгоритм появится после уточнения правила выбора конкретного хода.
Попробуйте самостоятельно уточнить, 1/ что у Вас является позицией и 2/ почему разрешённые ходы продвигают к ответу.

 
 
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение10.01.2013, 15:09 
Собственно сегодня ещё уточнил. Есть алгоритм проверки на монотонность функции, причём абсолютно произвольной, с помощью машины Тьюринга. Сам алгоритм:
1. Сравниваем соседние биты пары, затираем пару. Формируем справа
строки из первых $Q_1$ и вторых $Q_2$ эл-в пар ($Q_1 , Q_2$ соответственно).
Повторяем до тех пор пока не сотрем исходную строку значений с ленты или пока не встретится пара с отношением $Q_1>Q_2$, во втором случае функция не монотонна.
2. Склеиваем получившиеся строки $Q_1 и Q_2$. Переходим к 1 шагу
алгоритма. Цикл повторяется $N$ раз, где $N$ число аргументов функции.
3. Если цикл выполняется $N$ раз ф-ция монотонна.

Теперь это надо как-то в виде состояний записать вида $q a \to q b D$

 
 
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение10.01.2013, 15:49 
Аватара пользователя
involume в сообщении #669773 писал(а):
Есть алгоритм проверки на монотонность функции, причём абсолютно произвольной, с помощью машины Тьюринга.

Лучше на менее "примитивном" уровне. По факту Вы будете иметь дело со списками значений функции на гранях двоичного куба: фиксируется начальный кусок аргументов, ему сопоставляется грань в виде фрагмента исходной записи. Далее нужно определить, какую грань будем "резать".
Например, сам список организовать как стек или очередь - получатся известные приёмы просмотра дерева вглубь либо в ширину.

 
 
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение10.01.2013, 16:32 
А если без всякого булева куба, например взять 10101111 и попробовать этот алгоритм записать в виде состояний машины Тьюринга. Просто судя по алгоритму у нас будет 4 состояния и каждый раз они будут повторяться, так как цикл повторяется N раз. Сам алфавит это собственно строка значений булевой функции. Или я что-то не так пишу?

 
 
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение10.01.2013, 16:40 
Аватара пользователя
involume в сообщении #669807 писал(а):
попробовать этот алгоритм записать в виде состояний машины Тьюринга

Это зависит от цели. Можно и ПК под Тьюринга перекрасить :roll:

 
 
 [ Сообщений: 34 ]  На страницу 1, 2, 3  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group