Сайт о телевидении

Сайт о телевидении

» » Методы оптимизации. Полный перебор

Методы оптимизации. Полный перебор

Задачи поиска предназначены для определения нахождения элемента, обладающего заданным свойством, в определенной совокупности данных, в частности, в массиве.

Линейный поиск.

Поиск наибольшего и наименьшего элемента в массиве.

Дан ряд чисел , , …, , …, . Разработать алгоритм поиска наибольшего и наименьшего числа в этом ряду с указанием номера (индекса) его расположения.

Очевидный способ поиска наибольшего (наименьшего) числа в заданном ряду n чисел включает следующие действия. Взять первое число ряда и сказать, что оно наибольшее (наименьшее), а индекс его равен 1. Затем взять второе число ряда и сравнить с предполагаемым максимальным (минимальным) первым числом. Если второе число больше предполагаемого (максимального) первого числа, взять третье число ряда и сравнить с первым. Так следует действовать до тех пор, пока не будет выбрано последнее число. В результате на месте первого числа окажется наибольшее (наименьшее) число с указанным его номером в ряду чисел.

Блок – схема алгоритма поиска наибольшего и наименьшего элемента на рис.18.

Рис. 18 Алгоритм нахождения наибольшего и наименьшего элемента в линейном массиве

Программа на языке Pascal представлена в Приложении 1, MaxMin.pas.

Бинарный поиск.

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

Рассмотрим алгоритм бинарного поиска на примере.

Пример. Пусть X = 6, а массив А состоит из 10 элементов:

3 5 6 8 12 15 17 18 20 25.

1-й шаг. Найдем номер среднего элемента среднего элементов: m = = 5.

3 5 6 8 12 15 17 18 20 25.

2-й шаг. Рассматриваем лишь первые 4 элемента массива, находим индекс среднего элемента этой части: m = = 2.

6 > А, следовательно, первый и второй элементы из рассмотрения исключаются:

3 5 6 8 12 15 17 18 20 25 ;

3-й шаг. Рассматриваем два элемента, значение m = = 3.

3 5 6 8 12 15 17 18 20 25 ;

А = 6. Элемент найден, его номер – 3.

Блок - схема алгоритма бинарного поиска на рис.19:




Программная реализация бинарного поиска представлена в Приложении 1, Binar.pas.

Случайный поиск.

Организация поиска k -го элемента в неупорядоченном массиве X возможна следующим образом. Выби­рается случайным образом элемент с номером q. Массив X раз­бивается на три части: элементы, меньшие X [q ], равные X [q ]и большие X [q ]. А затем, в зависимости от количества элементов в каждой части, выбирается одна из частей для дальнейшего поиска. Теоретическая оценка числа сравнений имеет порядок k*N, т. е. для худшего случая N 2 , но на практике он значительно быстрее.


СЛОЖНОСТЬ АЛГОРИТМОВ

Характеристики алгоритма, которые влияют на его применимость, принято называть характеристиками сложности алгоритма. Среди характеристик сложности наиболее важными являются две, характеризующие ресурсы исполнителя: время и память. Необходимо знать, как долго будет выполняться алгоритм и хватит ли ресурса памяти для этого. Время зависит от того, кто является исполнителем (человек, вычислительное устройство, компьютер), и от того, насколько быстро он делает операции (разные компьютеры обладают разной производительностью). Так как нужна объективная характеристика алгоритма, не зависящая от исполнителя, то вместо времени исполнения алгоритма будем рассматривать число шагов t выполнения алгоритма. Если – среднее время одного шага исполнителя, то фактическое время работы алгоритма для этого исполнителя.

Таким образом, t есть характеристика алгоритма, не зависящая от особенностей исполнителя, и потому математическая характеристика сложности алгоритма. Память S, используемая алгоритмом, также зависит от особенностей исполнителя. Если на каждом шаге алгоритма используется не более µ единиц памяти, то S ≤ µ · . Эта оценка очень грубая, так как t может значительно превосходить S. В большинстве случаев в качестве характеристики сложности алгоритма применяется характеристика t – число шагов выполнения алгоритма.

Трудоемкость алгоритмов.

Итак, зависит от исходных данных задачи. Зависимость эту не всегда возможно анализировать непосредственно. Вследствие этого целесообразно будет определить временные рамки выполнения алгоритма (максимальное и минимальное время), сколько в среднем будет выполняться алгоритм (среднее время). Но для любых вариантов задачи время (число шагов) ничем не ограничено. Так, при сортировке массива время, как правило, зависит от длины массива и растет с ростом числа элементов массива. Принято входные данные алгоритма характеризовать одним параметром или несколькими параметрами. Одной из таких характеристик является объем входных данных – число элементов входных данных. Эта характеристика объективно характеризует входные данные так же, как и число шагов объективно характеризует исполнение алгоритма. В свою очередь, устанавливают зависимость объема входных данных от одного или нескольких параметров, характеризующих задачу. Так, в задаче сортировки массива таким параметром является длина n массива.

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

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

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

где k – число вариантов других характеристик входных данных.


Трудоемкость алгоритма позволяет оценить время выполнения алгоритма при решении той или иной задачи:

При этом коэффициент статистически определяется для исполнителя или оценивается некоторой константой. Однако точный вид зависимости T(n) от аргумента n часто очень трудно установить. Поэтому вместо установления вида функции для трудоемкости оценивается быстрота роста этой функции при помощи некоторой простой функции f(n).

Говорят, что T(n) = O(f(n)), если |T(n)| ≤ C|f(n)| для всех значений n > n 0 . Такая оценка роста функции T(n) является односторонней, так как функция f(n) может расти быстрее. Лучше оценивать рост трудоемкости функцией f(n), имеющей тот же порядок роста, т. е. также |T(n)| ≥ C1|f(n)|. В этом случае пишут

T(n) = Θ(f(n)) и говорят, что рост T(n) оценивается ростом f(n). Наиболее простыми функциями, оценивающими рост трудоемкости, являются полиномы

В случае T(n) = Θ(p(n)), учитывая, что p(n) = Θ(n k), получаем T(n) = Θ(n k). Говорят, что в этом случае трудоемкость полиномиальна или алгоритм имеет полиномиальную трудоемкость. При k = 1 T(n) = Θ(n) и алгоритмы принято называть алгоритмами с линейной трудоемкостью.

Если есть два алгоритма A1 и A2 решения некоторой задачи и оба имеют полиномиальную трудоемкость, причем k1 < k2 , то говорят, что первый алгоритм имеет меньшую трудоемкость. Но меньшая трудоемкость не означает, что время решения задачи первым алгоритмом будет меньше, чем вторым. Так, пусть

Тогда при n < 10 оказывается, что время решения задачи для первого алгоритма больше, чем для второго. Однако, из определения ясно, что найдется такое n 0 (в примере n 0 = 10), что время решения задачи при n > n0 будет всегда меньше для первого алгоритма.

Трудоемкость алгоритма может иметь скорость роста меньшую, чем линейная. Например, или .

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

Причина, по которой используются только эти два названия трудоемкости (полиномиальная и экспоненциальная), состоит в том, что алгоритмы полиномиальной трудоемкости, как правило, эффективны, если показатель степени у полинома не слишком большой. А алгоритмы экспоненциальной трудоемкости не являются эффективными, так как время вычисления по этим алгоритмам растет очень быстро. В таблице показана скорость нарастания времени работы алгоритмов различной трудоемкости в секундах на компьютере с быстродействием 10 6 оп/сек.

n
0.00001 0.00002 0.00003 0.00004 0.00005
0.0001 0.0004 0.0009 0.00016 0.00025
0.001 0.008 0.0027 0.0064 0.125
0.1 3.2 24.3 1.7 мин 5.3 мин
0.001 1.0 17.9 мин 12,7 дн 35,7 лет
0.059 58 мин 6.5 лет 385500 лет 200 лет

При нескольких параметрах входных данных трудоемкость полиномиального алгоритма растет как полином от нескольких аргументов. Например,

Оценивание трудоемкости алгоритмов.

Процесс получения оценки трудоемкости называется оцениванием трудоемкости. Для этого следует анализировать алгоритм с точки зрения быстроты роста числа его шагов, при изменении параметров задачи (параметров входных данных). Прежде всего, в алгоритме следует выделить циклы. Если циклов нет, то число шагов линейной структуры алгоритма не зависит от параметров задачи и, следовательно, трудоемкость является константной, т. е. оценивается как Θ (1).

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

Если цикл B с числом повторений n(B) вложен в цикл A с числом повторений n(A) и циклы независимы (число повторений цикла B не зависит от выполнения цикла A ), то общее число повторений цикла B с учетом повторений цикла A составляет n(A) · n(B).

Отсюда правило: для вложенных независимых циклов их трудоемкости перемножаются Θ(AB) = Θ(A) · Θ(B).

