МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра ЕОМ
ЗВІТ
до лабораторної роботи №3
на тему:
«Моделювання простих форм цілеспрямованої поведінки. Дослідження роботи стохастичного автомату зі змінною структурою у випадковому середовищі з перемиканням станів»
з дисципліни:
«Теорія інтелектуальних систем»
Львів – 2015
Мета роботи:
Змоделювати та дослідити роботу стохастичного автомату зі змінною структурою у випадковому середовищі з перемиканням станів.
Хід роботи:
1. Реалізувати модель випадкового середовища з перемиканням станів E (кількість станів обрати згідно варіанту).
Автомат задається двома матрицями: П+ і П–. Відповідно матриця П+ містить ймовірності переходу зі стану в стан після отримання сигналу про виграш, а матриця П– містить ймовірності переходу зі стану в стан після отримання сигналу про програш. Це квадратні матриці (n·m)x(n·m), де n - кількість дій автомату, а m — глибина пам'яті автомату (для всіх варіантів обрати m=100). Таким чином для кожної з n дій виділяється m станів (якщо автомат знаходиться в одному з цих станів, то він виконує відповідну дію).
W2 => Середній виграш
N
Модель оптимальної поведінки
Кількість станів середовища
Кількість доступних агенту дій
5
W2
3
3
2. Фрагмент тексту програми обчислювального експерименту:
double rk1_ti_step(double x, double t, double h, double q,
double fi(double x), double gi(double x), int *seed)
{
double a21;
double k1;
double q1;
double t1;
double w1;
double x1;
double xstar;
a21 = 1.0;
q1 = 1.0;
t1 = t;
x1 = x;
w1 = r8_normal_01(seed) * sqrt(q1 * q / h);
k1 = h * fi(x1) + h * gi(x1) * w1;
xstar = x1 + a21 * k1;
return xstar;
}
double rk2_ti_step(double x, double t, double h, double q,
double fi(double x), double gi(double x), int *seed)
{
a21 = 1.0;
a31 = 0.5;
a32 = 0.5;
q1 = 2.0;
q2 = 2.0;
t1 = t;
x1 = x;
w1 = r8_normal_01(seed) * sqrt(q1 * q / h);
k1 = h * fi(x1) + h * gi(x1) * w1;
t2 = t1 + a21 * h;
x2 = x1 + a21 * k1;
w2 = r8_normal_01(seed) * sqrt(q2 * q / h);
k2 = h * fi(x2) + h * gi(x2) * w2;
xstar = x1 + a31 * k1 + a32 * k2;
return xstar;
}
double rk3_ti_step(double x, double t, double h, double q,
double fi(double x), double gi(double x), int *seed)
a21 = 1.52880952525675;
a31 = 0.0;
a32 = 0.51578733443615;
a41 = 0.53289582961739;
a42 = 0.25574324768195;
a43 = 0.21136092270067;
q1 = 1.87653936176981;
q2 = 3.91017166264989;
q3 = 4.73124353935667;
t1 = t;
x1 = x;
w1 = r8_normal_01(seed) * sqrt(q1 * q / h);
k1 = h * fi(x1) + h * gi(x1) * w1;
t2 = t1 + a21 * h;
x2 = x1 + a21 * k1;
w2 = r8_normal_01(seed) * sqrt(q2 * q / h);
k2 = h * fi(x2) + h * gi(x2) * w2;
t3 = t1 + a31 * h + a32 * h;
x3 = x1 + a31 * k1 + a32 * k2;
w3 = r8_normal_01(seed) * sqrt(q3 * q / h);
k3 = h * fi(x3) + h * gi(x3) * w3;
xstar = x1 + a41 * k1 + a42 * k2 + a43 * k3;
return xstar;
}
double rk4_ti_step(double x, double t, double h, double q,
double fi(double x), double gi(double x), int *seed)
{
a21 = 2.71644396264860;
a31 = -6.95653259006152;
a32 = 0.78313689457981;
a41 = 0.0;
a42 = 0.48257353309214;
a43 = 0.26171080165848;
a51 = 0.47012396888046;
a52 = 0.36597075368373;
a53 = 0.08906615686702;
a54 = 0.07483912056879;
q1 = 2.12709852335625;
q2 = 2.73245878238737;
q3 = 11.22760917474960;
q4 = 13.36199560336697;
t1 = t;
x1 = x;
w1 = r8_normal_01(seed) * sqrt(q1 * q / h);
k1 = h * fi(x1) + h * gi(x1) * w1;
t2 = t1 + a21 * h;
x2 = x1 + a21 * k1;
w2 = r8_normal_01(seed) * sqrt(q2 * q / h);
k2 = h * fi(x2) + h * gi(x2) * w2;
t3 = t1 + a31 * h + a32 * h;
x3 = x1 + a31 * k1 + a32 * k2;
w3 = r8_normal_01(seed) * sqrt(q3 * q / h);
k3 = h * fi(x3) + h * gi(x3) * w3;
t4 = t1 + a41 * h + a42 * h + a43 * h;
x4 = x1 + a41 * k1 + a42 * k2;
w4 = r8_normal_01(seed) * sqrt(q4 * q / h);
k4 = h * fi(x4) + h * gi(x4) * w4;
xstar = x1 + a51 * k1 + a52 * k2 + a53 * k3 + a54 * k4;
return xstar;
}
double rk1_tv_step(double x, double t, double h, double q,
double fv(double t, double x), double gv(double t, double x),
int *seed)
{
double a21;
double k1;
double q1;
double t1;
double w1;
double x1;
double xstar;
a21 = 1.0;
q1 = 1.0;
t1 = t;
x1 = x;
w1 = r8_normal_01(seed) * sqrt(q1 * q / h);
k1 = h * fv(t1, x1) + h * gv(t1, x1) * w1;
xstar = x1 + a21 * k1;
return xstar;
}
double rk2_tv_step(double x, double t, double h, double q,
double fv(double t, double x), double gv(double t, double x),
int *seed)
{
a21 = 1.0;
a31 = 0.5;
a32 = 0.5;
q1 = 2.0;
q2 = 2.0;
t1 = t;
x1 = x;
w1 = r8_normal_01(seed) * sqrt(q1 * q / h);
k1 = h * fv(t1, x1) + h * gv(t1, x1) * w1;
t2 = t1 + a21 * h;
x2 = x1 + a21 * k1;
w2 = r8_normal_01(seed) * sqrt(q2 * q / h);
k2 = h * fv(t2, x2) + h * gv(t2, x2) * w2;
xstar = x1 + a31 * k1 + a32 * k2;
return xstar;
}
double rk4_tv_step(double x, double t, double h, double q,
double fv(double t, double x), double gv(double t, double x),
int *seed)
{
;
a21 = 0.66667754298442;
a31 = 0.63493935027993;
a32 = 0.00342761715422;
a41 = -2.32428921184321;
a42 = 2.69723745129487;
a43 = 0.29093673271592;
a51 = 0.25001351164789;
a52 = 0.67428574806272;
a53 = -0.00831795169360;
a54 = 0.08401868181222;
q1 = 3.99956364361748;
q2 = 1.64524970733585;
q3 = 1.59330355118722;
q4 = 0.26330006501868;
t1 = t;
x1 = x;
w1 = r8_normal_01(seed) * sqrt(q1 * q / h);
k1 = h * fv(t1, x1) + h * gv(t1, x1) * w1;
t2 = t1 + a21 * h;
x2 = x1 + a21 * k1;
w2 = r8_normal_01(seed) * sqrt(q2 * q / h);
k2 = h * fv(t2, x2) + h * gv(t2, x2) * w2;
t3 = t1 + a31 * h + a32 * h;
x3 = x1 + a31 * k1 + a32 * k2;
w3 = r8_normal_01(seed) * sqrt(q3 * q / h);
k3 = h * fv(t3, x3) + h * gv(t3, x3) * w3;
t4 = t1 + a41 * h + a42 * h + a43 * h;
x4 = x1 + a41 * k1 + a42 * k2 + a43 * k3;
w4 = r8_normal_01(seed) * sqrt(q4 * q / h);
k4 = h * fv(t4, x4) + h * gv(t4, x4) * w4;
xstar = x1 + a51 * k1 + a52 * k2 + a53 * k3 + a54 * k4;
return xstar;
}
double r8_normal_01(int *seed)
{
# define R8_PI 3.141592653589793
double r1;
double r2;
static int seed1 = 0;
static int seed2 = 0;
static int seed3 = 0;
static int used = 0;
double v1;
static double v2 = 0.0;
if ((used % 2) == 1)
{
if (*seed != seed2)
{
used = 0;
seed1 = 0;
seed2 = 0;
seed3 = 0;
v2 = 0.0;
}
}
if ((used % 2) == 0)
{
seed1 = *seed;
r1 = r8_uniform_01(seed);
if (r1 == 0.0)
{
cerr << "\n";
cerr << "R8_NORMAL_01 - Fatal error!\n";
cerr << " R8_UNIFORM_01 returned a value of 0.\n";
exit(1);
}
seed2 = *seed;
r2 = r8_uniform_01(seed);
seed3 = *seed;
*seed = seed2;
v1 = sqrt(-2.0 * log(r1)) * cos(2.0 * R8_PI * r2);
v2 = sqrt(-2.0 * log(r1)) * sin(2.0 * R8_PI * r2);
}
else
{
v1 = v2;
*seed = seed3;
}
used = used + 1;
return v1;
# undef R8_PI
}
double r8_uniform_01(int *seed)
{
int i4_huge = 2147483647;
int k;
double r;
if (*seed == 0)
{
cerr << "\n";
cerr << "R8_UNIFORM_01 - Fatal error!\n";
cerr << " Input value of SEED = 0.\n";
exit(1);
}
k = *seed / 127773;
*seed = 16807 * (*seed - k * 127773) - k * 2836;
if (*seed < 0)
{
*seed = *seed + i4_huge;
}
r = (double)(*seed) * 4.656612875E-10;
return r;
}
void imestamp()
{
# define TIME_SIZE 40
static char time_buffer[TIME_SIZE];
const struct std::tm *tm_ptr;
size_t len;
std::time_t now;
now = std::time(NULL);
tm_ptr = std::localtime(&now);
len = std::strftime(time_buffer, TIME_SIZE, "%d %B %Y %I:%M:%S %p", tm_ptr);
std::cout << time_buffer << "\n";
return;
# undef TIME_SIZE
}
int main(void)
{
imestamp();
double rk1_ti_step ( double x, double t, double h, double q,
double fi ( double x ), double gi ( double x ), int *seed );
double rk2_ti_step ( double x, double t, double h, double q,
double fi ( double x ), double gi ( double x ), int *seed );
double rk3_ti_step ( double x, double t, double h, double q,
double fi ( double x ), double gi ( double x ), int *seed );
double rk4_ti_step ( double x, double t, double h, double q,
double fi ( double x ), double gi ( double x ), int *seed );
double rk1_tv_step ( double x, double t, double h, double q,
double fv ( double t, double x ), double gv ( double t, double x ),
int *seed );
double rk2_tv_step ( double x, double t, double h, double q,
double fv ( double t, double x ), double gv ( double t, double x ),
int *seed );
double rk4_tv_step ( double x, double t, double h, double q,
double fv ( double t, double x ), double gv ( double t, double x ),
int *seed );
double r8_normal_01 ( int *seed );
double r8_uniform_01 ( int *seed );
void timestamp ( );
getch();
}{
for (t=0; t < T; t++)
{
float tmps1 = 0.0f;
float tmps2 = 0.0f;
for (int i=0; i < n; i++)
{
tmps1 += (sumRm[t] - _sumR[t][i]) * (sumRm[t] - _sumR[t][i]);
tmps2 += (avrRm[t] - _avrR[t][i]) * (avrRm[t] - _avrR[t][i]);
}
sumRv[t] = (float)tmps1 / (float)(n-1);
avrRv[t] = (float)tmps2 / (float)(n-1);
}
}
// main
int main(int argc, char* argv[])
{
int i;
srand((unsigned)time(NULL));
// init environment
if (env == 0) seInit();
else ceInit();
// save parameters of experiment
saveParameters();
// run experiment for random agent
agt = 0;
for (i=0; i < n; i++) simulation(i);
getMeanValues();
getVarianceValues();
saveResultsRA();
// run experiment for perfect agent
agt = 1;
for (i=0; i < n; i++) simulation(i);
getMeanValues();
getVarianceValues();
saveResultsPA();
// run experiment for learning automaton
agt = LATYPE;
for (i=0; i < n; i++) simulation(i);
getMeanValues();
getVarianceValues();
saveResultsLA();
return 0;
3. Результати виконання програми:
Рис. 1. Результати обчислювального експерименту у вигляді графічної залежності
Висновок:
Виконавши дану лабораторну роботу, я змоделював та дослідив роботу стохастичного автомату зі змінною структурою у випадковому середовищі з перемиканням станів.