Что вы всегда хотели узнать, но боялись спросить

folk
Сообщений: 4177
Зарегистрирован: 11 сен 2009, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение folk » 07 дек 2012, 16:57

zykov писал(а):Source of the post
Это совсем не так!
Для плотных матриц метод Гаусса как раз является основным.

Не соглашусь, для больших размерностей (а это подразумевается поскольку мы говорим об асимптотике) Гаусс уступает итерационным методам. Гаусс это куб а итерационные методы это квадрат на "константу".
Просмотрите обзор
[url=http://entropiya-blog.ru/sravnitelnyj-anal...-uravnenij.html]http://entropiya-blog.ru/sravnitelnyj-anal...-uravnenij.html[/url]

Кстати по доказательству теорем - интуитивно должна быть экспонента. Откуда взялось NP?
Последний раз редактировалось folk 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

Sonic86
Сообщений: 1774
Зарегистрирован: 03 мар 2011, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение Sonic86 » 07 дек 2012, 18:56

folk писал(а):Source of the post Кстати по доказательству теорем - интуитивно должна быть экспонента. Откуда взялось NP? :)
Не помню, откуда взял, возможно из Рассела (а док-ва там, есс-но, нету, разве что ссылка). Грубо говоря, доказательство ищется перебором (экспонента), а проверяется оно формально быстрее - просто проходим по цепочке преобразований, подстановок и т.п. и все (скорость порядка длины цепочки).
Последний раз редактировалось Sonic86 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Swetlana
Сообщений: 2067
Зарегистрирован: 03 май 2012, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение Swetlana » 07 дек 2012, 19:34

folk писал(а):Source of the post
Кстати по доказательству теорем - интуитивно должна быть экспонента. Откуда взялось NP?

эспонента экспоненте рознь
по определению недетерминированного полиномиального алгоритма - генерим экспоненциальное количество догадок, проверка каждой догадки на "да и "нет" происходит за полиномиальное время
пора выкладывть дальше, сакральные определения из Гэри-Джонсона
Последний раз редактировалось Swetlana 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Swetlana
Сообщений: 2067
Зарегистрирован: 03 май 2012, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение Swetlana » 07 дек 2012, 20:05

$$Íåäåòåðìèíèðîâàííûå \ ìàøèíû \ Òüþðèíãà. \ Êëàññ \ NP$$

Будем изучать класс $$NP$$ на примере задач распознавания.
Стандартная формулировка задачи распознавания $$(Ï)$$</span>:  <span class=$$" title="$$: $$" align="middle" style="border: 0; vertical-align: middle">Äàíî \ À, \ âåðíî \ ëè \ ÷òî \ äëÿ \ À \ âûïîëíÿåòñÿ \ ñâîéñòâî \ Õ?$$
Решением такой задачи будем считать ответ "ДА" или "НЕТ".

Среди бесконечного множества $$I_Ï$$ всех индивидуальных задач задачи $$Ï$$ (среди всех наборов исходных данных для задачи $$Ï$$) выделяют класс $$Y_Ï$$ – класс задач, имеющих ответ "ДА".
Будем считать, что у машины Тьюринга имеются состояния $$q_y$$ и $$q_n$$, соответствующие ответам "ДА" и "НЕТ".

Опр. 12. Класс $$NP$$ состоит из задач распознавания, которые можно решить недетерминированным полиномиальным алгоритмом.

Рассмотрим две эквивалентные модели недетерминированного полиномиального алгоритма.

I. Недетерминированный полиномиальный алгоритм состоит из двух стадий:
стадии угадывания и проверки.

Вначале по заданной индивидуальной задаче $$I_Ï$$ происходит генерация (или угадывание) некоторой структуры $$S$$. Затем структура $$S$$ передается на вход обычному детерминированному алгоритму (стадия проверки), который за полиномиальное число шагов заканчивается ответом "ДА" или "НЕТ".

Пример 1. Решим с помощью недетерминированного полиномиального алгоритма задачу "Коммивояжер" в форме задачи распознавания:
Условие. Имеется $$n$$ городов, известны целые положительные расстояния между каждой парой городов. Задано целое положительное число $$Â$$.
Вопрос. Существует ли гамильтонов цикл стоимостью меньше либо равной $$Â$$?

