Скачиваний:
12
Добавлен:
01.05.2014
Размер:
255.49 Кб
Скачать

Программа о методе Монте-Карло :

fakt('c,b').

pfakt('c,b',1).

prinadl(Z,[Z|_]).

prinadl(Z,[_|X]):-

prinadl(Z,X).

vvod_ver:-

nl,write('Введите список событий ... '),

read(Sob),

ver_sob(Sob),

nl,write('Введите случайные факты '),

read(Fakt),

ver_fakt(Fakt).

ver_sob(Sob):-

prinadl(Sob1,Sob),

nl,write('Укажите вероятность события <'),

write(Sob1),

write('> '),

read(Ver1),

asserta(psob(Sob1,Ver1)),

fail.

ver_sob(_):-!.

ver_fakt(Fakt):-

prinadl(Fakt1,Fakt),

nl,write('Укажите вероятность факта <'),

write(Fakt1),

write('> '),

read(Ver1),

asserta(pfakt(Fakt1,Ver1)),

fail.

ver_fakt(_):-!.

vvod_celi(Cel):-

nl,write('Введите цель ... '),

read(Cel),

!.

tek_sob:-

psob(Sob,Ver),

Rand is random,

ifthen(Rand>Ver,asserta((sob(Sob):-!,fail))),

fail.

tek_sob:-!.

tek_fakt:-

pfakt(Fakt,Ver),

Rand is random,

ifthen(Rand<Ver,asserta(fakt(Fakt))),

fail.

tek_fakt:-!.

dokazat(Cel):-

call(Cel),

retract(uspechi(N)),

N1 is N+1,

asserta(uspechi(N1)),!.

dokazat(_):-!.

chistka_tek:-

repeat,

not(retract((sob(_):-!,fail))),

not(retract(fakt(_))).

chistka_tek:-!.

chistka_base:-

chistka_tek,

repeat,

not(retract(psob(_,_))),

not(retract(pfakt(_,_))).

chistka_base:-!.

start:-

vvod_ver,

vvod_celi(Cel),

asserta(uspechi(0)),

write('Количество испытаний = '),

read(N),

asserta(tek_num(0)),

repeat,

chistka_tek,

tek_sob,

tek_fakt,

retract(tek_num(N1)),

N2 is N1+1,

asserta(tek_num(N2)),

dokazat(Cel),

N2==N,

retract(uspechi(N_usp)),

P is N_usp/N,

nl,write('Вероятность = '),

write(P),

chistka_base.

ok:- sob('a,c,d').

ok:- sob('a,b,d').

ok:- sob('a,c,b,d').

sob('a,b,d'):- fakt('a,b'),

fakt('b,d').

sob('a,c,d'):- fakt('a,c'),

fakt('c,d').

sob('a,c,b,d'):- fakt('a,c'),

fakt('c,b'),

fakt('b,d').

Тестовые примерчики :

Введите список событий ... ['a,b,d','a,c,d'].

Укажите вероятность события <a,b,d> 0.9.

Укажите вероятность события <a,c,d> 0.8.

Введите случайные факты ... ['a,b','b,d'].

Укажите вероятность факта <a,b> 0.9.

Укажите вероятность факта <b,d> 0.6.

Введите цель ... ok.

Количество испытаний = 25.

Вероятность = 0.4

yes

Введите список событий ... ['a,b,d'].

Укажите вероятность события <a,b,d> 0.99.

Введите случайные факты ... ['a,c','c,d'].

Укажите вероятность факта <a,c> 0.5.

Укажите вероятность факта <c,d> 0.5.

Введите цель ... ok.

Количество испытаний = 10.

Вероятность = 0.0

yes

Программа об абдукции :

p1 p1-?

a b p2=0,9

p2 p4 p3-?

p4=0,6

c d q – конечный результат ( из a в d )

p4

В качестве исходной программы использую предыдущую. Положу, что события происходят с одинаковой вероятностью p=0.5.

q=a+b*p1+c*p3+d*p1*p3

Проведем эсперименты : ( найдем q )

p1

p3

q

0

0

0.152

0

1

0.566

1

0

0.822

1

1

0.95

По данной таблице найдем значения коэффициентов a, b, c, d.

a=0.152 p1=p3=0

b=0.67 p3=0 p1=1

c=0.414 p1=0 p3=1

d=-0.286 p1=p3=1

Следовательно, уравнение поверхности :

q=0.152+0.67*p1+0.414*p3-0.286*p1*p3

Эксперименты :

Введите список событий ... ['a,b,d','a,c,d','a,c,b,d'].

Укажите вероятность события <a,b,d> 0.5.

Укажите вероятность события <a,c,d> 0.5.

Укажите вероятность события <a,c,b,d> 0.5.

Введите случайные факты ... ['a,b','a,c','c,d','b,d'].

Укажите вероятность факта <a,b> 0.

Укажите вероятность факта <a,c> 0.9.

Укажите вероятность факта <c,d> 0.6.

Укажите вероятность факта <b,d> 0.

Введите цель ... ok.

Количество испытаний = 1000.

Вероятность = 0.152

Yes

Введите список событий ... ['a,b,d','a,c,d','a,c,b,d'].

Укажите вероятность события <a,b,d> 0.5.

Укажите вероятность события <a,c,d> 0.5.

Укажите вероятность события <a,c,b,d> 0.5.

Введите случайные факты ... ['a,b','a,c','c,d','b,d'].

Укажите вероятность факта <a,b> 0.

Укажите вероятность факта <a,c> 0.9.

Укажите вероятность факта <c,d> 0.6.

Укажите вероятность факта <b,d> 1.

Введите цель ... ok.

Количество испытаний = 1000.

Вероятность = 0.566

yes

Введите список событий ... ['a,b,d','a,c,d','a,c,b,d'].

Укажите вероятность события <a,b,d> 0.5.

Укажите вероятность события <a,c,d> 0.5.

Укажите вероятность события <a,c,b,d> 0.5.

Введите случайные факты ... ['a,b','a,c','c,d','b,d'].

Укажите вероятность факта <a,b> 1.

Укажите вероятность факта <a,c> 0.9.

Укажите вероятность факта <c,d> 0.6.

Укажите вероятность факта <b,d> 0.

Введите цель ... ok.

Количество испытаний = 1000.

Вероятность = 0.822

yes

Введите список событий ... ['a,b,d','a,c,d','a,c,b,d'].

Укажите вероятность события <a,b,d> 0.5.

Укажите вероятность события <a,c,d> 0.5.

Укажите вероятность события <a,c,b,d> 0.5.

Введите случайные факты ... ['a,b','a,c','c,d','b,d'].

Укажите вероятность факта <a,b> 1.

Укажите вероятность факта <a,c> 0.9.

Укажите вероятность факта <c,d> 0.6.

Укажите вероятность факта <b,d> 1.

Введите цель ... ok.

Количество испытаний = 1000.

Вероятность = 0.95

Y es

Зная уравнение поверхности q=0.152+0.67*p1+0.414*p3-0.286*p1*p3

легко построить ее сечение

Соседние файлы в папке ARI_DOC