Если вложенные циклы не являются независимыми, т. е. число повторений внутреннего цикла n i (B) зависит от номера i повторения при выполнении внешнего цикла, то нужно проанализировать, как зависит общее число повторений внутреннего цикла от параметров задачи.

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

Θ(A + B) = Θ(A) + Θ(B) = max{Θ(A), Θ(B)}.

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

Рассмотрим примеры оценивания трудоемкости на примере алгоритма сортировки массива методом «пузырька». Блок – схема алгоритма сортировки методом «пузырька» см. рис. 15

Алгоритм содержит вложенные циклы. Внешний цикл, в случае массива входных данных, упорядоченного по убыванию, будет выполняться максимальное число раз: n − 1 , а в случае входного массива, упорядоченного по возрастанию, будет выполняться только 1 раз. Внутренний цикл во втором случае выполняется n − 1 раз, а в первом случае циклы зависимы, но, внутренний цикл в среднем выполняется n/2 раз. Поэтому максимальная трудоемкость (входные данные первого случая) оценивается как

Θ(n) · Θ(n) = Θ(n 2) ,

а минимальная трудоемкость (входные данные второго случая) – как

Θ(1) · Θ(n) = Θ(n).

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


Похожая информация.


На практике распространенной является ситуация (это, в частности, показывают рассмотренные примеры), когда множество 3) включает в себя более чем одно допустимое состояние системы . Если при этом удается получить сразу несколько вариантов планов, то можно пытаться выбрать из них лучший план с позиций критерия системы). Это метод ограниченного перебора рациональных планов.  


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

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

Как видно, описанный здесь метод решения , основанный на полном переборе вершин, является значительно более простым л эффективным, нежели непосредственное использование метода множителей Лагранжа . В то же время не следует считать, что решение задач линейного программирования является простым делом, состоящим просто в полном переборе вершин множества допустимых значений переменных. Для того чтобы понять это, достаточно заметить, что вершина множества допустимых точек (в том случае, когда это множество имеет внутренние точки) в задаче (4.22) - (4.24) связана с обращением в равенства п ограничений из их совокупности (4.23), (4.24). Таким образом, вообще говоря, число вершин множества (4.23), (4.24) может равняться числу различных сочетаний по п ограничений из общего числа т + п. Число различных сочетания  

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

Направленный перебор. Начнем с точки, удовлетворяющей ограничениям (ее можно найти простым перебором). Будем последовательно или случайно (метод случайного поиска) менять ее координаты на определенную величину А, каждый раз переходя в точку с более высоким значением целевой функции . Если выйдем на плоскость ограничения, будем двигаться по ней, находя одну из координат по уравнению ограничения. Затем движение по ребру (когда два ограничения-неравенства переходят в равенства)... Остановка - в вершине линейного многогранника. Решение найдено (с точностью до А если необходимо, в окрестности найденного решения проводим направленный перебор с шагом Д/2, Д/4 и т.д.).  

