Простейший рекурсивный алгоритм с возвратом и эвристикой решения задачи о ходе коня::Журнал СА 12.2018
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Подписка
Архив номеров
Где купить
Наука и технологии
Авторам
Рекламодателям
Контакты
   

Пройдите опрос. Монитор технологий. ИИ-блок


  Опросы
  Статьи

День сисадмина  

Учите матчасть! Или как стать системным администратором

Лето – время не только отпусков, но и хорошая возможность определиться с профессией

 Читать далее...

День сисадмина  

Живой айтишник – это всегда движение. Остановка смерти подобна

Наши авторы рассказывают о своем опыте и дают советы начинающим системным администраторам.

 Читать далее...

Виртуализация  

Рынок решений для виртуализации

По данным «Обзора российского рынка инфраструктурного ПО и перспектив его развития», сделанного

 Читать далее...

Книжная полка  

Как стать креативным и востребованным

Издательский дом «Питер» предлагает новинки компьютерной литературы, а также книги по бизнесу

 Читать далее...

Книжная полка  

От создания сайтов до разработки и реализации API

В издательстве «БХВ» недавно вышли книги, которые будут интересны системным администраторам, создателям

 Читать далее...

Разбор полетов  

Ошибок опыт трудный

Как часто мы легко повторяем, что не надо бояться совершать ошибки, мол,

 Читать далее...

Принципы проектирования  

Dependency Inversion Principle. Принцип инверсии зависимостей в разработке

Мы подошли к последнему принципу проектирования приложений из серии SOLID – Dependency

 Читать далее...

Рынок труда  

Вакансия: Администратор 1С

Администратор 1С – это специалист, который необходим любой организации, где установлены программы

 Читать далее...

Книжная полка  

Книги для профессионалов, студентов и пользователей

Книги издательства «БХВ» вышли книги для тех, кто хочет овладеть самыми востребованными

 Читать далее...

Принципы проектирования  

Interface Segregation Principle. Принцип разделения интерфейсов в проектировании приложений

Эта статья из серии «SOLID» посвящена четвертому принципу проектирования приложений – Interface

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 11064
Комментарии: 0
Потоковая обработка данных

 Читать далее...

19.03.2018г.
Просмотров: 9305
Комментарии: 0
Релевантный поиск с использованием Elasticsearch и Solr

 Читать далее...

19.03.2018г.
Просмотров: 9362
Комментарии: 0
Конкурентное программирование на SCALA

 Читать далее...

19.03.2018г.
Просмотров: 5885
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 6585
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

12.03.2018г.
Просмотров: 3893
Комментарии: 0
Глубокое обучение с точки зрения практика

 Читать далее...

12.03.2018г.
Просмотров: 2848
Комментарии: 0
Изучаем pandas

 Читать далее...

12.03.2018г.
Просмотров: 3648
Комментарии: 0
Программирование на языке Rust (Цветное издание)

 Читать далее...

19.12.2017г.
Просмотров: 3650
Комментарии: 0
Глубокое обучение

 Читать далее...

19.12.2017г.
Просмотров: 6134
Комментарии: 0
Анализ социальных медиа на Python

 Читать далее...

Друзья сайта  

 Простейший рекурсивный алгоритм с возвратом и эвристикой решения задачи о ходе коня

Архив номеров / 2018 / Выпуск №12 (193) / Простейший рекурсивный алгоритм с возвратом и эвристикой решения задачи о ходе коня

Рубрика: Карьера/Образование /  Кафедра   | Дополнительные материалы

Кирилл Ткаченко КИРИЛЛ ТКАЧЕНКО, инженер 1-й категории, ФГАОУ ВО «Севастопольский государственный университет», tkachenkokirillstanislavovich@gmail.com

Простейший рекурсивный алгоритм
с возвратом и эвристикой решения задачи о ходе коня

Простейший рекурсивный алгоритм с возвратом и эвристикой решения задачи о ходе коняРассматривается реализация рекурсивного алгоритма с возвратом. Решается задача о ходе коня при использовании эвристики по Варнсдорфу для сокращения перебора. Программа реализовывается на школьном алгоритмическом языке, приводятся полный исходный текст и результаты работы

Изучение и совершенствование программирования, возможно, целесообразно производить на решении классических задач, для которых программная реализация имеет умеренную сложность.

Одной из таких задач является классическая задача о ходе коня [1], которая сводится к построению маршрута коня на шахматной доске, покрывающего все клетки доски. Для нее известны многочисленные программные реализации наПаскале [1] и подобным ему языкам, хрестоматийные программные реализации [2] и на языке 1С [3]. Для начального обучения программированию подходит школьный алгоритмический язык.

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

В целочисленных переменных N находится размер стороны шахматной доски, NN – количество клеток шахматной доски, Ndydx – наибольшее возможное число ходов из одной клетки для коня:

цел N = 8
цел NN
цел Ndydx = 8

В одномерных целочисленных массивах dy и dx хранятся приращения координаты для возможного хода коня из конкретной клетки шахматной доски:

цел таб dy[1:Ndydx]
цел таб dx[1:Ndydx]

Сама шахматная доска располагается в двумерном целочисленном массиве доска, на каждой клетке массива находится номер хода коня при посещении клетки:

цел таб доска[1:N, 1:N]

Целочисленные переменные кодСимволаA1 и лучшийВесНач хранят соответственно код символа «a» минус 1 и лучший начальный вес для эвристики:

цел кодСимволаA1
цел лучшийВесНач

Головной алгоритм выполняет инициализацию, после устанавливает на поле a1 коня:

алг SAMAG
нач
  Инициализация
  доска[1, 1] := 1;

Если из поля a1 возможно решение, то заполненная перемещениями коня шахматная доска печатается, иначе решений нет:

  если Решить(2, 1, 1)
    то
      ПечатьДоски;
    иначе
      вывод "Нет решений.", нс;
  все
кон

Алгоритм Инициализация производит установку начальных значений переменных. Целочисленные переменные у и x – счетчики циклов:

алг Инициализация
нач
  цел y, x;

В целочисленную переменную NN помещается количество клеток шахматной доски, в кодСимволаA1 – код символа «a» минус 1:

  NN := N * N;
  кодСимволаA1 := код("a") - 1;

Заполняются приращения координаты dy:

  dy[1] := 2;
  dy[2] := 1;
  dy[3] := -1;
  dy[4] := -2;
  dy[5] := -2;
  dy[6] := -1;
  dy[7] := 1;
  dy[8] := 2;

Заполняются приращения координаты dx:

  dx[1] := 1;
  dx[2] := 2;
  dx[3] := 2;
  dx[4] := 1;
  dx[5] := -1;
  dx[6] := -2;
  dx[7] := -2;
  dx[8] := -1;

Лучший начальный вес полагается равным (Ndydx+1)2:

  лучшийВесНач := (Ndydx + 1) * (Ndydx + 1);

Конь вначале не посетил ни одной клетки шахматной доски:

  нц для y от 1 до N
    нц для x от 1 до N
      доска[y, x] := 0;
    кц
  кц
кон

Алгоритм ПечатьДоски выводит на устройство вывода шахматную доску. Целочисленные переменные yx – счетчики циклов:

алг ПечатьДоски
нач
  цел y, x;

Сообщаются по каждой горизонтали соответствующие клетки шахматной доски:

  нц для y от N до 1 шаг -1
    вывод y, " ";
    нц для x от 1 до N
      вывод доска[y, x]:4;
    кц
    вывод нс;
  кц

Затем отображаются номера вертикалей:

  вывод "  ";
  нц для x от 1 до N
    вывод "   ", символ(кодСимволаA1 + x);
  кц
  вывод нс;
кон

Алгоритм МожноХодить возвращает «да», если клетка с целочисленными координатами y и x принадлежит шахматной доске и на нее конь не ходил, и «нет», в противном случае:

алг лог МожноХодить(цел y, цел x)
нач
  знач := (1 <= y) и (y <= N) и (1 <= x) и (x <= N) и (доска[y, x] = 0);
кон

Алгоритм ЛучшийХод с учетом эвристики по Варнсдорфу для расположения коня в клетке с координатами y и x возвращает номер направления перемещения, пригодного для использования в качестве индекса массивов dy и dx. Вцелочисленных переменных лучшееНапр и лучшийВес находятся найденные лучшее направление перемещения и вес для него, напрнапр2вес – номер направления перемещения, номер следующего за ним направления, вес по следующему направлению рассчитанный, nynx – новые координаты местоположения коня с учетом приращений координат:

алг цел ЛучшийХод(цел y, цел x)
нач
  цел лучшееНапр, лучшийВес;
  цел напр, напр2, вес;
  цел ny, nx;

Вначале лучшее направление перемещения неопределенно и лучшим весом направления перемещения считается наибольший возможный с запасом:

  лучшееНапр := -1;
  лучшийВес := лучшийВесНач;

По всем номерам возможных направлений перемещения коня формируется новое положение коня:

  нц для напр от 1 до Ndydx
    ny := y + dy[напр];
    nx := x + dx[напр];

Если в эту клетку шахматной доски можно ходить, то производится оценка веса этой клетки:

    если МожноХодить(ny, nx)
      то
        вес := 0;

Для этого подсчитывается количество клеток доски, в которые из рассматриваемой клетки возможен переход конем, то есть вес клетки доски:

        нц для напр2 от 1 до Ndydx
          если МожноХодить(ny + dy[напр2], nx + dx[напр2])
            то
              вес := вес + 1;
          все
        кц

Если вес меньше лучшего, то запоминаются направление и вес:

        если вес < лучшийВес
          то
            лучшееНапр := напр;
            лучшийВес := вес;
        все
    все
  кц

Возвращается значение номера лучшего по эвристике направления:

  знач := лучшееНапр;
кон

Алгоритм Решить ищет решение рекурсивно начиная с хода коня номерХода, когда конь находится на клетке шахматной доски с координатами y и x. В целочисленных переменных содержатся: напр – номер направления в любом измассивов с приращениями, nynx – координаты клетки, куда конь пойдет:

алг лог Решить(цел номерХода, цел y, цел x)
нач
  цел напр;
  цел ny, nx;

Если номер хода коня превышает число клеток, то успешное завершение:

  если номерХода > NN
    то
      знач := да;
      выход;
  все

Иначе определяем лучшее направление перемещения и координаты для хода коня:

  напр := ЛучшийХод(y, x);
  ny := y + dy[напр];
  nx := x + dx[напр];

Если конь этот ход может совершить, то он его совершает:

  если МожноХодить(ny, nx)
    то
      доска[ny, nx] := номерХода;

Если допускается решение из совершенного хода, то ус-пешное завершение, иначе происходит отмена хода коня:

      если Решить(номерХода + 1, ny, nx)
        то
          знач := да;
          выход;
        иначе
          доска[ny, nx] := 0;
      все
  все

В любом другом случае решений нет:

  знач := нет;
кон

Рисунок 1. Результаты работы программы

Рисунок 1. Результаты работы программы

Полный исходный текст программы находится на сайте журнала http://samag.ru. Статья позволят изучать и совершенствовать программирование на примере классической задачи информатики с умеренной сложностью.

  1. Вирт Н. Алгоритмы + структуры данных = программы / Н. Вирт. – М.: Мир, 1985. 406 с.
  2. Knight's tour // Rosetta Code. URL: http://rosettacode.org/wiki/Knight's_tour (дата обращения: 04.10.2018).
  3. Ткаченко К. Простейший рекурсивный алгоритм с возвратом и эвристикой в 1С на примере задачи о ходе коня. // «Системный администратор», № 1-2, 2018 г. – С. 65-67. URL: http://samag.ru/archive/article/3584 (дата обращения:04.10.2018).

Ключевые слова: задача о ходе коня, рекурсивный алгоритм с возвратом, рекурсивный алгоритм с эвристикой, школьный алгоритмический язык.


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru