Created
May 19, 2013 18:31
-
-
Save anonymous/5608522 to your computer and use it in GitHub Desktop.
The beginnings of my js genetic algorithm solution
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<html> | |
<head> | |
<title>Monte Carlo Calculus</title> | |
<script src="script/monte_carlo.js"></script> | |
<script> | |
var lex_this = function(chromosome){ | |
var tokens = []; | |
chromosome = chromosome.split('').slice(0); | |
var buffer = ''; | |
for(var index=chromosome.length-1; index >= 0; index--){ | |
var character = chromosome[index]; | |
console.log(character); | |
switch(character){ | |
case '*': | |
tokens.push({'type':'operator', 'value':'*'}); | |
break; | |
case '+': | |
tokens.push({'type':'operator', 'value':'+'}); | |
break; | |
case 'n': | |
tokens.push({'type': 'constant', 'value':parseFloat(buffer)}); | |
buffer = ''; | |
break; | |
case 'x': | |
tokens.push({'type': 'input_constant'}); | |
break; | |
default: | |
var constant_pattern=/[0-9\.]/ | |
if(constant_pattern.test(character)){ | |
buffer = character + buffer; | |
console.log('Buffer is now: ' + buffer); | |
} else { | |
throw 'Unexpected value of ' + character; | |
} | |
break; | |
} | |
} | |
return tokens; | |
}; | |
var DivisionOperator = function(left_node, right_node){ | |
return { | |
'evaluate':function(input_constant){ | |
return left_node.evaluate(input_constant) / right_node.evaluate(input_constant); | |
} | |
}; | |
}; | |
var MultiplicationOperator = function(left_node, right_node){ | |
return { | |
'evaluate':function(input_constant){ | |
return left_node.evaluate(input_constant) * right_node.evaluate(input_constant); | |
} | |
}; | |
}; | |
var AdditionOperator = function(left_node, right_node){ | |
return { | |
'evaluate':function(input_constant){ | |
return left_node.evaluate(input_constant) + right_node.evaluate(input_constant); | |
} | |
}; | |
}; | |
var SubtractionOperator = function(left_node, right_node){ | |
return { | |
'evaluate':function(input_constant){ | |
return left_node.evaluate(input_constant) - right_node.evaluate(input_constant); | |
} | |
}; | |
}; | |
var ConstantTerm = function(constant_value){ | |
return { | |
'evaluate': function(input_constant){ | |
return constant_value; | |
} | |
}; | |
}; | |
var InputConstantTerm = function(){ | |
return { | |
'evaluate': function(input_constant){ | |
return input_constant; | |
} | |
} | |
}; | |
var parse_these = function(tokens){ | |
tokens = tokens.slice(0); | |
console.log(tokens); | |
var nodes_to_assemble = []; | |
for(var index in tokens){ | |
var token = tokens[index]; | |
switch(token.type){ | |
case 'operator': | |
switch(token.value){ | |
case '+': | |
var right_term = nodes_to_assemble.shift(); | |
var left_term = nodes_to_assemble.shift(); | |
var operator_node = new AdditionOperator(left_term, right_term); | |
nodes_to_assemble.push(operator_node); | |
break; | |
case '-': | |
var right_term = nodes_to_assemble.shift(); | |
var left_term = nodes_to_assemble.shift(); | |
var operator_node = new SubtractionOperator(left_term, right_term); | |
nodes_to_assemble.push(operator_node); | |
break; | |
case '*': | |
var right_term = nodes_to_assemble.shift(); | |
var left_term = nodes_to_assemble.shift(); | |
var operator_node = new MultiplicationOperator(left_term, right_term); | |
nodes_to_assemble.push(operator_node); | |
break; | |
case '/': | |
var right_term = nodes_to_assemble.shift(); | |
var left_term = nodes_to_assemble.shift(); | |
var operator_node = new DivisionOperator(left_term, right_term); | |
nodes_to_assemble.push(operator_node); | |
break; | |
} | |
break; | |
case 'constant': | |
var constant = new ConstantTerm(token.value); | |
nodes_to_assemble.push(constant); | |
break; | |
case 'input_constant': | |
var input_constant = new InputConstantTerm(); | |
nodes_to_assemble.push(input_constant); | |
break; | |
default: | |
throw 'Unexpected token type ' + token.type; | |
break; | |
} | |
} | |
if(nodes_to_assemble.length > 1){ | |
throw 'Invalid AST. Ambiguous root node'; | |
} | |
return nodes_to_assemble[0]; | |
}; | |
var evaluate_chromosome = function(chromosome, x){ | |
console.log("In evaluate_chromosome"); | |
var tokens = lex_this(chromosome); | |
console.log("Token count: " + tokens.length); | |
console.log("Tokens: " + JSON.stringify(tokens)); | |
var ast = parse_these(tokens); | |
return ast.evaluate(parseFloat(x)); | |
}; | |
var main = function(){ | |
var chromosome = document.getElementById('chromosome').value; | |
var x = Number(document.getElementById('x').value); | |
var result = evaluate_chromosome(chromosome, x); | |
var result_field = document.getElementById('chromosome_result'); | |
result_field.innerHTML = result; | |
}; | |
</script> | |
</head> | |
<body> | |
Evaluating chromosome<br /> | |
<ul> | |
<li> | |
Chromosome: <input type="text" id="chromosome" value="+x*+xn2n31"/> | |
</li> | |
<li> | |
X: <input type="text" id="x" value="0"/> | |
</li> | |
<li> | |
<input id="get_results" type="button" value="Calculate" /> | |
</li> | |
</ul> | |
Result: <span id="chromosome_result"></span> | |
<script> | |
var button = document.getElementById('get_results'); | |
button.onclick = main; | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment