lin-kernighan
Version:
Adaptive k-opt heuristic improving TSP tours by swapping edges to shorten routes.
168 lines (167 loc) • 4.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
const _nodetest = /*#__PURE__*/ _interop_require_default(require("node:test"));
const _nodeassert = /*#__PURE__*/ _interop_require_default(require("node:assert"));
const _ = /*#__PURE__*/ _interop_require_default(require("."));
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const testPoints = [
{
latitude: 40.7128,
longitude: -74.006
},
{
latitude: 34.0522,
longitude: -118.2437
},
{
latitude: -33.8688,
longitude: 151.2093
},
{
latitude: 55.7558,
longitude: 37.6173
},
{
latitude: -22.9068,
longitude: -43.1729
} // Rio de Janeiro
];
(0, _nodetest.default)('should handle empty array', ()=>{
const result = (0, _.default)([]);
_nodeassert.default.deepStrictEqual(result, []);
});
(0, _nodetest.default)('should handle single point', ()=>{
const points = [
{
latitude: 40.7128,
longitude: -74.006
}
];
const result = (0, _.default)(points);
_nodeassert.default.deepStrictEqual(result, points);
});
(0, _nodetest.default)('should handle two points', ()=>{
const points = [
{
latitude: 40.7128,
longitude: -74.006
},
{
latitude: 34.0522,
longitude: -118.2437
}
];
const result = (0, _.default)(points);
_nodeassert.default.strictEqual(result.length, 2);
_nodeassert.default.deepStrictEqual(result, points);
});
(0, _nodetest.default)('should return valid tour for three points', ()=>{
const points = [
{
latitude: 0,
longitude: 0
},
{
latitude: 1,
longitude: 0
},
{
latitude: 0,
longitude: 1
}
];
const result = (0, _.default)(points);
_nodeassert.default.strictEqual(result.length, 3);
// Verify all original points are included
for (const point of points){
(0, _nodeassert.default)(result.some((p)=>p.latitude === point.latitude && p.longitude === point.longitude));
}
});
(0, _nodetest.default)('should optimize tour for README example points', ()=>{
const result = (0, _.default)(testPoints);
_nodeassert.default.strictEqual(result.length, 5);
// Verify all original points are included
for (const point of testPoints){
(0, _nodeassert.default)(result.some((p)=>p.latitude === point.latitude && p.longitude === point.longitude));
}
// The algorithm should produce a valid tour
(0, _nodeassert.default)(Array.isArray(result));
(0, _nodeassert.default)(result.every((point)=>typeof point.latitude === 'number' && typeof point.longitude === 'number'));
});
(0, _nodetest.default)('should handle duplicate coordinates', ()=>{
const points = [
{
latitude: 40.7128,
longitude: -74.006
},
{
latitude: 40.7128,
longitude: -74.006
},
{
latitude: 34.0522,
longitude: -118.2437
}
];
const result = (0, _.default)(points);
_nodeassert.default.strictEqual(result.length, 3);
// Should still include all points even if duplicated
for (const point of points){
(0, _nodeassert.default)(result.some((p)=>p.latitude === point.latitude && p.longitude === point.longitude));
}
});
(0, _nodetest.default)('should produce consistent results', ()=>{
const result1 = (0, _.default)(testPoints);
const result2 = (0, _.default)(testPoints);
// Results should be deterministic
_nodeassert.default.deepStrictEqual(result1, result2);
});
(0, _nodetest.default)('should handle larger dataset', ()=>{
const largePoints = [
{
latitude: 40.7128,
longitude: -74.006
},
{
latitude: 34.0522,
longitude: -118.2437
},
{
latitude: 41.8781,
longitude: -87.6298
},
{
latitude: 29.7604,
longitude: -95.3698
},
{
latitude: 39.9526,
longitude: -75.1652
},
{
latitude: 33.4484,
longitude: -112.074
},
{
latitude: 37.7749,
longitude: -122.4194
},
{
latitude: 32.7767,
longitude: -96.797
} // Dallas
];
const result = (0, _.default)(largePoints);
_nodeassert.default.strictEqual(result.length, 8);
// Verify all points are included
for (const point of largePoints){
(0, _nodeassert.default)(result.some((p)=>p.latitude === point.latitude && p.longitude === point.longitude));
}
});
//# sourceMappingURL=index.test.js.map