level 11
#lang racket
;;;贝叶斯查找程序
;;;(change p q r y/n)
(define (sum-vector vect)
(let ((len (vector-length vect)))
(let loop ((len (- len 1)) (result 0))
(cond ((>= len 0)
(loop (- len 1) (+ result (vector-ref vect len))))
(else
result)))))
;;;数据改变函数
(define (r-d num n)
(string->number (real->decimal-string num n)))
(define (r-d5 num)
(r-d num 5))
(define (change p q r y/n xz)
(let* ((p (/ p xz))
(1-pq (- 1 (* p q)))
(1-q (- 1 q)))
(cond ((eq? y/n 'y)
(r-d5 (/ (* r 1-q) 1-pq)))
(else
(r-d5 (/ r 1-pq))))))
;;;建立数据结构模型
;;;失物在某区域的概率模型 P(Mn)
(define B-lost (vector .1 .2 .05 .25 .15 .2 .05))
;;;各种因素(地形等)能够找到的概率P(Y|Mn)
(define B-find (vector .9 .8 .95 .75 .45 .23 .99))
;;;确在此处并且找到的概率
(define (B-win) (vector-map (lambda (a b) (r-d5 (* a b))) B-lost B-find))
;;;向量中最大元素的位置
(define (vector-max-pos vect)
(vector-member (vector-argmax + vect) vect))
;;;贝叶斯地图查找
(define (Bayesian-mapfind . pos)
(define xz (sum-vector B-lost))
(define (b-h1 pos)
(let ((max-pos (vector-max-pos (B-win)))
(use-pos '())
(len (vector-length (B-win))))
(cond ((null? pos) (set! use-pos max-pos))
(else (set! use-pos pos)))
(let ((p (vector-ref B-lost use-pos))
(q (vector-ref B-find use-pos)))
(let loop ((len (- len 1)))
(cond ((>= len 0)
(cond ((eqv? len use-pos)
(vector-set! B-lost len
(change p
q
(vector-ref B-lost len)
'y
xz)))
(else
(vector-set! B-lost len
(change p
q
(vector-ref B-lost len)
'n
xz))))
(loop (- len 1)))
(else
(display "No find in ")
(displayln use-pos)
(display "B-lost : ")
(display B-lost)
(displayln (r-d (sum-vector B-lost) 3))
(display "B-find : ")
(displayln B-find)
(display "B-win : ")
(displayln (B-win))
(display "Next Find pos ")
(display (vector-max-pos (B-win)))
))))))
(cond ((null? pos)
(b-h1 pos))
(else
(b-h1 (car pos)))))
(define bmf Bayesian-mapfind)
;;;test
(bmf)
(define (do-n fun n)
(let loop ((n n))
(cond ((> n 0)
(fun)
(loop (- n 1)))
(else
'Finish))))
;(do-n bmf 10000)
2014年03月11日 14点03分