Алгоритм останавливается только в том случае, если ответ "ДА", иначе происходит генерация следующей догадки.
Если задача имеет ответ "НЕТ", то алгоритму придется сгенерировать все догадки и для каждой получить ответ "НЕТ".
На генерацию догадок в худшем случае тратится экспоненциальное время,
на проверку одной догадки – полиномиальное.


Изображение
Последний раз редактировалось Swetlana 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Swetlana
Сообщений: 2067
Зарегистрирован: 03 май 2012, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение Swetlana » 07 дек 2012, 20:27

II. НДМТ. Модель «черный ящик»

Представим ДМТ в виде модели «черный ящик».
В этой модели ДМТ можно представить как набор элементарных команд:
$$\{ +, \ *,\ -,\ /,\ Èëè,\ È,\ ×èòàòü,\ Ïèñàòü,\ Åñëè… \ Òî,\ Ïîâòîðÿòü... \ Ïîêà,\ Êîíåö\}.$$
К набору элементарных команд ДМТ добавим новую команду:
$$ÂÛÁÎÐ(Å), \ ãäå \ Å \ – \ ìíîæåñòâî»$$. Команда $$ÂÛÁÎÐ(Å)$$ применяется, когда для продолжения теукущего решения имеется несколько кандидатов из множества $$E$$.

На самом деле никакого выбора не происходит, потому что машина Тьюринга в текущей конфигурации копирует себя столько раз, сколько элементов в множестве $$Å$$, каждая копия получает своего кандидата, и все копии начинают работать параллельно и независимо.
Если одна из копий достигнет "УСПЕХ" (ответ "ДА"), то все копии останавливаются, если задача имеет ответ "НЕТ", то придётся ждать, когда все копии достигнут состояния "НЕУДАЧА", затем сольются в одну машину и остановятся.

У Детерминированной машины Тьюринга система каманд детерминирована, то есть не может быть двух разных команд с одинаковой левой частью.
У Недетерминированной машины Тьюринга может быть $$r$$ различных команд с однаковой левой частью. Таким образом, ДМТ - частный случай НДМТ при $$r=1$$.
$$\displaystyle q_{i}a_{j} \to \left \{ \begin{array}{l} \;\; q_{i}^{1}a_{j}^{1}d_{k}^{1} \;  \\ \;\; \ldots \;  \\ \;\;  q_{i}^{r}a_{j}^{r}d_{k}^{r} \;  \\ \end{array}$$

Изображение
Последний раз редактировалось Swetlana 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Swetlana
Сообщений: 2067
Зарегистрирован: 03 май 2012, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение Swetlana » 07 дек 2012, 21:16

Рассмотрим одну ветвь из множества параллельных независимых вычислений

Опр.13. Если вычисление по какой-то ветви НДМТ заканчивается в состоянии $$q_y$$, оно называется принимающим вычислением.

Опр. 14. НДМТ принимаемая вход $$\alpha$$, если хотя бы одно из параллельных вычислений является принимающим.

Опр. 15. Время, требуемое НДМТ, чтобы принять вход $$\alpha \in Y_Ï$$ - это минимальное число шагов принимающего вычисления от $$q_1$$ до $$q_y$$, где минимум берется по всем принимающим вычислениям.

Опр. 16. Временная сложность НДМТ-алгоритма
$$T_{ÍÄÌÒ}(n)=max\{1 \cup \{t: \ ñóùåñòâóåò \ òàêîé\ âõîä \ \alpha \in Y_Ï, \ |\alpha|=n, \ ÷òî \ âðåìÿ \ ïðèíÿòèÿ \ \alpha \ ðàâíî \ t\} \}$$

Заметим, что временная сложность НДМТ-алгоритма зависит только от числа шагов в принимающих вычислениях, оканчивающихся состоянием $$q_y$$. Если нет ни одного входа (индивидуальной задачи) размерности $$n$$ c jndtnjv "ДА", то полагаем сложность равной 1.

Опр. 17. Любая задача из класса $$NP$$ может быть решена на НДМТ за полиномиальное время
$$T_{ÍÄÌÒ}(n) \leq p(n) \ äëÿ \ âñåõ \ n \geq 1$$.
Последний раз редактировалось Swetlana 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
zykov
Сообщений: 1777
Зарегистрирован: 02 ноя 2009, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение zykov » 07 дек 2012, 23:53


Посмотрел. Довольно поверхностный обзор. Не советовал бы на это опиратся.

folk писал(а):Source of the post
Не соглашусь, для больших размерностей (а это подразумевается поскольку мы говорим об асимптотике) Гаусс уступает итерационным методам. Гаусс это куб а итерационные методы это квадрат на "константу".

Константы там быть не может. Довольно неплохой метод сопряженных градиентов сходится в общем случае примерно за n итераций. Соответственно для плотной матрицы одно умножение - это квадрат. И линейное количество итераций даёт тот же куб.
Гораздо более быстрая сходимость наблюдается только в специальных простых случаях, когда сама задача по сути проще её представления в виде линейного уравнения (например когда такое уравнение отражает слабую связь, а сама система по сути не связанна).

Для плотных (плотно заполненных) матриц метод Гаусса по сути единственный вариант. На практике плотные матрицы как правило не большие.
Гораздо чаще плотных матриц мы встречаем разреженные, например при решении уравнений в частных производных. Тут как правило используют итерационные методы, чтобы не менять саму матрицу (трудно менять сохраняя разреженность), а использовать только умножение вектора на матрицу. Для разреженной сложность умножения не квадрат, а линейная (если, как в случае частных производных, мы имеем постоянное количество ненулевых элементов в каждой строке).
Последний раз редактировалось zykov 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Swetlana
Сообщений: 2067
Зарегистрирован: 03 май 2012, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение Swetlana » 08 дек 2012, 12:15

НДМТ и алгоритмы с возвратом

НДМТ не только модель абстрактного вычислителя. Это ещё и способ организовать переборный алгоритм, даже если у нас нет возможности организовать параллельные независимые вычисления.

Алгоритм с возвратом (backtracking)

Рассмотрим общую схему алгоритма с возвратом на примере задачи поиска всех гамильтоновых циклов в неориентированном графе $$G=\langle V,E \rangle$$. Каждый такой цикл – последовательность различных вершин графа $$\langle X(1), \ldots, \ X(n+1) \rangle$$ и только $$X(1) = X(n+1) = k$$, где $$k$$ – произвольная фиксированная вершина, соседние вершины $$X(i) \ è \ X(i+1)$$ соединены ребром.

Вначале произведём полный перебор всех возможных путей. $$N$$ вершин графа можно расположить в $$n!$$ различных цепочек. Чтобы проверить для каждой цепочки, реализована ли она как гамильтонов путь на графе, необходимо еще $$n$$ шагов, итого сложность полного перебора $$n*n!$$ шагов.
Такая величина растет гораздо быстрее экспоненты, однако число шагов в алгоритмах переборного типа можно значительно уменьшить, оставаясь, разумеется, в классе экспоненциальных алгоритмов.

ОБЩАЯ СХЕМА АЛГОРИТМА С ВОЗВРАТОМ
Проще всего алгоритм с возвратом записать с помощью рекурсии, однако, для порядка, рассмотрим вначале нерекурсивный вариант.

Пусть решение, которое мы ищем, имеет вид последовательности $$\langle X(1), …, X(n) \rangle$$ .
Будем строить его, начиная с пустой последовательности длины $$0$$.
Пусть на каком-то этапе уже построено частичное (неполное) решение длины $$i: \langle X(1), …, X(i) \rangle$$.
Попытаемся продолжить это решение ещё на один шаг. Для этого нужно отыскать допустимое $$X(i+1)$$. $$X(i+1)$$ считается допустимым, если или $$\langle X(1), …, X(i+1) \rangle$$ уже является решением, или относительно $$\langle X(1), …, X(i+1) \rangle$$ нельзя сразу сказать, что это тупик, который невозможно расширить до полного решения.

Далее существует две возможности:
– если $$X(i+1)$$ допустимо, то следующее допустимое $$X$$ ищется для частичного решения $$\langle X(1), …, X(i+1) \rangle$$;
(заметим, что допустимость $$X(i+1)$$ вовсе не означает, что $$\langle X(1), …, X(i+1) \rangle$$ можно расширить до полного решения)
– если допустимого $$X(i+1)$$ не существует, то возвращаемся на шаг назад – к частичному решению $$\langle X(1), …, X(i-1) \rangle$$ и для него отыскиваем другое $$X^{&#39;}(i)$$, не совпадающее с предыдущим $$X(i)$$.

Более точно, пусть для каждого $$i>0$$ существует множество $$A(i)$$, из которого будут выбираться $$X(i)$$ – претенденты на $$i–$$ю координату частичного решения. Очевидно, множества $$A(i)$$ должны содержать все $$X(i)$$, занимающие $$i-$$ю координату любого решения. Кроме того, $$A(i)$$ будут содержать какие-то лишние элементы, не содержащие в $$i–$$й координате ни одного решения.

Теперь нерекурсивная схема алгоритма с возвратом имеет следующий вид:

Код: Выбрать все

1 begin
2 k:= 1;
3 while k>0 do
4 if существует еще новый y из A(k), являющийся допустимым then
5 begin
6 X[k]:= y;
7 y использован;
8 if <X[1],…,X[k]> является решением then write (<X[1],…,X[k]>);
9 k:= k+1;
10 end
11 else {возврат на предыдущее частичное решение, все элементы A(k) становятся новыми}
12 k:= k-1
13 end.


Если все решения имеют длину, меньшую $$n+1$$, и все множества $$A(k)$$ состоят из конечного числа элементов, то этот алгоритм находит все возможные решения.

Тот же самый алгоритм можно очень просто записать с помощью рекурсии.
Рекурсивный вариант алгоритма с возвратом

Код: Выбрать все

 1 procedure BC(k);
 {генерируем все решения, являющиеся продолжением частичного решения <X[1],…,X[k-1]>,
 массив Х– глобальный}
2 begin
3 for y из A(k) do
4 if y допустим then
5 begin
6 X[k]:= y;
7 if <X[1],…,X[k]> – решение then write(<X[1],…,X[k]>);
8 BC(k+1); // генерируем все решения, являющиеся продолжением
 // частичного решения <X[1],…,X[k-1],y>}
 // возврат
9 y новый; //возврат на <X[1],…,X[k-1]>
10 end // возврат на цикл 3
11 end;
Последний раз редактировалось Swetlana 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Swetlana
Сообщений: 2067
Зарегистрирован: 03 май 2012, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение Swetlana » 08 дек 2012, 13:23

ЗАДАЧА ГАМИЛЬТОНА

Применим общую схему алгоритма с возвратом для генерации всех гамильтоновых циклов в графе $$G=\langle V,E \rangle$$. $$A(i) = V \ ( \ ìíîæåñòâî \ âñåõ \ âåðøèí \ ) \ äëÿ \ ëþáîãî \ i $$</span>; <span class=$$" title="$$; $$" align="middle" style="border: 0; vertical-align: middle">Óñëîâèå \ äîïóñòèìîñòè \ y \ äëÿ \ ïðîäîëæåíèÿ \langle X(1), …, X(i-1) \rangle:$$</span> <span class=$$" title="$$ $$" align="middle" style="border: 0; vertical-align: middle">1. \ y \in ÇÀÏÈÑÜ[X(i-1)] \ ( \ âåðøèíà \ y \ ñîåäèíåíà \ ðåáðîì \ ñ \ X(i-1));$$</span> <span class=$$" title="$$ $$" align="middle" style="border: 0; vertical-align: middle">2. \ y \ íîâàÿ, \ òî \ åñòü \ íå \ ïðèíàäëåæèò \ \langle X(1), …, X(i-1) \rangle$$.

АЛГОРИТМ {Нахождение всех гамильтоновых циклов в графе}
Данные: Граф $$G=\langle V,E \rangle$$, представленный списками инцидентности $$ÇÀÏÈÑÜ[v], \ v \in V \ (ÇÀÏÈÑÜ[v]$$ - список всех вершин, соединённых с $$v$$ ребром) .
Результаты: Печать всех гамильтоновых циклов графа $$G$$.
Глобальные переменные: $$ÇÀÏÈÑÜ, \ X, \ DOP.$$

Код: Выбрать все

1 procedure GAMI(i);
 {генерация всех гамильтовых циклов, являющихся продолжением частичного решения <X[1],…,X[i-1]>}
2 begin
3 for y из ЗАПИСЬ[X[i-1]] do
4 if (i=n+1) AND (y=k) then write(X[1],…,X[n],k)
5 else if DOP[y] then
6 begin
7 X[i]:= y; DOP[y]:= ложь;
8 GAMI(i+1);
 //возврат
9 DOP[y]:= истина;
{все решения, продолжающие <X[1],…,X[i-1],y> уже сгенерированы, выбираем другое y', а y становится новым}
10 end
11 end;{GAMI}

1 begin {основная программа}
2 for v Є V do DOP[V]:= истина;
3 X[1]:= k; //k – произвольная вершина
4 DOP[k]:= ложь;
5 GAMI(2); //вызываем рекурсию для поиска второй вершины
6 end.


Протрассируем алгоритм для модельного графа и построим его дерево поиска (см. рисунок). Сложность этого алгоритма в наихудшем случае растет по экспоненте с ростом n.
Это справедливо и для случая, когда ищется ровно одно решение (если задача не имеет решения, то эта модификация не влияет на ход выполнения алгоритма).

Литература
Липский В. Комбинаторика для программистов. М.: Мир, 1988, 321 стр.


ЗЫ. чуть не забыла)))
посмотрите внимательно на дерево поиска для модельного графа!

