2014 dxdy logo

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

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


Правила форума


В этом разделе нельзя создавать новые темы.

Если Вы хотите задать новый вопрос, то не дописывайте его в существующую тему, а создайте новую в корневом разделе "Помогите решить/разобраться (М)".

Если Вы зададите новый вопрос в существующей теме, то в случае нарушения оформления или других правил форума Ваше сообщение и все ответы на него могут быть удалены без предупреждения.

Не ищите на этом форуме халяву, правила запрещают участникам публиковать готовые решения стандартных учебных задач. Автор вопроса обязан привести свои попытки решения и указать конкретные затруднения.

Обязательно просмотрите тему Правила данного раздела, иначе Ваша тема может быть удалена или перемещена в Карантин, а Вы так и не узнаете, почему.



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


07/01/13
21
Собственно, надо доказать, что для любой булевой функции действует алгоритм деления пополам и что он выдаёт правильный ответ для монотонных и не монотонных функций. Была идея что доказываться надо опираясь на сами определения монотонной функции, но дальше чего-то не пошло.

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


06/04/10
3152
Что это за зверь - алгоритм деления пополам - применительно к булевой функции? Что за результат должен получиться?

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


07/01/13
21
Результатом должно быть монотонна ли функция или нет.

 Профиль  
                  
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение08.01.2013, 23:15 


07/01/13
21
В общем может это сейчас будет странная формулировка, что надо вообще сделать. Есть алгоритм деления пополам. Вот пример
Цитата:
По вектору значений $f= 10011111$ выяснить, является ли функция f
монотонной.

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

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

 Профиль  
                  
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение09.01.2013, 11:29 
Заслуженный участник
Аватара пользователя


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

 Профиль  
                  
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение09.01.2013, 12:02 


14/01/11
3062
Да в принципе алгоритм понятен - последовательно проверять монотонность по каждой из переменных. Делим отрезок пополам и сравниваем левую половину с правой. Потом повторяем для каждой половины и т.д. рекурсивно. Если на каком-то этапе левая половина больше правой, это означает немонотонность функции. Если на всех этапах половинки равны, мы имеем дело с постоянной функцией.

 Профиль  
                  
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение09.01.2013, 12:30 
Заслуженный участник


09/09/10
3729
Хм, интересный алгоритм, но на практике слабо применимый... потому что на практике вы будете вектор значений булевой функции представлять как массив байтов, в каждом из которых упаковано восемь значений (т.е. эдакое 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 


07/01/13
21
Теперь вопрос, как это доказать математически, что это можно сделать? То есть почему именно когда мы будем сравнивать переменные, то это будет верно для проверки любой произвольной булевой функции. Я немного просто не понимаю как начать это доказывать.

 Профиль  
                  
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение09.01.2013, 19:48 
Заслуженный участник
Аватара пользователя


06/04/10
3152
involume в сообщении #669380 писал(а):
Теперь вопрос, как это доказать математически, что это можно сделать?

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

 Профиль  
                  
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение09.01.2013, 20:06 


07/01/13
21
Надо доказать, что взяв любую булеву функцию и прогнав её через этот алгоритм (предварительно ещё описав, что этот алгоритм делает) мы точно будем уверенны в том, что она будет либо монотонной, либо нет.

 Профиль  
                  
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение09.01.2013, 20:19 
Заслуженный участник
Аватара пользователя


06/04/10
3152
Я уже заметил, что алгоритма-то у Вас пока нет. Есть что-то вроде "исчисления", когда из данной "позиции" разрешается несколько ходов. Алгоритм появится после уточнения правила выбора конкретного хода.
Попробуйте самостоятельно уточнить, 1/ что у Вас является позицией и 2/ почему разрешённые ходы продвигают к ответу.

 Профиль  
                  
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение10.01.2013, 15:09 


07/01/13
21
Собственно сегодня ещё уточнил. Есть алгоритм проверки на монотонность функции, причём абсолютно произвольной, с помощью машины Тьюринга. Сам алгоритм:
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 
Заслуженный участник
Аватара пользователя


06/04/10
3152
involume в сообщении #669773 писал(а):
Есть алгоритм проверки на монотонность функции, причём абсолютно произвольной, с помощью машины Тьюринга.

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

 Профиль  
                  
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение10.01.2013, 16:32 


07/01/13
21
А если без всякого булева куба, например взять 10101111 и попробовать этот алгоритм записать в виде состояний машины Тьюринга. Просто судя по алгоритму у нас будет 4 состояния и каждый раз они будут повторяться, так как цикл повторяется N раз. Сам алфавит это собственно строка значений булевой функции. Или я что-то не так пишу?

 Профиль  
                  
 
 Re: Алгоритм деления пополам для произвольной булевой функции
Сообщение10.01.2013, 16:40 
Заслуженный участник
Аватара пользователя


06/04/10
3152
involume в сообщении #669807 писал(а):
попробовать этот алгоритм записать в виде состояний машины Тьюринга

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2, 3  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group