vrp-data-parser
Version:
Vehicle Routing Problem Data Parser
78 lines (63 loc) • 2.38 kB
JavaScript
/**
* Created by tnlam on 5/6/15.
*/
var VRPDataParser = function () {
};
VRPDataParser.prototype.parse = function (args, cb) {
// validate arguments
if (arguments.length < 2) {
throw new Error('Invalid number of arguments');
}
var callback = arguments[arguments.length-1];
if (typeof callback != 'function') {
throw new Error('Missing callback function');
}
// parse data
var input = arguments[0];
var s = input.split("\n");
var output = {};
// parse common info
output.NAME = s[0].substr(s[0].indexOf(':') + 2);
output.COMMENT = s[1].substr(s[1].indexOf(':') + 2);
output.TYPE = s[2].substr(s[2].indexOf(':') + 2);
output.DIMENSION = parseInt(s[3].substr(s[3].indexOf(':') + 2));
output.EDGE_WEIGHT_TYPE = s[4].substr(s[4].indexOf(':') + 2);
output.EDGE_WEIGHT_FORMAT = s[5].substr(s[5].indexOf(':') + 2);
output.EDGE_WEIGHT_UNIT_OF_MEASUREMENT = s[6].substr(s[6].indexOf(':') + 2);
output.CAPACITY = parseInt(s[7].substr(s[7].indexOf(':') + 2));
// parse NODE_COORD_SECTION
var nodes = [];
for (var i = 0; i < output.DIMENSION; i++) {
var p = s[i + 9].split(" ");
nodes.push({
code: parseInt(p[0]),
latitude: parseFloat(p[1]),
longitude: parseFloat(p[2]),
name: p[3]
});
}
output.NODE_COORD_SECTION = nodes;
// parse EDGE_WEIGHT_SECTION
var edges = [];
for (var i = 0; i < output.DIMENSION; i++) {
var p = s[i + 10 + output.DIMENSION].split(" ").map(function (x) { return parseFloat(x); });
p.splice(p.indexOf("\n"), 1);
edges.push(p);
}
output.EDGE_WEIGHT_SECTION = edges;
// parse DEMAND_SECTION
var demands = [];
for (var i = 0; i < output.DIMENSION; i++) {
var p = s[i + 11 + 2 * output.DIMENSION].split(" ");
demands.push({
code: parseInt(p[0]),
demand: parseInt(p[1])
});
}
output.DEMAND_SECTION = demands;
// parse DEPOT_SECTION
var depot = parseInt(s[i + 12 + 2 * output.DIMENSION]);
output.DEPOT_SECTION = depot;
return callback(null, output);
};
module.exports = new VRPDataParser();