日本全国に1361店舗あるファミリーレストラン「ガスト」を効率よく回れるルートを検討するための案。 巡回セールスマン問題ににたやつ。 焼きなまし法(simulated annealing)を使って算出しているけれど、なかなか最適なルートは作れない。 関東から東北にかけてが特にあやしげ。
データは2019年4月26日時点のもの。
Built with blockbuilder.org
license: mit |
日本全国に1361店舗あるファミリーレストラン「ガスト」を効率よく回れるルートを検討するための案。 巡回セールスマン問題ににたやつ。 焼きなまし法(simulated annealing)を使って算出しているけれど、なかなか最適なルートは作れない。 関東から東北にかけてが特にあやしげ。
データは2019年4月26日時点のもの。
Built with blockbuilder.org
<!DOCTYPE html> | |
<html lang='jp'> | |
<head> | |
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.4.0/dist/leaflet.css" | |
integrity="sha512-puBpdR0798OZvTTbP4A8Ix/l+A4dHDD0DGqYW6RQ+9jxkRFclaxxQb/SJAWZfWAkuyeQUytO7+7N4QKrDh+drA==" | |
crossorigin=""/> | |
<script src="https://unpkg.com/leaflet@1.4.0/dist/leaflet.js" | |
integrity="sha512-QVftwZFqvtRNi0ZyCtsznlKSWOStnDORoefr1enyq5mVL4tmKB3S/EnC3rRJcxCPavG10IcrVGSmPh6Qw5lwrg==" | |
crossorigin=""></script> | |
<link rel="stylesheet" href="https://unpkg.com/leaflet.pm@latest/dist/leaflet.pm.css" /> | |
<script src="https://unpkg.com/leaflet.pm@latest/dist/leaflet.pm.min.js"></script> | |
<style> | |
html, body { | |
width: 100%; | |
height: 100%; | |
padding: 0px; | |
margin: 0px; | |
} | |
#mapid { | |
width:100%; | |
height:100%; | |
} | |
</style> | |
</head> | |
<body> | |
<div id="mapid"></div> | |
<script src='//unpkg.com/d3@5.0.0/dist/d3.min.js'></script> | |
<script> | |
var mymap = L.map('mapid').setView([31.2913471,130.274312], 6); | |
L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}', { | |
attribution: 'Map data © <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>', | |
maxZoom: 10, | |
id: 'mapbox.light', | |
accessToken: 'pk.eyJ1Ijoic2hpbWl6dSIsImEiOiJjam95MDBhamYxMjA1M2tyemk2aHMwenp5In0.i2kMIJulhyPLwp3jiLlpsA' | |
}).addTo(mymap); | |
var p1 = sendGetReauest('allLines.geojson'); | |
var p2 = sendGetReauest('points.geojson'); | |
Promise.all([p1, p2]).then(function(data){ | |
var lines = data[0]; | |
var points = data[1]; | |
console.log(data) | |
L.geoJSON(lines, { | |
style: { | |
"color": "#d1000f", | |
"weight": 1, | |
"opacity": 1 | |
} | |
}).addTo(mymap); | |
var geojsonMarkerOptions = { | |
radius: 8, | |
fillColor: "#f8d202", | |
color: "#d1000f", | |
weight: 1, | |
opacity: 1, | |
fillOpacity: 0.65 | |
}; | |
var onEachFeature = function(feature, layer) { | |
if (feature.properties && feature.properties.name) { | |
layer.bindPopup(feature.properties.name + "<br>" + feature.properties.address); | |
} | |
} | |
L.geoJSON(points, { | |
pointToLayer: function (feature, latlng) { | |
return L.circleMarker(latlng, geojsonMarkerOptions); | |
}, | |
onEachFeature: onEachFeature | |
}).addTo(mymap); | |
}); | |
function sendGetReauest(url) { | |
return fetch(url, { | |
method: "GET", | |
headers: { | |
"Content-Type": "application/json; charset=utf-8", | |
} | |
}) | |
.then(function(response){ return response.json() }); | |
} | |
</script> | |
</body> | |
</html> |