Author: Steven Edwards
Date: 09:14:20 03/01/04
Here's Symbolic's opening book move selection source. I hope I''m not giving Lisp a bad reputation with all of my confusing code. (defun WLDTotalFromBookNode (MyBookNode) "Calculate the win/lose/draw total from a book node" (let* ( (WLDCount (getprop MyBookNode 'BookWLD)) (WinCount (first WLDCount)) (LoseCount (second WLDCount)) (DrawCount (third WLDCount)) (WLDTotal (+ WinCount LoseCount DrawCount)) ) WLDTotal)) (defun BookExpectationFromBookNode (MyBookNode) "Calculate the winning rate from a book node" (let* ( (WLDCount (getprop MyBookNode 'BookWLD)) (WinCount (first WLDCount)) (LoseCount (second WLDCount)) (TotalWLCount (+ WinCount LoseCount)) (Expectation (/ (float (- WinCount LoseCount)) (float TotalWLCount))) ) Expectation)) (defun BookNodeExpectationTriples (MyBookNodes) "Return a list of triples of book nodes/expectation/WLDTotals" (let ((NodeExpectations nil)) (dolist (BookNode MyBookNodes) (setf NodeExpectations (cons (list BookNode (BookExpectationFromBookNode BookNode) (WLDTotalFromBookNode BookNode)) NodeExpectations))) NodeExpectations)) (defun NodeProbabilityPairs (MyBookNodeExpTriples) "Return a list of pairs of node/probabilites from a list of node/expectation/WLDTotals" (let ((SumOfExpCountProd 0.0) (ProbabilityPairs nil)) (dolist (Triple MyBookNodeExpTriples) (setf SumOfExpCountProd (+ SumOfExpCountProd (* (second Triple) (third Triple))))) (dolist (Triple MyBookNodeExpTriples) (setf ProbabilityPairs (cons (list (first Triple) (/ (* (second Triple) (third Triple)) SumOfExpCountProd)) ProbabilityPairs))) ProbabilityPairs)) (defun FilterDecentBookNodeExpectationTriples (MyBookNodeExpTriples) "Filter out non-positive expectation book node expecation triples" (let ((DecentBookNodeExpTriples nil)) (dolist (DecentBookNodeExpTriple MyBookNodeExpTriples) (if (> (second DecentBookNodeExpTriple) 0.0) (setf DecentBookNodeExpTriples (cons DecentBookNodeExpTriple DecentBookNodeExpTriples)))) DecentBookNodeExpTriples)) (defun CollectBookSubNodes (MyNode) "Return a list of book subnodes from a node" (ExplodeNode MyNode) (let ((BookNodes nil)) (dolist (SubNode (getprop MyNode 'SubNodes)) (if (getprop SubNode 'IsBook) (setf BookNodes (cons SubNode BookNodes)))) BookNodes)) (defun DecentBookMove (MyNode) "Return a decent book move from a node, if any" (let* ( (SelMove nil) (BookSubNodes (CollectBookSubNodes MyNode)) (NodeExpectationTriples (BookNodeExpectationTriples BookSubNodes)) (DecentTriples (FilterDecentBookNodeExpectationTriples NodeExpectationTriples)) (NodeProbPairs (NodeProbabilityPairs DecentTriples)) ) (if NodeProbPairs (let ((SelectProb (random-unit)) (SumProb 0.0) (CurrPair nil)) (dowhile (not SelMove) (setf CurrPair (first NodeProbPairs)) (setf NodeProbPairs (rest NodeProbPairs)) (if (null? NodeProbPairs) (setf SelMove (getprop (first CurrPair) 'PriorMove)) (progn (setf SumProb (+ SumProb (second CurrPair))) (if (< SelectProb SumProb) (setf SelMove (getprop (first CurrPair) 'PriorMove)))))))) SelMove))
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.