diff --git a/js/ml/opt.js b/js/ml/opt.js new file mode 100644 index 0000000..3d0ca2e --- /dev/null +++ b/js/ml/opt.js @@ -0,0 +1,169 @@ +/** + * Created by joonkukang on 2014. 1. 16.. + */ +var math = require('./utils').math; +let optimize = module.exports; + +optimize.hillclimb = function(options){ + var domain = options['domain']; + var costf = options['costf']; + + var i; + var vec = []; + for(i=0 ; i domain[i][0]) { + var newVec = []; + for(j=0 ; j 0.1) { + var idx = math.randInt(0,domain.length - 1); + var dir = math.randInt(-step,step); + var newVec = []; + for(i=0; i domain[idx][1]) newVec[idx] = domain[idx][1]; + + var ea = costf(vec); + var eb = costf(newVec); + var p = Math.exp(-1.*(eb-ea)/temperature); + if(eb < ea || Math.random() < p) + vec = newVec; + + temperature *= cool; + } + + return vec; +} + +optimize.genetic = function(options){ + var domain = options['domain']; + var costf = options['costf']; + var population = options['population']; + var q = options['q'] || 0.3; + var elite = options['elite'] || population * 0.04; + var epochs = options['epochs'] || 100; + + var i,j; + // Initialize population array + var pop =[]; + for(i=0; i domain[idx][1]) newVec[idx] = domain[idx][1]; + return newVec; + } + function crossover(vec1,vec2) { + var idx = math.randInt(0,domain.length - 2); + var newVec = []; + var i; + for(i=0; i a[i] && rand <= a[i+1]) + return i; + } + return -1; + } +};