Найдем объем заказываемой партии (0, при котором минимизируется функция средних затрат склада за единицу времени, т.е. функция Z (Q). На практике величины Q часто принимают дискретные значения, например из-за использования транспортных средств определенной грузоподъемности в этом случае оптимальное значение (бога.) находят перебором допустимых значений Q. Мы будем считать, что ограничений на принимаемые значения Q нет, тогда задачу на минимум функции Z (Q) можно решить методами дифференциального исчисления  

СИМПЛЕКСНАЯ ТАБЛИЦА (

Многомерные задачи, естественно, являются более сложными и трудоемкими, чем одномерные, причем обычно трудности при их решении возрастают при увеличении размерности. Для того чтобы вы лучше почувствовали это, возьмем самый простой по своей идее приближенный метод поиска наименьшего значения функции. Покроем рассматриваемую область сеткой G с шагом h (рис. 10.8) и определим значения функции в ее узлах. Сравнивая полученные числа между собой, найдем среди них наименьшее и примем его приближенно за наименьшее значение функции для всей области.


Рис. 10.8.

Как мы уже говорили выше, данный метод используется для решения одномерных задач. Иногда он применяется также для решения двумерных, реже трехмерных задач. Однако для задач большей размерности он практически непригоден из-за слишком большого времени, необходимого для проведения расчетов. Действительно, предположим, что целевая функция зависит от пяти переменных, а область определения G является пятимерным кубом, каждую сторону которого при построении сетки мы делим на 40 частей. Тогда общее число узлов сетки будет равно . Пусть вычисление значения функции в одной точке требует 1000 арифметических операций (это немного для функции пяти переменных). В таком случае общее число операций составит 10 11 . Если в нашем распоряжении имеется ЭВМ с быстродействием 1 млн. операций в секунду, то для решения задачи с помощью данного метода потребуется 10 5 секунд, что превышает сутки непрерывной работы. Добавление еще одной независимой переменной увеличит это время в 40 раз. Проведенная оценка показывает, что для больших задач оптимизации метод сплошного перебора непригоден. Иногда сплошной перебор заменяют случайным поиском. В этом случае точки сетки просматриваются не подряд, а в случайном порядке. В результате поиск наименьшего значения целевой функции существенно ускоряется, но теряет свою надежность.

4. Метод покоординатного спуска

Рассмотрим функцию двух переменных. Ее линии постоянного уровня представлены на рис. 10.9 , а минимум лежит в точке . (Напомним, что линией постоянного уровня называется кривая в двумерном сечении пространства параметров (в данном случае в плоскости (х1, х2) , значение функции на которой - константа). Простейшим методом поиска является метод покоординатного спуска . Из точки А мы производим поиск минимума вдоль направления оси х 1 и, таким образом, находим точку B , в которой касательная к линии постоянного уровня параллельна оси x 1 . Затем, производя поиск из точки B в направлении оси x 2 , получаем точку C , производя поиск параллельно оси x 1 , получаем точку D , и т.д. Таким образом, мы приходим к оптимальной точке. Любой из одномерных методов, описанных в предыдущей главе, может быть использован здесь для поиска вдоль оси. Очевидным образом эту идею можно применить для функций n переменных.


Рис. 10.9.

Рассмотрим данный метод более детально на примере некоторой целевой функции.

Пусть нужно найти наименьшее значение целевой функции u=f(M)=f(x 1 ,x 2 ,...,x n) . Здесь через M обозначена точка n -мерного пространства с координатами x 1 ,x 2 ,...,x n:M=(x 1 ,x 2 ,...,x n) . Выберем какую-нибудь начальную точку и рассмотрим функцию f при фиксированных значениях всех переменных, кроме первой: . Тогда она превратится в функцию одной переменной x 1 . Изменяя эту переменную, будем двигаться от начальной точки в сторону убывания функции, пока не дойдем до ее минимума при , после которого она начинает возрастать. Точку с координатами обозначим через M 1 , при этом .

Фиксируем теперь переменные: и рассмотрим функцию f как функцию одной переменной . Изменяя x 2 , будем опять двигаться от начального значения в сторону убывания функции, пока не дойдем до минимума при . Точку с координатами обозначим через M 2 , при этом . Проведем такую же минимизацию целевой функции по переменным x 3 ,x 4 ,...,x n . Дойдя до переменной x n , снова вернемся к x 1 и продолжим процесс.

Эта процедура вполне оправдывает название метода. С ее помощью мы построим последовательность точек M 0 ,M 1 ,M 2 ,.. . которой соответствует монотонная последовательность значений функции Обрывая ее на некотором шаге k , можно приближенно принять значение функции f(M k) за ее наименьшее значение в рассматриваемой области (рис. 10.10).

Отметим, что данный метод сводит задачу поиска наименьшего значения функции нескольких переменных к многократному решению одномерных задач оптимизации. Если целевая функция f(x 1 ,x 2 ,\ldots,x n задана явной формулой и является дифференцируемой, то мы можем вычислить ее частные производные и использовать их для определения направления убывания функции по каждой переменной и поиска соответствующих одномерных минимумов.

На рис. 10.10. изображены линии уровня некоторой функции двух переменных u=f(x,y) . Вдоль этих линий функция сохраняет постоянные значения, равные 1, 3, 5, 7, 9. Показана траектория поиска ее наименьшего значения, которое достигается в точке O , с помощью

Метод перебора - это самый простой способ решения любой задачи. Проще, наверное только метод подбора Если сразу подобрать (по наитию) ответ не получается, а неизвестных в задаче больше, чем накладываемых условий, то метод полного перебора - самое то. Конечно, для начала нужно убедиться, что все остальные варианты решения не подходят, и наложены все явные и неявные условия для ограничения перебираемых комбинаций, иначе время перебора всех возможных вариантов устремится к бесконечности.

Рассмотрим пару примеров применения метода перебора в решении различных задач.

Перебор последовательности

Допустим, нам встретилась последовательность цифр 141526418, и мы знаем, что в ней зашифровано латинскими буквами некое слово. Какой самый простой способ зашифровать слово? Конечно же, использовать шифр замены ! Число цифр нечётное, значит хотя бы одна буква закодирована всего одной цифрой. Но как отделить буквы первой десятки от последующих, кодируемых двумя цифрами? 14 - это AD или N? Вот тут-то нам и пригодится метод перебора. Переберём все комбинации из одной-двух цифр из диапазона .

В последовательности 141526418 можно выделить следующие удовлетворяющие нашим условиям комбинации: 1,2,4,5,6,8,14,15,18,26. Эти числа соответствуют буквам A,B,D,E,F,H,N,O,R,Z. Комбинации 41, 52 и 64 нам не подходят, так как в латинице всего 26 букв.

Перебирать будем так: сначала возьмём самую развёрнутую последовательность, где все буквы из первого десятка, а затем будем по очереди увеличивать используемые числа, то есть заменять последовательности 1-4 на 14, 1-5 на 15, 1-8 на 18, 2-6 на 26, перебирая все возможные комбинации.

    1-4-1-5-2-6-4-1-8 = ADAEBFDAH

    1-4-1-5-2-6-4-18 = ADAEBFDR

    1-4-1-5-26-4-1-8 = ADAEZDAH

    1-4-1-5-26-4-18 = ADAEZDR

    1-4-15-2-6-4-1-8 = ADOBFDAH

    1-4-15-2-6-4-18 = ADOBFDR

    1-4-15-26-4-1-8 = ADOZDAH

    1-4-15-26-4-18 = ADOZDR

    14-1-5-2-6-4-1-8 = NAEBFDAH

    14-1-5-2-6-4-18 = NAEBFDR

    14-1-5-26-4-1-8 = NAEZDAH

    14-1-5-26-4-18 = NAEZDR

    14-15-2-6-4-1-8 = NOBFDAH

    14-15-2-6-4-18 = NOBFDR

    14-15-26-4-1-8 = NOZDAH

    14-15-26-4-18 = NOZDR

Итого получили 16 вариантов. Единственное читаемое слово NOZDR (кому читаемое, а кому и нет ), получилось в самом конце. Оно и будет ответом. Вот если бы в самом начале была подсказка, что из последовательности 141526418 должно получиться 5 букв, то тогда задача решится однозначно. И перебор будет не нужен, потому что разбить на 5 букв последовательность 141526418 можно только одним единственным способом. Но такой подсказки не было, и метод перебора пригодился.

Перебор решений при недостатке условий

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

Учитель на уроке математики задал ученикам такую задачу: «У матери три дочери. Произведение возрастов дочерей = 40, сумма возрастов равна числу учеников в классе. Каков возраст каждой из дочерей?» Ну, ученики по-быстрому посчитали, сколько их всего в классе, и стали решать задачу. Решали-решали… Не решается. Попросили у учителя подсказку. Учитель подумал и говорит: «А, точно! У младшенькой голубенькие глазки!» . Ученики обрадовались, и решили задачу. А теперь вопрос вам: сколько же лет каждой из дочерей?

Если решать задачу в лоб (AxBxC=40, A+B+C=D, голубенькие глазки), то сразу наталкиваешься на кучу неизвестных и недостаток условий. 4 неизвестных, два уравнения и ещё голубенькие глазки!!! Как известно, сколько неизвестных, столько должно быть и независимых условий. У нас в задаче два нормальных условия и одно непонятное. Как же её решать?

А методом перебора! Во-первых, такие задачи по умолчанию решаются целочисленно. Найдём все комбинации из трёх целых чисел, произведение которых даёт 40. Заодно посчитаем сумму этих чисел. Оказывается, таких комбинаций не так уж и много - всего шесть.

    1x1x40=40, 1+1+40=42

    1x2x20=40, 1+2+20=23

    1x4x10=40, 1+4+10=15

    1x5x8=40, 1+5+8=14

    2x2x10=40, 2+2+10=14

    2x4x5=40, 2+4+5=11

Если бы учеников в классе было 42, 23, 15 или 11, то они бы сразу решили задачу. Но у них возникло затруднение - их было 14, и они никак не могли выбрать, какой же из вариантов 1-5-8 или 2-2-10 подходит. Но когда учитель сказал про голубые глазки, им это помогло определиться. Голубые глазки были у младшенькой, то есть была самая младшая дочь, а в варианте 2-2-10 младшеньких две. Значит, нам подходит только четвёртый вариант 1-5-8.

Казалось бы, практически нерешаемая задача, но метод перебора позволил её очень быстро решить. Поэтому не надо бояться решать задачи перебором. Довольно часто число возможных вариантов не так велико, как кажется вначале.