image


Хватит тратить время на скучные академические фолианты! Изучение Computer Science может быть веселым и увлекательным занятием.

Владстон Феррейра Фило знакомит нас с вычислительным мышлением, позволяющим решать любые сложные задачи. Научиться писать код просто — пара недель на курсах, и вы «программист», но чтобы стать профи, который будет востребован всегда и везде, нужны фундаментальные знания. Здесь вы найдете только самую важную информацию, которая необходима каждому разработчику и программисту каждый день.

3.5. Эвристические алгоритмы


В обычных шахматах — 32 фигуры шести типов и 64 клетки, по которым они ходят. После каких-то четырех первых ходов число возможных дальнейших позиций достигает 288 млрд. Даже самые сильные игроки в мире не в состоянии найти идеальный ход. Они полагаются на интуицию, чтобы найти тот, который окажется достаточно хорошим. Мы можем делать то же самое при помощи алгоритмов. Эвристический метод, или просто эвристика, — это метод, который приводит к решению, не гарантируя, что оно — лучшее или оптимальное. Эвристические алгоритмы помогут, когда методы вроде полного перебора или поиска с возвратом оказываются слишком медленными. Существует много отличных эвристических подходов, но мы сосредоточимся на самом простом: на поиске без возврата.

«Жадные» алгоритмы


Очень распространенный эвристический подход к решению задач — использование так называемых «жадных» алгоритмов. Основная их идея состоит в том, чтобы никогда не откатываться к предыдущим вариантам. Это полная противоположность поиску с возвратом. Иными словами, на каждом шаге мы пытаемся сделать самый лучший выбор, а потом уже не подвергаем его сомнению. Давайте испытаем эту стратегию, чтобы по-новому решить задачу о рюкзаке (из раздела «Полный перебор» ).

Жадный грабитель и рюкзак. Грабитель пробирается в ваш дом, чтобы украсть предметы, которые вы хотели продать. Он решает использовать ваш рюкзак, чтобы унести в нем украденное. Что он возьмет? Имейте в виду, что чем быстрее он уйдет, тем меньше вероятность, что его поймают с поличным.

В сущности, оптимальное решение здесь должно быть ровно таким же, что и в задаче о рюкзаке. Однако у грабителя нет времени для перебора всех комбинаций упаковки рюкзака, ему некогда постоянно откатываться назад и вынимать уже уложенные в рюкзак вещи! Жадина будет совать в рюкзак самые дорогие предметы, пока не заполнит его:

function greedy_knapsack(items, max_weight)
      bag_weight < 0
      bag_items < List.new
      for each item in sort_by_value(items)
           if max_weight ? bag_weight + item.weight
                 bag_weight < bag_weight + item.weight
                 bag_items.append(item)
      return bag_items

Здесь мы не принимаем во внимание то, как наше текущее действие повлияет на будущие варианты выбора. Такой «жадный» подход позволяет отыскать подборку предметов намного быстрее, чем метод полного перебора. Однако он не дает никакой гарантии, что общая стоимость подборки окажется максимальной.

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

Снова коммивояжер. Коммивояжер должен посетить n заданных городов и закончить маршрут в той точке, откуда он его начинал. Какой план поездки позволит минимизировать общее пройденное расстояние?

Как мы убедились в разделе «Комбинаторика» (см. главу 1), число возможных комбинаций в этой задаче демонстрирует взрывной рост и достигает неприлично больших величин, даже если городов всего несколько. Найти оптимальное решение задачи коммивояжера с тысячами городов — чрезвычайно дорого (а то и вовсе невозможно).

И тем не менее вам нужен маршрут. Вот простой «жадный» алгоритм для этой задачи:

1) посетить ближайший город, где вы еще не были;
2) повторять, пока не объедете все города.

image

Можете ли вы придумать более хороший эвристический алгоритм, чем тот, что использует «жадный» подход? Специалисты по информатике вовсю ломают голову над этим вопросом.

Когда жадность побеждает силу


Выбирая эвристический алгоритм вместо классического, вы идете на компромисс. Насколько далеко от идеального решения вы можете отойти, чтобы результат все еще удовлетворял вас? Это зависит от конкретной ситуации.

