Автомати, що навчаються.

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Кафедра електронних обчислювальних машин

Інформація про роботу

Рік:
2005
Тип роботи:
Лабораторна робота
Предмет:
Теорія колективної поведінки інтелектуальних систем
Група:
КІ-4

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний університет „Львівська політехніка” Кафедра електронних обчислювальних машин Звіт про виконання лабораторної роботи № 3 з курсу „ Теорія колективної поведінки інтелектуальних систем ” Тема: Автомати, що навчаються Виконав: ст. гр. КІ-4 Львів – 2005 Мета: Реалізувати вказані типи автоматів, що навчаються, та дослідити їх поведінку. Загальні відомості Розглядаються три типи автоматів, що навчаються (цілеспрямованих автоматів). Для кожного з цих автоматі з кожною дією ai пов’язується лічильник сi. Крім цього для автомата визначається максимальне значення лічильників m (глибина пам’яті автомата), після досягнення якого значення лічильника не збільшується, а залишається незмінним.   1. Автомат з лінійною тактикою (автомат М.Л. Целтіна). [1.0. Всі лічильники обнуляються. Перша дія обирається випадково.] 1.1. Реалізувати обрану дію. 1.2. Отримати відгук середовища (виграш/програш). 1.3. Якщо <виграш>, то збільшити значення лічильника на один, перейти на п.1.1. 1.4. Якщо <програш>, то 1.4.1. Якщо лічильник рівний нулю, то змінити дію, перейти на п.1.1., 1.4.2. Інакше зменшити значення лічильника на один, перейти на п.1.1. 2. Автомат В.І. Крінського ("довірливий" автомат). [1.0. Всі лічильники обнуляються. Перша дія обирається випадково. ] 1.1. Реалізувати обрану дію. 1.2. Отримати відгук середовища (виграш/програш). 1.3. Якщо <виграш>, то встановити значення лічильника рівним m, перейти на п.1.1. 1.4. Якщо <програш>, то 1.4.1. Якщо лічильник рівний нулю, то змінити дію, перейти на п.1.1., 1.4.2. Інакше зменшити значення лічильника на один, перейти на п.1.1. 3. Автомат Г. Робінсона ("інерційний" автомат). [1.0. Всі лічильники обнуляються. Перша дія обирається випадково. ] 1.1. Реалізувати обрану дію. 1.2. Отримати відгук середовища (виграш/програш). 1.3. Якщо <виграш>, то встановити значення лічильника рівним m, перейти на п.1.1. 1.4. Якщо <програш>, то 1.4.1. Якщо лічильник рівний нулю, то змінити дію, встановити значення відповідного лічильника рівним m, перейти на п.1.1., 1.4.2. Інакше зменшити значення лічильника на один, перейти на п.1.1. В процесі взаємодії цілеспрямованого автомата з середовищем визначаються три залежності: Залежність біжучого виграшу від часу: R(t). Залежність біжучого сумарного виграшу від часу: R(t) = Rt. Залежність біжучого проценту виграшних дій від часу (середнє значення виграшу, що припадає на одну дію): Ps(t) = Rt / t. Завдання 1. Скласти програму наступного змісту (алгоритм роботи програми): Вибрати тип середовища (env_model) Ініціалізувати середовище (випадкова ініціалізація) Вибрати тип автомату, що навчається. Відкрити файл для збереження результатів Цикл від 1 до T (індекс t) Отримати код дії, яку обрав автомат Отримати відгук середовища на цю дію (біжучий виграш) Модифікувати значення сумарного виграшу Модифікувати значення проценту виграшних (правильних) дій Запам’ятати отриманні значення у файлі результатів Перейти на п.4 Закрити файл результатів. 2. Реалізувати три типи автоматів, що навчаються: 2.1. Автомат з лінійною тактикою (автомат М.Л. Целтіна). 2.2. Автомат В.І. Крінського ("довірливий" автомат). 2.3. Автомат Г. Робінсона ("інерційний" автомат). 3. Дослідити поведінку автоматів кожного типу в кожному з трьох середовищ (статичне детерміноване, динамічне детерміноване, стаціонарне випадкове), отримавши для кожного випадку вказані залежності від часу. Текст програми /* Copyright (c) 2005 alb. All Rights Reserved. * Multiagent systems Lab * Computer Engineering Department * Lviv Polytechnic National University * =============================================== * Multiagent Systems. Lab work 03. Agent design I (Learning Automata) * Here three types of learning automata are implemented: * - learning automaton with linear tactics (Tsetlin's automaton), * - trustful learning automaton (Krinsky's automaton), * - inertial learning automaton (Robinson's automaton). * With given * set of available actions D={1,2} and * set of possible responses R={0,1} * 1 -> reward (win); 0 -> punishment (loss) * you must investigate behaviour of automata * over T interaction in specified environments. */ #include "stdafx.h" int t; // current time step int T = 100; // maximum number of time steps (interactions with environment) int env_model; // environmetn code: // 1 - envoronment with static response // 2 - envoronment with predetermined dynamic response // 3 - envoronment with stationary random response: // binary bandit task (n-armed bandit, n=2) // variables for environment's parameters int env1; // winning action code (env_model = 1) int env2_action1; // first winning action code (env_model = 2) int env2_action2; // second winning action code (env_model = 2) int max_period=6; // max period of action repetitions (env_model = 2) int cd1 = 0; // counter for first action (env_model = 2) int cd2 = 0; // counter for second action (env_model = 2) int env2[2]; // periods of action repetitions (env_model = 2) double env3[2]; // probabilities of rewards for each action (env_model = 3) // file for saving results char * res_file_name = "test.dat"; FILE * res_file; int action; // automaton current action int response; // current response of environment (can be 0 or 1) double mr; // mean reward // results int R = 0; // current reward over time R(t) int sumR = 0; // total reward over time sumR(t) float prcR = 0; // success percent(rate) over time prcR(t) int randomChoice3 (void) { int tmp; float rand_num; rand_num = (float)rand() / (float)RAND_MAX; rand_num = (float)rand() / (float)RAND_MAX; if ((rand_num >= 0) && (rand_num <= 0.333)) {tmp = 1; return tmp;} if ((rand_num > 0.333) && (rand_num <= 0.666)) {tmp = 2; return tmp;} if ((rand_num > 0.666) && (rand_num <= 1)) {tmp = 3; return tmp;} return -1; } // equiprobable choice (one from two) int randomChoice2 (void) { int _tmp; float rand_num; rand_num = (float)rand() / (float)RAND_MAX; rand_num = (float)rand() / (float)RAND_MAX; if ((rand_num >= 0) && (rand_num <= 0.5)) {_tmp = 1; return _tmp;} if ((rand_num > 0.5) && (rand_num <= 1)) {_tmp = 2; return _tmp;} return -1; } // automatic initialization of environment void env_init (int env_id) { int tmp; switch (env_id) { case 1: // envoronment with static response env1 = randomChoice2(); break; case 2: // envoronment with predetermined dynamic response // random choice of first winning action (1 or 2) env2_action1 = randomChoice2(); if (env2_action1 == 1) env2_action2 = 2; else env2_action2 = 1; // random choice of repitition number for first action tmp = (int) ((float)(max_period - 1) * (float)rand() / (float)RAND_MAX); env2[0] = tmp + 1; // random choice of repitition number for second action tmp = (int) ((float)(max_period - 1) * (float)rand() / (float)RAND_MAX); env2[1] = tmp + 1; break; case 3: // envoronment with stationary random response env3[0] = (float)rand() / (float)RAND_MAX; env3[1] = (float)rand() / (float)RAND_MAX; break; default: printf("lab1 error: wrong env model code specified\n"); } } // response generation int env_response (int env_id) { int win_action, _response; float ftmp; switch (env_id) { case 1: // envoronment with static response if (action == env1) _response = 1; else _response = 0; break; case 2: // envoronment with predetermined dynamic response if (cd1 < env2[0]) { cd1 ++; win_action = env2_action1; } else { if (cd2 < (env2[1] - 1)) { cd2 ++; win_action = env2_action2; } else { cd1 = 0; cd2 = 0; win_action = env2_action2; } } if (action == win_action) _response = 1; else _response = 0; break; case 3: // envoronment with stationary random response ftmp = (float)rand() / (float)RAND_MAX; if (ftmp < env3[action-1]) _response = 1; else _response = 0; break; default: printf("lab1 error: wrong env model code specified\n"); } return _response; } // print environment parameters void env_info (void) { printf("\nenvironment = %d", env_model); switch (env_model) { case 1: // envoronment with static response printf("\n (%d)\n",env1); break; case 2: // envoronment with predetermined dynamic response printf("\n(%d) -> %d, (%d) -> %d\n", env2_action1, env2[0], env2_action2, env2[1]); break; case 3: // envoronment with stationary random response printf("\n(1) -> %f (2) -> %f\n", env3[0], env3[1]); break; default: printf("lab1 error: wrong env model code specified\n"); } } void res_open_file (void) { if ((res_file = fopen(res_file_name,"w")) == NULL) { fprintf(stderr, "Cannot open file <%s> for experimental results.\n", res_file_name); } } void res_close_file (void) { fclose(res_file); } void res_store_next_string (void) { fprintf(res_file,"%d,%d,%f\n",R,sumR,prcR); } int casual_agent (void) { return randomChoice2(); } int ag_type = 1; int actNumber = 2; // action number of automaton int memSize = 4; // memory size of automaton int state = 1; // automaton current state // learning automaton with linear tactics (Tsetlin's automaton) int LA_decision (void) { if (response > 0) { // 1 -> reward (win) if (state < memSize) state++; // step up in current branch } else { // 0 -> punishment (loss) if (state == 1) { // change action (change branch of automaton) if (action == actNumber) action = 1; else action++; } else state--; // step down in current branch } return action; } // trustful learning automaton (Krinsky's automaton) int TLA_decision (void) { if (response > 0) { // 1 -> reward (win) if (state < memSize) state = memSize; // go to the deepest state in current branch } else { // 0 -> punishment (loss) if (state == 1) { // change action (change branch of automaton) if (action == actNumber) action = 1; else action++; } else state--; // step down in current branch } return action; } // inertial learning automaton (Robinson's automaton) int ILA_decision (void) { if (response > 0) { // 1 -> reward (win) if (state < memSize) state = memSize; // go to the deepest state in current branch } else { // 0 -> punishment (loss) if (state == 1) { // change action (change branch of automaton) if (action == actNumber) action = 1; else action++; state = memSize; // go to the deepest state in new branch } else state--; // step down in current branch } return action; } // print information about agent void ag_info (void) { printf("agent --> "); switch (ag_type) { case 1: printf("casual agent"); break; case 2: printf("learning automaton with linear tactics (Tsetlin's automaton)"); break; case 3: printf("trustful learning automaton (Krinsky's automaton)"); break; case 4: printf("inertial learning automaton (Robinson's automaton)"); break; default: printf("lab3 error: wrong <ag_type> value specified\n"); } printf("\n\n"); } int main(int argc, char* argv[]) { // init random-number generator srand((unsigned)time(NULL)); env_model = 1; // env_model = 2; env_model = 3; ag_type = 4; // set parameters of chosen environment env_init(env_model); env3[0] = 0.3; env3[1] = 0.8; if (env_model == 3) mr = 0.5 * env3[0] + 0.5 * env3[1]; // open file for results res_open_file(); printf("stating...\n\n"); // main cycle of program (over interactions with environment) for (t=0; t < T; t++) { // get learning automaton action if (t==0) action = randomChoice2(); else { switch (ag_type) { case 1: action = casual_agent(); break; // casual case 2: action = LA_decision(); break; // straightforward case 3: action = TLA_decision(); break; // trustful case 4: action = ILA_decision(); break; // inertial default: printf("lab3 error: wrong <ag_type> value specified\n"); } } printf("agent action: %d | ", action); // get response of environment response = env_response(env_model); // print response of environment printf("env response: %d --> ",response); // calculate results R = response; sumR = sumR + R; prcR = (float)sumR / ((float)t + 1); // save current results in file res_store_next_string(); // print current results printf("sum win: %d, rate win: %f\n", sumR, prcR); } printf("\n%d interactions performed\n", t); env_info(); // print information about environment if(env_model==3) printf("mean reward is %f\n\n",mr); ag_info(); // print information about agent res_close_file(); // close file with results return 0; } Результати Залежності біжучого проценту виграшних дій від часу (середнє значення виграшу, що припадає на одну дію): Ps(t) = Rt / t для кожного типу автомата для кожного типу середовища у вигляді графіку та із зазначенням чисельних характеристик середовищ, для яких отримано результати: Порівняння навчання автоматів з різними тактиками На графіку подано порівняння чотирьох типів автоматів(трьох автоматів, що навчаються і одного, що діє випадково) при їх навчанні у стаціонарному випадковому середовищі:  environment --> envoronment with stationary random response, binary bandit task (n-armed bandit, n=2) (1) -> 0.300000 (2) -> 0.800000 mean reward is 0.550000 Висновки: виконуючи дану лабораторну роботу я досліджував поведінку автоматів, що навчаються, в різних моделях середовищ. За даних умов найкраще себе показали автомат Робінсона ("інерційний") та автомат Крінського ("довірливий"). Найбільш помітним висновком є те, що автомати, які навчаються, після певного числа кроків починають давати кращі результати за випадковий автомат.
Антиботан аватар за замовчуванням

01.01.1970 03:01-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!