алгоритм с возвратом обходит его слева направо поиском в глубину,
а НДМТ - поиском в ширину, равномерно идя от корня во все стороны по параллельным независимым вычислениям

Изображение
Последний раз редактировалось Swetlana 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Swetlana
Сообщений: 2067
Зарегистрирован: 03 май 2012, 21:00

Что вы всегда хотели узнать, но боялись спросить

Сообщение Swetlana » 08 дек 2012, 15:48

NT писал(а):Source of the post
[quote=Svetlana Fainshtein в t140542 (deleted)]как ни кодируй, что не подавай на вход - в любой модели эта задача решается за экспоненциальное число шагов
Ок. Понятно.
А вот если немного смодификовать задачу с цифровым замком $$10^4$$:
Дополнительно известно, что сумма всех цифр больше 5 и меньше 20.
В общем можно и дальше использовать "brute force", но вроде можно и иначе. Как тогда называется такой метод?
[/quote]

алгоритм с возвратом с отсечением заведомо неподходящих вариантов
консольное приложение для Дельфи 7

Код: Выбрать все

program NT;

{$APPTYPE CONSOLE}

uses
 SysUtils;

const
N = 4;

var
X,OptX,X0: array [1..N] of integer;
i: integer;
MinS, MaxS: integer; //минимальная и максимальная сумма цифр
flag: boolean; //нашли решение

procedure search (i,sum: integer);
//sum - сумма цифр с первой по i-1 -ю позиции
var
j,k: integer;
begin
 if not(flag) then begin
 for j:= 0 to 9 do //выбор цифры для заполнения i-й позиции кода
 //допустимость цифры
 if sum+j < MaxS then
 begin
 if i < N then //не последняя цифра
 begin
 X[i]:= j;
 search(i+1,sum+j);
 end
 else if i=N then//последняя цифра
 //допустимость цифры
 if sum+j > MinS then
 begin //проверка на полное решение
 X[i]:= j;
 flag:= true;
 for k:=1 to N do
 if X0[k]<>X[k] then flag:= false;
 if flag then //нашли решение
 begin
 for k:= 1 to N do OptX[k]:= X[k];
 exit;
 end;
 end
 end;
 end;
end; //search

begin //main
 //задаём код 1234
 X0[1]:= 1; X0[2]:= 2; X0[3]:= 3; X0[4]:= 4;
 //задаём минимальную и максимальную сумму цифр
 MinS:= 5; MaxS:= 20;
 //инициализация текущего и оптимального решения
 for i:= 1 to N do
 begin X[i]:= -1; OptX[i]:= -1; end;
 flag:= false; //решение не найдено

 //вызов рекурсии для заполнения первой цифры кода
 //текущая сумма кодовых цифр равна 0
 search(1,0);

 //печать решения
 for i:= 1 to N do write(OptX[i],' ');
 writeln; readln;
end.
Последний раз редактировалось Swetlana 28 ноя 2019, 15:08, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

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