Впрочем, даже если вам непременно требуется найти идеальный вариант, не стоит сбрасывать эвристику со счетов. Эвристический подход иногда приводит к самому лучшему решению. Например, вы можете разработать «жадный» алгоритм, способный найти такое же решение, что и алгоритм полного перебора. Давайте посмотрим, как такое осуществляется.

Электрическая сеть. Поселки в удаленном районе не были электрифицированы, но вот в одном из них начали строить электростанции. Энергия пойдет от поселка к поселку по линиям электропередач. Как включить все поселки в сеть, используя минимум проводов?
Данная задача может быть решена очень просто.

1.Среди поселков, еще не подключенных к сети, выбрать тот, который находится ближе всех к электрифицированному поселку, и соединить их.
2.Повторять, пока все поселки не будут подключены.

image

На каждом шаге мы выбираем для соединения пару поселков, которая на текущий момент выглядит самой лучшей. Несмотря на то что мы не анализируем, как этот вариант влияет на будущие возможности выбора, присоединение самого близкого поселка без электричества — всегда правильный выбор. Здесь нам повезло: структура задачи идеально подходит для решения «жадным» алгоритмом. В следующем разделе мы увидим структуры задач, для решения которых нужна стратегия великих полководцев.

» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок

Для Хаброжителей скидка 20% по купону — Computer Science

Комментарии (19)


  1. akryukov
    15.05.2018 13:02

    В книге есть задачи на самостоятельное решение?
    Алгоритмы даются сразу законченными или проиллюстрирован ход мыслей, который привел к решению?


    1. zartarn
      15.05.2018 13:07

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


  1. SidMeier
    15.05.2018 14:33

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


    1. ph_piter Автор
      15.05.2018 14:40

      Переслали в IT отдел, спасибо.


  1. Viacheslav01
    15.05.2018 14:47

    Был раньше аккаунт, теперь нет, вы проводили чистку?


    1. ph_piter Автор
      15.05.2018 14:57

      Нет.


  1. lostpassword
    15.05.2018 15:14

    А на КДПВ перевод точно верный? В оигинале условие так и выглядит — «while (!not_morning)»? Двойное отрицание получается, странно это выглядит.


    1. deNULL
      15.05.2018 15:32

      В оригинале всё правильно, это переводчик привнёс своего.
      image


      1. ph_piter Автор
        15.05.2018 15:45

        Перестарался наш переводчик.
        Конечно мы все будем пеить и танцевать пока не наступит утро.
        while (! утро){

        Хотя и в двойном отрицании что-то философское есть


  1. DnV
    15.05.2018 15:53

    Задача про электрическую сеть = коммивояжёру, условие возвращения не так важно. Так почему, вдруг, с ней нам «повезло»?


    1. DnV
      15.05.2018 15:58

      А, понял, можно несколько линий из одного посёлка тянуть. Иллюстрация сбивает с толку.


  1. Ranc58
    15.05.2018 16:00
    +1

    Только сегодня купил печатный экземпляр. Стиль книги нравится, напомнило "грокаем алгоритмы"


  1. vmm86
    15.05.2018 18:41

    Заказал заранее, где-то за 2 недели до выхода, когда были другие праздничные скидки. По первым главам впечатление приятное.


  1. Nookie-Grey
    15.05.2018 18:52

    <параноик-mode-on>Какие-то коментарии купленные<параноик-mode-off>


  1. maslyaev
    15.05.2018 20:32

    «Выберите пункт самовывоза» почему-то не показывает ни одного пункта. Они существуют?


    1. maslyaev
      15.05.2018 20:39

      Починилось. Спасибо.


  1. naneri
    15.05.2018 22:44

    А в Кыргызстан можно заказать? Или только в России? :/


  1. potan
    16.05.2018 08:06

    Там совсем минимум. В главе про логику даже логика предикатов первого порятка не рассматривается, а она очень важна.


  1. Tumenbayev
    16.05.2018 12:17

    Хотел бы заказать в Казахстан, реально ли?