UNPKG

vrp-data-parser

Version:

Vehicle Routing Problem Data Parser

78 lines (63 loc) 2.38 kB
/** * 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();