Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра електронних
обчислювальних машин
Звіт
про виконання лабораторної роботи № 1
з курсу „ Теорія колективної поведінки інтелектуальних систем ”
Тема:
Моделювання середовища
Львів – 2005
Мета: Реалізувати різні за складністю моделі середовищ та дослідити власну поведінку в цих середовищах.
Загальні відомості
Процес навчання досліджується шляхом ітераційної взаємодії студента з невідомим наперед типом середовища (одне з чотирьох: статичне детерміноване, динамічне детерміноване, стаціонарне випадкове, випадкове з перемиканням станів). В кожній ітерації взаємодії студент має можливість обрати одну з двох дій (D={1,2}). Реалізувавши цю дію, студент отримує відгук від середовища (R={0,1}). Мета студента – максимізувати сумарний виграш на протязі заданого числа ітерацій взаємодії з середовищем.
В процесі взаємодії визначаються три залежності:
Залежність біжучого виграшу від часу: R(t).
Залежність біжучого сумарного виграшу від часу: R((t) = (Rt.
Залежність біжучого проценту виграшних дій від часу (середнє значення виграшу, що припадає на одну дію): Ps(t) = (Rt / t.
Завдання
1. Скласти програму наступного змісту (алгоритм роботи програми):
Випадково вибрати тип середовища (env_model)
Ініціалізувати середовище (випадкова ініціалізація)
Відкрити файл для збереження результатів
Цикл від 1 до T (індекс t)
Отримати код дії, яку обрав користувач
Отримати відгук середовища на цю дію (біжучий виграш)
Модифікувати значення сумарного виграшу
Модифікувати значення проценту виграшних (правильних) дій
Запам’ятати отриманні значення у файлі результатів
Перейти на п.4
Закрити файл результатів.
2. Реалізувати моделі наступних типів середовища:
2.1. Статичне детерміноване.
2.2. Динамічне детерміноване.
2.3. Стаціонарне випадкове.
2.4. Випадкове з перемиканням.
3. Дослідити власну поведінку в реалізованих моделях середовища (метою поведінки є отримання максимального сумарного виграшу за найменшу кількість спроб). Отримати вказані залежності від часу для кожного з типів середовища.
4. Порівняти отримані залежності та зробити висновки.
Текст програми
/* Copyright (c) 2005 alb. All Rights Reserved.
* Multiagent systems Lab
* Computer Engineering Department * Lviv Polytechnic National University
* ===============================================
* Multiagent Systems. Lab work 01. Simulating the environment (world models)
* 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 maximize sum of rewards over T interaction with unknown environment.
*/
#include "stdafx.h"
int t; // current time step
int T = 20; // 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)
// 4 - envoronment with stationary random response and state switching:
// switched random environment
// 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)
float env3[2]; // probabilities of rewards for each action (env_model = 3)
float env4s[2]; // probabilities of switching between 2 states(env_model=4)
int env4_istate; // initial state of environment (env_model = 4)
int env4_state; // current state of environment: one or two (env_model = 4)
float env4r[2][2]; // probabilities of rewards for each action (env_model = 4)
// in first and second state (env_model = 4)
// file for saving results
char * res_file_name = "d:\\temp\\test.dat";
FILE * res_file;
int action=0; // current action of the user (can be 1 or 2)
int response; // current response of environment (can be 0 or 1)
// 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)
// equiprobable choice (one from four)
int randomChoice4 (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.25)) {_tmp = 1; return _tmp;}
if ((rand_num > 0.25) && (rand_num <= 0.50)) {_tmp = 2; return _tmp;}
if ((rand_num > 0.50) && (rand_num <= 0.75)) {_tmp = 3; return _tmp;}
if ((rand_num > 0.75) && (rand_num <= 1)) {_tmp = 4; 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;
case 4: // envoronment with non-stationary random response
env4s[0] = (float)rand() / (float)RAND_MAX;
env4s[1] = (float)rand() / (float)RAND_MAX;
env4r[0][0] = (float)rand() / (float)RAND_MAX;
env4r[1][0] = (float)rand() / (float)RAND_MAX;
env4r[0][1] = (float)rand() / (float)RAND_MAX;
env4r[1][1] = (float)rand() / (float)RAND_MAX;
env4_state = randomChoice2() - 1;
env4_istate = env4_state;
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;
case 4: // envoronment with non-stationary random response
ftmp = (float)rand() / (float)RAND_MAX;
if (ftmp < env4r[env4_state][action-1]) _response = 1;
else _response = 0;
ftmp = (float)rand() / (float)RAND_MAX;
if (ftmp > env4s[env4_state])
{if (env4_state == 0) env4_state = 1; else env4_state = 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\n",env1);
break;
case 2: // envoronment with predetermined dynamic response
printf("\n(%d) -> %d, (%d) -> %d\n\n",env2_action1,env2[0],env2_action2,env2[1]);
break;
case 3: // envoronment with stationary random response
printf("\n(1) -> %f (2) -> %f\n\n", env3[0], env3[1]);
break;
case 4: // envoronment with non-stationary random response
printf("\nstate 1: (1) -> %f, (2) -> %f", env4r[0][0], env4r[0][1]);
printf("\nstate 2: (1) -> %f, (2) -> %f", env4r[1][0], env4r[1][1]);
printf("\n");
printf("\nstate switching: (s1) -> %f, (s2) -> %f", env4s[0], env4s[1]);
printf("\ninitial state -> %d\n", env4_istate + 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,"Can’t 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 main (int argc, char* argv[])
{
srand((unsigned)time(NULL)); // init random-number generator
env_model = randomChoice4(); // random choice of environment model
env_init(env_model); // set parameters of chosen environment
res_open_file(); // open file for results
// main cycle of program (over interactions with environment)
for (t=0; t < T; t++) {
printf("your action: "); // get user action from console
scanf("%d",&action);
response = env_response(env_model);// get response of environment
// print response of environment
printf("env response: %d --> ",response);
R = response; // calculate results
sumR = sumR + R;
prcR = (float)sumR / ((float)t + 1);
res_store_next_string(); // save current results in file
// print current results
printf("sum win: %d, rate win: %f\n", sumR, prcR);
}
// print information about environment
env_info();
// close file with results
res_close_file();
return 0;
}
Результати
Залежності біжучого проценту виграшних дій від часу (середнє значення виграшу, що припадає на одну дію): Ps(t) = (Rt / t для кожного типу середовища у вигляді графіку та із зазначенням чисельних характеристик середовищ, для яких отримано результати:
Ps(t) = (Rt / t
0
0,5
0,666667
0,75
0,8
0,833333
0,857143
0,875
0,888889
0,9
0,909091
0,916667
0,923077
0,928571
0,933333
0,9375
0,941176
0,944444
0,947368
0,95
1. Статичне детерміноване середовище.
environment = 1
(2)
2. Динамічне детерміноване середовище.
Ps(t) = (Rt / t
1
1
1
0,75
0,6
0,666667
0,714286
0,75
0,777778
0,8
0,818182
0,833333
0,846154
0,857143
0,866667
0,875
0,882353
0,888889
0,894737
0,9
environment = 2
(1) -> 3, (2) -> 1
3. Стаціонарне випадкове середовище.
Ps(t) = (Rt / t
1
1
1
1
0,8
0,833333
0,857143
0,875
0,888889
0,9
0,909091
0,916667
0,923077
0,928571
0,933333
0,9375
0,941176
0,944444
0,947368
0,95
environment = 3
(1) -> 0.386853 (2) -> 0.970885
4. Випадкове середовище з перемиканням станів.
Ps(t) = (Rt / t
1
0,5
0,666667
0,75
0,8
0,833333
0,857143
0,875
0,777778
0,8
0,818182
0,833333
0,769231
0,714286
0,733333
0,6875
0,647059
0,611111
0,578947
0,55
environment = 4
state 1: (1) -> 0.477279, (2) -> 0.709586
state 2: (1) -> 0.256600, (2) -> 0.098453
state switching: (s1) -> 0.772362, (s2) -> 0.477554
initial state -> 1
Висновки: виконуючи дану лабораторну роботу, я досліджував власну поведінку в різних за складністю моделях середовищ.
Статичне детерміноване середовище є найбільш простим для вивчення – оскільки може перебувати тільки в одному з двох можливих станів. На другому кроці середовище було вивчене, що можна помітити на графіку 1.
Поведінку динамічного детермінованого середовища досліджувати потрібно довше, оскільки воно може змінювати свої стани за певним законом. В даному випадку: 3 рази стан 1 і 1 раз стан 2. Таким чином на п’ятому кроці поведінку середовища було повністю вивчено.
У стаціонарному випадковому середовищі встановлено імовірності отримання “виграшу” від кожної з дій. Після вивчення цих ймовірностей можна обирати ту з дій, яка частіше дає “виграш”.
Випадкове середовище з перемиканням станів є найскладнішим для вивчення, оскільки окрім вивчення функції середовища, ще необхідно вивчити функцію переходів між станами середовища – що і показує неоднорідність і спадний характер графіка.