grf
Зарегистрирован: 05.04.2005 Сообщения: 1242 Откуда: Москва
|
Добавлено: Чт Май 25 2006 16:48 Заголовок сообщения: Бредовая задача. Как формализовать и написать алгоритм? |
|
|
Есть некая странная задача, для решения которой мне надо написать прогу. Пока я не могу ее даже формализовать и придумать алгоритм решения, если у кого то будут предложения, поделитесь.
Задача такая: Есть набор целых чисел. Для простоты объяснения ограничимся числами не более 10. Необходимо получить из набора преведущих чисел следующее, используя набор некоторой логики (не формальной логики, тут бы как раз проблем не возникло, а более человеческой). Поясню на примере
Пусть есть шесть чисел
7 1 5 3 8 8
С первым числом ничего не делаем.
далее как получить из семерки единицу, например так: семерка стоит на первом месте, то поэтому следующие число единица.
далее, как из 7 1 получить 5, например так перед нами два числа, поэтому из первого (7) вычесть два. как получить три, теперь перед нами три числа, значит следующее тройка. Как получить 8, сложить преведущих два числа, 5+3, как получить еще раз 8, раз преведущая 8, то и последующая 8.
Т.е здесь не столько логика, сколько некоторые "Левые отмазки", объясняющие появление следующего числа.
При этом возможны комбинации нескольких шагов, например
5 3 1 7
Как получит 7, например 5+3-1
При этом надо получать число за наименьшее количество шагов. Можно спокойно хаотично пользоваться математическими действиями, поряком числа количеством преведущих чисел, в общем любой доступной информацией которая есть в последовательности до определяемого числа, но использовать можно только числа, доступные нам с нашей логикой. Поясню, например есть последовательность чисел
1 3 9 2 9 5 8
как получиь восьмерку. Нельзя просто сказать у нас есть тройка и пятерка поэтому 5+3=8, надо обосновать почему мы воспользуемся именно тройкой, например так
а) начиная от последнего числа(последнее число 5, т.к 8 мы только собираемся получить, отсчитаем 5 позиций, это число 3.
б) 5+3=8
Еще одно важное дополнение, числа 5, 10, 50, 100, 500, 1000 и т. д. мы можем использовать в любой момент, для любых действий.
Результатом действия программы должен быть свод правил, по которым мы получили заданную поледовательность чисел, т.е на входе программы у нас будет, например разобранная мной последовательность
7 1 5 3 8 8
а результатом действия программы будет свод действий, объясняющих эту последовательность
Цитата: |
С первым числом ничего не делаем.
далее как получить из семерки единицу, так: семерка стоит на первом месте, то поэтому следующие число единица.
далее, как из 7 1 получить 5, так перед нами два числа, поэтому из первого (7) вычесть два. как получить три, теперь перед нами три числа, значит следующее тройка. Как получить 8, сложить преведущих два числа, 5+3, как получить еще раз 8, раз преведущая 8, то и последующая 8. |
Все бы ничего, я еще может быть как то и разрулил сам бы ситуацию, но проблемы идут при работе с большими числами и с большим набором чисел. Например как обяснить последовательность из 3 чисел.
1754897 356789 907867553
Из преведущего числа всегда можно получить последующее самым примитивным способом
а б
б=а/a+a/a+.....+a/a
поэтому важно получить действие с минимальным количеством шагов.
P.S. Сам понимаю бредовость задачи, но с чем в жизни не столкнешся.
|
|
grf
Зарегистрирован: 05.04.2005 Сообщения: 1242 Откуда: Москва
|
Добавлено: Пт Май 26 2006 09:30 Заголовок сообщения: |
|
|
Спасибо, Kefir!
Что такое ЭС?
Второй вариант возможно использовать только как часть свода логики, т. к. он не учиттывает, например, никакой информации о порядке числа в последовательности.
Вообще пока двигаюсь в таком направлении
1. Составить перечень всей информации, которую можно извлечь из абстрактной последовательности (число, его порядковый номер, количество чисел перед ним и пр.)
2. На основе полученной инфомации составить свод правил, по котором можно получить какое нибудь число
3. составить алгоритм получения чисел на основе свода правил, из преведущей последовательности.
4. Составить ограничения на применение этих правил, например число шагов не должно быть больше определяемого числа, т.к.
Цитата: |
Из преведущего числа всегда можно получить последующее самым примитивным способом
а б
б=а/a+a/a+.....+a/a
|
5. перебор всех возможных комбинаций всех возможных сочетаний
правил нашего свода с учетом ограничений 4.
6. Выбор нужной комбинации |
|