Реферат: Математическая логика и теория алгоритмов
![](/file/7d5aacc146456be8f3642.jpg)
👉🏻👉🏻👉🏻 ВСЯ ИНФОРМАЦИЯ ДОСТУПНА ЗДЕСЬ ЖМИТЕ 👈🏻👈🏻👈🏻
4. Доказательство правильности алгоритма
Перечислить все способы расстановки n ферзей на шахматной доске n на n, при которых они не бьют друг друга.
Очевидно, на каждой из n горизонталей должно стоять по ферзю. Будем называть k-позицией (для k = 0, 1,...,n) произвольную расстановку k ферзей на k нижних горизонталях (ферзи могут бить друг друга). Нарисуем "дерево позиций": его корнем будет единственная 0-позиция, а из каждой k-позиции выходит n стрелок вверх в (k+1)-позиции. Эти n позиций отличаются положением ферзя на (k+1)-ой горизонтали. Будем считать, что расположение их на рисунке соответствует положению этого ферзя: левее та позиция, в которой ферзь расположен левее.
Данное дерево представлено только для наглядности и простоты представления для n=2.
Среди позиций этого дерева нам надо отобрать те n-позиции, в которых ферзи не бьют друг друга. Программа будет "обходить дерево" и искать их. Чтобы не делать лишней работы, заметим вот что: если в какой-то k-позиции ферзи бьют друг друга, то ставить дальнейших ферзей смысла нет. Поэтому, обнаружив это, мы будем прекращать построение дерева в этом направлении.
Точнее, назовем k-позицию допустимой, если после удаления верхнего ферзя оставшиеся не бьют друг друга. Наша программа будет рассматривать только допустимые позиции.
Разобьем задачу на две части: (1) обход произвольного дерева и (2) реализацию дерева допустимых позиций.
Сформулируем задачу обхода произвольного дерева. Будем считать, что у нас имеется Робот, который в каждый момент находится в одной из вершин дерева. Он умеет выполнять команды:
вверх_налево
(идти по самой левой из выходящих вверх стрелок)
вправо
(перейти в соседнюю справа вершину)
вниз
(спуститься вниз на один уровень)
и проверки, соответствующие возможности выполнить каждую из команд, называемые "есть_сверху", "есть_справа", "есть_снизу" (последняя истинна всюду, кроме корня). Обратите внимание, что команда "вправо" позволяет перейти лишь к "родному брату", но не к "двоюродному".
Будем считать, что у Робота есть команда "обработать" и что его задача - обработать все листья (вершины, из которых нет стрелок вверх, то есть где условие "есть_сверху" ложно). Для нашей шахматной задачи команде обработать будет соответствовать проверка и печать позиции ферзей.
Доказательство правильности приводимой далее программы использует такие определения. Пусть фиксировано положение Робота в одной из вершин дерева. Тогда все листья дерева разбиваются на три категории: над Роботом, левее Робота и правее Робота. (Путь из корня в лист может проходить через вершину с Роботом, сворачивать влево, не доходя до нее и сворачивать вправо, не доходя до нее.) Через (ОЛ) обозначим условие "обработаны все листья левее Робота", а через (ОЛН) - условие "обработаны все листья левее и над Роботом".
procedure вверх_до_упора_и_обработать
дано: Робот в корне, листья не обработаны
надо: Робот в корне, листья обработаны
if есть_справа then begin {ОЛН, есть справа}
{ОЛН, Робот в корне => все листья обработаны}
Осталось воспользоваться следующими свойствами команд Робота (сверху записаны условия, в которых выполняется команда, снизу - утверждения о результате ее выполнения):
(1)
{ОЛ, не есть_сверху} обработать {ОЛН}
(4)
{не есть_справа, ОЛН} вниз{ОЛН}
Теперь решим задачу об обходе дерева, если мы хотим, чтобы обрабатывались все вершины (не только листья).
Решение. Пусть x - некоторая вершина. Тогда любая вершина y относится к одной из четырех категорий. Рассмотрим путь из корня в y. Он может:
а) быть частью пути из корня в x (y ниже x);
б) свернуть налево с пути в x (y левее x);
г) свернуть направо с пути в x (y правее x);
В частности, сама вершина x относится к категории в). Условия теперь будут такими:
(ОНЛ) обработаны все вершины ниже и левее;
(ОНЛН) обработаны все вершины ниже, левее и над.
procedure вверх_до_упора_и_обработать
дано: Робот в корне, ничего не обработано
надо: Робот в корне, все вершины обработаны
if есть_справа then begin {ОНЛН, есть справа}
{ОНЛН, Робот в корне => все вершины обработаны}
Приведенная только что программа обрабатывает вершину до того, как обработан любой из ее потомков. Теперь изменим ее, чтобы каждая вершина, не являющаяся листом, обрабатывалась дважды: один раз до, а другой раз после всех своих потомков. Листья по-прежнему обрабатываются по разу:
Под "обработано ниже и левее" будем понимать "ниже обработано по разу, слева обработано полностью (листья по разу, остальные по два)". Под "обработано ниже, левее и над" будем понимать "ниже обработано по разу, левее и над - полностью".
procedure вверх_до_упора_и_обработать
дано: Робот в корне, ничего не обработано
надо: Робот в корне, все вершины обработаны
if есть_справа then begin {ОНЛН, есть справа}
{ОНЛН, Робот в корне => все вершины обработаны полностью}
Доказательство правильности алгоритма.
Докажем
, что приведенная программа завершает работу (на любом конечном дереве).
Доказательство
. Процедура вверх_налево завершает работу (высота Робота не может увеличиваться бесконечно). Если программа работает бесконечно, то, поскольку листья не обрабатываются повторно, начиная с некоторого момента ни один лист не обрабатывается. А это возможно, только если Робот все время спускается вниз. Противоречие.
Теперь реализуем операции с деревом позиций. Позицию будем представлять с помощью переменной k: 0..n (число ферзей) и массива c: array [1..n] of 1..n (c [i] - координаты ферзя на i-ой горизонтали; при i > k значение c [i] роли не играет). Предполагается, что все позиции допустимы (если убрать верхнего ферзя, остальные не бьют друг друга).
procedure begin_work; {начать работу}
function danger: boolean; {верхний ферзь под боем}
{b <=> верхний ферзь под боем ферзей с номерами < i}
or (abs(c[i]-c[k])=abs(i-k)); {диагональ}
function is_up: boolean {есть_сверху}
function is_right: boolean {есть_справа}
is_right := (k > 0) and (c[k] < n);
{возможна ошибка: при k=0 не определено c[k]}
function is_down: boolean {есть_снизу}
if (k = n) and not danger then begin
procedure UW; {вверх_до_упора_и_обработать}
В программе используется одномерный массив размерности n, поэтому объём входа и объём выхода совпадают и равны n. Количество пременных равно 3(i,b,k) + 1(const n), т.е. объём промежуточных данных равен 4.
Если рассматривать обработку каждого листа, без проверки на пути к нему, то временная сложность T(n) = n 0
+n 1
+n 2
+n 3
+…+n n
.
Но в случае, когда каждая вершина проверяется, временная сложность T(n) = o(n 0
+n 1
+n 2
+n 3
+…+n n
). И это тем вернее, чем больше n. Данный вывод получен на основе приведённых ниже статистических данных:
Построенная по описанному алгоритму программа при различных n выдаёт следующие данные:
Т.е. количество расстановок равно 2. Ниже приведена таблица зависимости от n количества решений (R).
1) Кузнецов О.П. Адельсон-Вельский Г.М. Дискретная математика для инженера. – М.: Энергоатомиздат, 1988.
2) Евстигнеев В.А. Применение теории графов в программировании. – М.:Наука, 1984.
3) Основной алгоритм находился на BBS “Master of Univercity” в файле shen.rar в файловой области “Bardak” (тел. 43-27-03; время работы 21.00 – 7.00; FTN адрес – 2:5090/58).
Название: Математическая логика и теория алгоритмов
Раздел: Рефераты по математике
Тип: реферат
Добавлен 06:57:07 24 марта 2008 Похожие работы
Просмотров: 801
Комментариев: 18
Оценило: 2 человек
Средний балл: 5
Оценка: неизвестно Скачать
Срочная помощь учащимся в написании различных работ. Бесплатные корректировки! Круглосуточная поддержка! Узнай стоимость твоей работы на сайте 64362.ru
Если Вам нужна помощь с учебными работами, ну или будет нужна в будущем (курсовая, дипломная, отчет по практике, контрольная, РГР, решение задач, онлайн-помощь на экзамене или "любая другая" учебная работа...) - обращайтесь: https://clck.ru/P8YFs - (просто скопируйте этот адрес и вставьте в браузер) Сделаем все качественно и в самые короткие сроки + бесплатные доработки до самой сдачи/защиты! Предоставим все необходимые гарантии.
Привет студентам) если возникают трудности с любой работой (от реферата и контрольных до диплома), можете обратиться на FAST-REFERAT.RU , я там обычно заказываю, все качественно и в срок) в любом случае попробуйте, за спрос денег не берут)
Да, но только в случае крайней необходимости.
Реферат: Математическая логика и теория алгоритмов
Реферат: Архитектура Руси 15 – 16 веков. Скачать бесплатно и без регистрации
Эксплуатация Разъединителей Реферат
Эссе На Тему Адаптации Сотрудников
Курсовая Работа На Тему Автокорреляционные Функции И Энергетические Спектры Погрешностей Наблюдений
План Сочинения По Роману Гончарова Обломов
Реферат по теме Глобальная информация и безопасность
Контрольная работа: Маршрутизація транспортних перевезень методом Кларка-Райта і її автоматизація в MS Excel
Реферат На Тему Культура Древнего Египта
Дипломная работа по теме Коррекция и развитие внимания у детей старшего дошкольного возраста
Сочинение Про Картину Золотая Осень
Реферат по теме Юниты по Гpажданскому пpаву
Реферат: Borland C++ Builder
Анализ Показателей Рентабельности Организации Курсовая Работа
Дипломная работа по теме Проект упаковки для пищевой промышленности
Морально Волевые Качества Личности Юриста Реферат
Реферат: Исследовательской работы
Сочинение по теме Тема чести и человеческого достоинства в одном из произведений русской литературы.
Сочинение По Истории Требования Егэ
Лекция На Тему Процедуры При Аудите Импортных Операций
Эссе Нефтегазовое Дело
Реферат: Киевская Русь
Сочинение: Особенности художественного изображения эпохи Ивана Грозного в творчестве А. К. Толстого
Статья: Можно ли прогнозировать устойчивость подземных выработок, не спускаясь в шахту