JS tool problem(simple AI) - reduced black jack
JS tool problem 2 about Markov decision process.
by Tinytsunami
HTML
<div id="demo">
<pre></pre>
<button>Draw</button>
<button>Pass</button>
</div>
CSS
body {
color: #ffffff;
background: #20262e;
font-family: monospace, sans-serif;
}
#demo input {
width: 120px;
color: #ffffff;
background: #20262e;
border: none;
border-bottom: solid 1px #ffffff;
outline: none;
}
#demo input {
margin-right: 5px;
}
#demo button {
cursor: pointer;
color: #ffffff;
background: #20262e;
border: 1px solid #ffffff;
outline: none;
}
#demo button:hover {
color: #20262e;
background: #ffffff;
}
JavaScript
(function() {
/* HTML DOM */
let demo = document.getElementById("demo");
let message = demo.getElementsByTagName("pre")[0];
let draw = demo.getElementsByTagName("button")[0];
let pass = demo.getElementsByTagName("button")[1];
/* constants */
let ACTOR = {
PLAYER: 0,
COMPUTER: 1
};
let turn = ACTOR.PLAYER;
/* variables */
let player_card = [];
let computer_card = [];
let player_pass = false;
let computer_pass = false;
let game_endding = false;
/* AI */
let ai = function() {
/* define variables */
const pass = 0, draw = 1; // A
let U = Array.from({length: 2}, () => // utility, s = (c, f)
Array.from({length: 16}, () => 0)); // |c| = 16, |f| = 2
let Ut = Array.from({length: 2}, () => // utility temp.
Array.from({length: 16}, () => 0)); // size same with |U|
let D = Array.from({length: 2}, () => // decision table
Array.from({length: 16}, () => 0)); // size same with |U|
let epsilon = 0.01; // iterative stop para.
let gamma = 0.9; // discount factor
let delta; // iterative diff. for step
/* reward function */
let R = function(c) {
return c > 10 ? 0 : c;
};
/* expected value of action
f = 0: can select "pass" only (exp = [pass_value])
f = 1: can select "draw" or "pass" (exp = [pass_value, draw_value]) */
let Exp = function(c, f) {
let exp = [];
if (f == 0) { // f = 0: pass only
exp.push(1.0 * R(c)); // pass: 100%
} else if (f == 1) { // f = 1: pass or draw
exp.push(1.0 * R(c)); // pass: 100%
let t = 0; // draw: now point + 1~5 (20%)
for (let d =...