agent2.htm
Agent2 (вторая серия)
Пример с агентами оказался даже лучше, чем я ожидал, потому что у него оказалось продолжение.
Первый пример работал очень долго. Для 5 агентов где-то одна минута. Для 7 агентов я не дождался конца. Пробовал перейти к другому варианту задания перестановок в виде циклов. Там при дополнительных предположениях можно было убрать одну переменную из семи. Тогда время суперкомпиляции составило 1 час 10 минут. Для 8 агентов я ждал 4 часа и не дождался. Этот другой вариант был сложнее для изложения, и я не стал о нем даже упоминать.
Перестановка - это отображение конечного множества на себя. Такое отображение можно задавать табличкой (что во что переходит). Но отображение, в конце-концов - это функция. Так давайте перестановку и задавать функцией рефала.
Тогда программа выглядит так (функции, видно по их виду, я не писал сам, а получал суперкомпилятором из программы из первой серии). (смешной момент - имя F7 придумал суперкомпилятор, причем два раза, второй раз я исправил на F1).
* InputFormat: <F7 s.1 s.2 s.3 s.4 s.5 s.6 s.7 e.8 > F7 { s.1 s.2 s.3 s.4 s.5 s.6 s.7 "001" e.8 = s.1 <F7 s.1 s.2 s.3 s.4 s.5 s.6 s.7 e.8 > ; s.1 s.2 s.3 s.4 s.5 s.6 s.7 "002" e.8 = s.2 <F7 s.1 s.2 s.3 s.4 s.5 s.6 s.7 e.8 > ; s.1 s.2 s.3 s.4 s.5 s.6 s.7 "003" e.8 = s.3 <F7 s.1 s.2 s.3 s.4 s.5 s.6 s.7 e.8 > ; s.1 s.2 s.3 s.4 s.5 s.6 s.7 "004" e.8 = s.4 <F7 s.1 s.2 s.3 s.4 s.5 s.6 s.7 e.8 > ; s.1 s.2 s.3 s.4 s.5 s.6 s.7 "005" e.8 = s.5 <F7 s.1 s.2 s.3 s.4 s.5 s.6 s.7 e.8 > ; s.1 s.2 s.3 s.4 s.5 s.6 s.7 "006" e.8 = s.6 <F7 s.1 s.2 s.3 s.4 s.5 s.6 s.7 e.8 > ; s.1 s.2 s.3 s.4 s.5 s.6 s.7 "007" e.8 = s.7 <F7 s.1 s.2 s.3 s.4 s.5 s.6 s.7 e.8 > ; s.1 s.2 s.3 s.4 s.5 s.6 s.7 = ; } F1 { "001" e.1 = "002" <F1 e.1 > ; "002" e.1 = "003" <F1 e.1 > ; "003" e.1 = "004" <F1 e.1 > ; "004" e.1 = "005" <F1 e.1 > ; "005" e.1 = "006" <F1 e.1 > ; "006" e.1 = "007" <F1 e.1 > ; "007" e.1 = "001" <F1 e.1 > ; = ; } Eq { (s.a e.1) (s.a e.2) = <Eq (e.1) (e.2)>; ( ) ( ) = T; * (e.1) (e.2) = F; } |
Теперь составляю MST-схему
<Eq ( <F7 s.1 s.2 s.3 s.4 s.5 s.6 s.7 <F7 s.1 s.2 s.3 s.4 s.5 s.6 s.7 "001" "002" "003" "004" "005" "006" "007" > > ) ( <F1 "001" "002" "003" "004" "005" "006" "007" > ) >; |
F7 - неизвестная перестановка, F1 - известная циклическая.
Суперкомпилирую и через 11 секунд получаю нужный ответ
/* $ENTRY Go { = <Prout <Agentx0071 s.1 s.2 s.3 s.4 s.5 s.6 s.7 >> ; } */ * InputFormat: <Agentx0071 s.1 s.2 s.3 s.4 s.5 s.6 s.7 > Agentx0071 { "005" "006" "007" "001" "002" "003" "004" = T ; } |
Повторяю все что надо для 8 агентов и через 28 секунд получаю сообщение, что решений нет.
В чем тут дело.Два возможных ответа, которые могут быть, таковы.
(1). В первой серии суперкомпилятору приходилось все интерпретировать, обрабатывать более сложную программу. Здесь же только две функции, и поэтому все происходит быстрее. Вызывает удивление, что настолько быстрее.
(2). Может быть, теперь суперкомпилятор производит не просто перебор всех случаев, а какой-то анализ. В пользу этого говорит отношение времен 28 / 11 - вовсе не 8 раз. Не понятно, сколько случаев перебирает суперкомпилятор.
Для определения количество случаев, которые перебирает суперкомпилятор убрал * в функции Eq - теперь предложения с ложью строятся (в первой серии я пробовал это делать - получается невообразимая программа).
Время суперкомпиляции чуть-чуть увеличивается. Для 7 агентов происходит перебор примерно 200 случаев (в одном случае T, в остальных - F), для 8 - примерно 500 случаев (везде F). Так что суперкомпилятор не просто перебирает, а как-то проявляет свой интеллект.
Приведу остаточную программу для 5 агентов (для обозримости)
* InputFormat: <Agentx1 s.1 s.2 s.3 s.4 s.5 > Agentx1 { "001" s.2 s.3 s.4 s.5 = F ; "002" "002" s.3 s.4 s.5 = F ; "002" s.2 s.3 s.4 s.5 = F ; "003" "001" "002" s.4 s.5 = F ; "003" "002" "002" s.4 s.5 = F ; "003" "003" "002" s.4 s.5 = F ; "003" "004" "002" "003" s.5 = F ; "003" "004" "002" s.4 s.5 = F ; "003" "005" "002" s.4 "003" = F ; "003" "005" "002" s.4 s.5 = F ; "003" s.2 s.3 s.4 s.5 = F ; "004" "001" s.3 "002" s.5 = F ; "004" "002" s.3 "002" s.5 = F ; "004" "003" "003" "002" s.5 = F ; "004" "003" s.3 "002" s.5 = F ; "004" "004" s.3 "002" s.5 = F ; "004" "005" "001" "002" "003" = T ; "004" "005" "002" "002" "003" = F ; "004" "005" "003" "002" "003" = F ; "004" "005" "004" "002" "003" = F ; "004" "005" "005" "002" "003" = F ; "004" "005" s.3 "002" s.5 = F ; "004" s.2 s.3 s.4 s.5 = F ; "005" "001" s.3 s.4 "002" = F ; "005" "002" s.3 s.4 "002" = F ; "005" "003" "003" s.4 "002" = F ; "005" "003" s.3 s.4 "002" = F ; "005" "004" "001" "003" "002" = F ; "005" "004" "002" "003" "002" = F ; "005" "004" "003" "003" "002" = F ; "005" "004" "004" "003" "002" = F ; "005" "004" "005" "003" "002" = F ; "005" "004" s.3 s.4 "002" = F ; "005" "005" s.3 s.4 "002" = F ; "005" s.2 s.3 s.4 s.5 = F ; } |
Перебор 35 случаев.
Несколько раз в переписке упоминалось об использовании примера на презентациях. Способ подачи этого примера будет зависеть от публики. Можно только говорить о второй серии. Можно про обе серии сразу.
Советую учитывать тот психологический момент, что эта задача об агентах не является простой (просто как задача). Мне самому пришлось напрячься и подумать минут 10. Попробуйте придумать решение, которое поймет младший школьник (младший - это не первый класс, а 5-6). Поэтому, при наличии времени имеет прямой смысл дать подумать минут 5-10 слушателям.
Мой способ изложения больше напоминает показ фокуса. Целью прошлого и этого писем было только рассказать об экспериментах.