Skip to content

Instantly share code, notes, and snippets.

Created May 19, 2013 18:31
Show Gist options
  • Save anonymous/5608522 to your computer and use it in GitHub Desktop.
Save anonymous/5608522 to your computer and use it in GitHub Desktop.
The beginnings of my js genetic algorithm solution
<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