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

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

03.11.2016, 18:48. Показов 2213. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru