Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 86

Слишком медленный алгоритм искусственного интеллекта игры Балда

03.11.2016, 18:48. Показов 2245. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Столкнулся с одной сложностью при создании искусственного интеллекта (ИИ) для своей игры Балда. Сначала опишу алгоритм словами, затем приведу код.

Итак, мой алгоритм ИИ можно разделить на 4 этапа (попытаюсь описать максимально понятно):
• [1] Рекурсивно анализируется каждая клетка до заданной глубины. Результат (буква/пустая клетка, координаты и глубина рекурсии соответственно) сохраняется в переменные.
• [2] Из полученного результата (отдельные буквы/пустые клетки) на основе глубины рекурсии формируются последовательности букв/пустых клеток и сохраняются в новые переменные, предварительно отсекаются последовательности с дублированными клетками, с 2-мя и более пустыми клетками и без пустых клеток (т.е. проходят только с одной пустой клеткой).
• [3] В каждой полученной последовательности пустые клетки заменяются на каждую букву алфавита и результат сравнивается с каждым словом словаря (т.е. 3 цикла). Совпавшие слова (и другие данные) записываются в новые переменные.
• [4] Из совпавших слов выбирается 1 слово.

Я не знаю, насколько правильно я мыслю, если есть другие варианты - рад буду услышать.

Проблема же заключается в том, что на эмуляторе Genymotion данный алгоритм выполняется около 30 секунд, на реальном устройстве - больше минуты. Это слишком долго. Если же проверить на чистой Java, то выполняется быстро - 0,8 секунд.

Возникает вопрос: что нужно сделать, чтобы на Android-устройствах или -эмуляторах выполнялось хотя бы за 1-2 секунды? Ведь в приложениях-аналогах ИИ работает почти мгновенно. Пока что я без понятия, что в алгоритме можно улучшить.

Теперь приведу код. Т.к. он большой (не помещается в посту) - прикрепил файлами.
Вложения
Тип файла: zip Java.zip (44.1 Кб, 22 просмотров)
Тип файла: zip Android.zip (44.7 Кб, 17 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.11.2016, 18:48
Ответы с готовыми решениями:

Алгоритм искусственного интеллекта (ИИ)
Чтобы понять что-то серьезное, требуется начать с малого. Поэтому есть цель начать создавать ИИ с моделирования поведения простейших и...

Интегральная теория искусственного интеллекта
Ликбез. Когда вообще нужны новые теории? Очевидно, когда не работают старые. Как обстоит с этим делом в ИИ-строении? Давайте...

Реализация алгоритмов искусственного интеллекта
Есть книга: :Реализация алгоритмов искусственного интеллекта на языке PROLOG:

5
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
03.11.2016, 18:52
много букв, ниасилил
к тому же надо что-то качать

раскидать логи по методам (или воспользоваться профайлером) и отловить какой участок кода выполняется долго - вот его можно сюда и показать, а не два архива
0
2 / 2 / 0
Регистрация: 16.08.2013
Сообщений: 86
03.11.2016, 19:20  [ТС]
Паблито, самый долгий участок, который несравнимо дольше других выполняется, находится на 3-ем этапе (который я описал выше). Привожу код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        StringBuilder sb = new StringBuilder();
        String[] русскийАлфавит = new String[] {"А", "Б", "В", "Г", "Д", "Е", "Ж", "З", "И", "Й", "К",
                                                "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х",
                                                "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я"};
        int pos = -1;
        // перебираем "слова"(последовательности) и определяем позицию пустой клетки
        for(int i=0; i<alСлова.size(); ++i) {
            pos = alСлова.get(i).indexOf(" ");
            sb = new StringBuilder(alСлова.get(i));
            // заполняем пустую клетку буквами из алфавита
            for(int j=0; j<русскийАлфавит.length; ++j) {
                sb.replace(pos, pos+1, русскийАлфавит[j]);
                // сравниваем слово с заполненной буквой со словами из словаря
                for(int k=0; k<словарь.length; ++k) {
                    // добавляем найденное в словаре слово
                    if(sb.toString().equals(словарь[k]) && отсутствуетВСпискеИспользованных(sb.toString())) {
                        alКоорд1ЗаполненныхБукв.add(alКоорд1ПустыхКлеток.get(i));
                        alКоорд2ЗаполненныхБукв.add(alКоорд2ПустыхКлеток.get(i));
                        alЗаполненныеБуквы.add(русскийАлфавит[j]);
                        alНайдСлова.add(sb.toString());
                        alКоордНайдСлова.add(alКоордСлова.get(i));
                    }
                }
            }
        }
Но мне кажется, здесь вряд ли что-то можно оптимизировать, хотя кто знает...

upd: в словаре 11880 слов.

Добавлено через 11 минут
upd2: если закомментировать внутри if() - по скорости ничего не изменится. А вот если сам if(), т.е. не сравнивать со словарём - то скорость сразу становится приемлемой, около секунды.
0
1 / 0 / 0
Регистрация: 06.11.2016
Сообщений: 22
06.11.2016, 03:12
может не стоит sb.toString() 24к раз вызывать?
0
914 / 562 / 88
Регистрация: 13.02.2014
Сообщений: 2,082
09.11.2016, 07:22
Да тут как ни крути долго ждать. Логику надо другую, нейросети сейчас в тренде.
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
09.11.2016, 11:55
Алгоритм и правда никакой, в лоб искать тоже уметь надо. Я, конечно, не шибко понял, что там происходит, но 1) если идёт поиск в чём -то большом, и if выполняется только однажды, зачем проходить потом ещё 100500 раз, используй break/continue. 2) я не знаю, что у тебя в словаре, но почти наверняка его можно упорядочить или разбить на части. 3) опять же для меня загадка зачем проходить словарь в трёх циклах ("добавляем найденное в словаре слово"), ну и добавь всё сразу в одном цикле 1 раз.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.11.2016, 11:55
Помогаю со студенческими работами здесь

Написать программу искусственного интеллекта
Есть мечта написать программу искусственного интеллекта. Чтобы в процессе программа обучалась и повышала свой уровень. Так же, чтобы...

Модели и методы искусственного интеллекта
Народ, ОЧЕНЬ нужна книга &quot;модели и методы искусственного интеллекта&quot; (Матвеев, Свиридов, Алейникова).Точнее, мне оттуда нужен алгоритм...

Редакторы и языки искусственного интеллекта
Добрый день. Кто нибудь подскажите бесплатные редакторы и языки искусственного интеллекта для Windows

Разработка Искусственного Интеллекта (Дневник разработчика)
Всем привет! Программируя на PHP и перебирая код на нем, пришел к выводу, что мне не интересно заниматься разработкой сайтов, плагинов для...

Теоретический способ создания искусственного интеллекта 2
Искусственный интеллект(ИИ) создан достаточно давно. Под элементарным обучением следует понимать возможность объекта запоминать и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru