Необхідно написати систему, яка зможе приймати рішення за персонажа, який може зустріти одного або декілька ворогів. Системі може бути відомо:
здоров'я персонажа в процентах;
Відповідь має бути у вигляді одного з дій:
ховатися (для раптової атаки);
нічого не робити.
Для навчання складемо таблицю #xAB; уроків # xBB ;:
Здоров'я пістолет Вороги Дія
50% 1 + 1 Атакувати
90% 1 2 Атакувати
80% 0 1 Атакувати
30% 1 + 1 Ховатися
60% 1 2 Ховатися
40% 0 1 Ховатися
Тепер навчимо нашу ІНС і збережемо її в файл:
public static void main (String [] args)
// Для складання нової ІНС необхідно створить список шарів
List
layerList.add (Layer.create (3, ActivationFunction.FANN_SIGMOID_SYMMETRIC, 0.01f));
layerList.add (Layer.create (16, ActivationFunction.FANN_SIGMOID_SYMMETRIC, 0.01f));
layerList.add (Layer.create (4, ActivationFunction.FANN_SIGMOID_SYMMETRIC, 0.01f));
Fann fann = new Fann (layerList);
// Створюємо тренера і визначаємо алгоритм навчання
Trainer trainer = new Trainer (fann);
/ * Проведемо навчання взявши уроки з файлу, з максимальним кількістю
циклів 100000, показуючи звіт кожну 100ю ітерацію і добиваємося
помилки менше 0.0001 * /
trainer.train (new File ( "train.data"). getAbsolutePath (), 100000, 100, 0.0001f);
ІНС складається з шарів нейронів. Перший шар - це нейрони #xAB; рецептори # xBB; або нейрони вхідних даних. Останній шар нейронів вихідних даних. Все решта - це приховані шари. У нашому випадку перший шар має 3 нейрона:
рівень здоров'я (0.1-1.0);
наявність зброї (1-є, 0-нету);
Об'єкт класу Fann це і є нейронна мережа, яка створюється на основі створених раніше шарів.
Об'єкт класу тренер инкапсулирует алгоритми навчання нейронної мережі переданої при створенні тренера. Після навчання не забуваємо зберегти її в файл.
Для перевірки нашого навчання скористаємося наступним кодом:
public static void main (String [] args)
Fann fann = new Fann ( "ann");
1. Кількість умов може бути не статичним. Тобто наприклад, в деяких випадках нам не важлива наявність пістолета - результат від нього не залежить. Відповідно потрібно це якось враховувати і спростити алгоритм. Це збільшить швидкість прийняття рішення.
2. Що робити, якщо є такі, що суперечать один одному уроки? На вскидку, рішення можна вибирати виходячи з теорії ймовірності: наприклад, якщо при однакових вхідних умовах 2 рази ми повинні "атакувати" і 1 раз "бігти", то функція повинна в 66.6% випадків повернути "атакувати". Тобто потрібна рандомних!
3. Система не враховує накопичений досвід (кількість уроків). Припустимо, у нас був всього 1 урок, який при наявності пістолета і двох супротивників повертав "атакувати" і 1000 уроков "бігти". Тобто більше уроків з пістолетом взагалі не було. І ось коли виникне ситуація: є пістолет і всього 1 противник - функція може повернути "бігти", так як зсув буде в сторону "бігти". Ми запам'ятаємо цей досвід і ще більше посилимо положення. У підсумку наш бот буде схильний до боягузтва.
А якщо спрощено - то вся завдання зводиться до знаходження такої функції F
для набору відомих (x) = y
Всякі там новомодні слівця типу "нейронні мережі" і "штучний розум" - зводяться до звичайної задачі апроксимації! ))
Розкрити гілка 1
Нейросеть не зовсім так працюють, їй згодовують хмару даних всіх ситуацій, а вона підлаштовує і змінює себе, щоб догодити всім случаям.І структура у неї буде простіше, ніж у одній функціі.Нейросеть-купа нейронів-програм, у кожного нейрона по кілька входів , зв'язків з іншими нейронами, і один вихід, що йде до іншого нейрону.Структурно і з боку розрахунків це-простіше, ІМХО.