algorithmbox
Version:
A metaheuristic algorithm development framework for solving discrete optimization problem
145 lines (103 loc) • 3.48 kB
JavaScript
process.chdir("../src/");
console.log("switching to directory " + process.cwd());
var util = require('util');
var assert = require('assert');
var fs = require('fs');
var d3 = require('d3');
var express = require('express');
var http = require('http');
var socketio = require('socket.io');
var TSP = require('example/tsp/Problem.js');
var TSPSolution = require('example/tsp/Solution.js');
var IIA = require('example/tsp/Algorithms.js').TSP_IIA;
var SA = require('example/tsp/Algorithms.js').TSP_SA;
var TS = require('example/tsp/Algorithms.js').TSP_TS;
//should do this before handle
module.exports = exports = {
setUp: function(callback) {
callback();
},
tearDown: function(callback) {
callback();
}
};
exports.testRuntimePerformance = function(test){
//fire up the server
var app = express();
var server = http.createServer(app);
var io = socketio.listen(server);
server.listen(8888);
console.log("server listening on 8888");
//express static file handler
app.use(express.static("../workspace/www/"));
//socket.io handler
io.sockets.on('connection', function (socket) {
socket.on('disconnect', function(){
console.log("client disconnected");
});
//client request a data update
socket.on('pull', function (opt, fn) {
fn(data_available ? stat : []);
});
//on client first connect, serve the new data
if(data_available)
socket.emit('data', stat);
});
//stat data
//each array elem correspond to a local search step: an array of solution quality at that step from multiple independent runs
// stat[m][n] gives the solution quality at search step m for the nth run
var MAX_LOCAL_SEARCH_STEPS = 50; //cap on local search steps for each run
var NUM_RUN = 10; //# of independent run of iia with random restart
var stat = new Array(MAX_LOCAL_SEARCH_STEPS+1);
for(var i=0;i<=MAX_LOCAL_SEARCH_STEPS;i++)
stat[i] = new Array(NUM_RUN);
var data_available = false;
var ALGS = TS;
//load data from file
fs.readFile('../test/tsplib/bayg29.xml', function(err, raw) {
test.ok(raw!=undefined,"error reading file");
//parse data
var data = TSP.parseData(raw);
test.ok(TSP.validData(data), "data invalid");
//instatiate problem
var instance = new TSP(data);
for(var n=0;n<NUM_RUN;n++){
console.log("%d run ", n);
var algs = new ALGS(instance, {'terminate_ls_steps' : MAX_LOCAL_SEARCH_STEPS});
algs.run(function(step){
stat[step][n] = algs.best_sol.fitness;
//console.log("step %s [%s]", step, algs.best_sol);
if(algs.lo_trap)
console.log("run %d trapped at step %d with fitness %.0f", n, step, algs.best_sol.fitness);
});
}
data_available = true;
io.sockets.emit('data', stat);
});
test.done();
}
/*
exports.testVisualize = function(test){
var fake_data = [5, 10, 15, 20, 25];
//an express http server
var app = express();
var server = http.createServer(app);
var io = socketio.listen(server);
server.listen(8888);
//express static file handler
app.use(express.static(__dirname + "/www/"));
//socket.io handler
io.sockets.on('connection', function (socket) {
socket.on('disconnect', function(){
console.log("client disconnected");
});
//client request a data update
socket.on('pull', function (opt, fn) {
fn(fake_data);
});
//on client first connect, serve the new data
socket.emit('data', fake_data);
});
test.done();
}
*/