Jgrapht: DeltaSteppingShortestPath๋Š” 3๊ฐœ ์ด์ƒ์˜ ๊ฐ€์žฅ์ž๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ๋กœ์—์„œ SSSP๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2020๋…„ 10์›” 30์ผ  ยท  5์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: jgrapht/jgrapht

 * JGraphT version: 1.5.0 [also tested on 1.4.0]
 * Java version (java -version)/platform:  adopt-openjdk-15/windows [also tested on oracle 1.8.0_265/windows]

๋ฌธ์ œ
DeltaSteppingShortestPath๋Š” ๋Œ€์ƒ ์ •์ ์ด ์†Œ์Šค ์ •์ ์—์„œ 3๊ฐœ ์ด์ƒ์˜ ๊ฐ€์žฅ์ž๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์žฌํ˜„ ๋‹จ๊ณ„(์ž‘์€ ์ฝ”๋”ฉ ์˜ˆ)

DirectedWeightedMultigraph<String, DefaultWeightedEdge> graph = new DirectedWeightedMultigraph<>(DefaultWeightedEdge.class);
graph.addVertex("v0");
graph.addVertex("v1");
graph.addVertex("v2");
graph.addVertex("v3");
graph.addEdge("v0", "v1");
graph.addEdge("v1", "v2");
graph.addEdge("v2", "v3");
new DeltaSteppingShortestPath<>(graph).getPath("v0", "v3") // this returns null
new DijkstraShortestPath<>(graph).getPath("v0", "v3") // this returns a non-null result

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™
DeltaSteppingShortestPath๋Š” DijkstraShortestPath์™€ ์œ ์‚ฌํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐํƒ€ ์ •๋ณด

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚ด ๋กœ์ปฌ ์ง€์ ์˜ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฐ‹ ์œ„์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— #972๊ฐ€ ๋ณ‘ํ•ฉ๋œ ํ›„ PR์„ ์ œ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฒ„ํ‚ท ์ˆ˜ ๊ณ„์‚ฐ์ด ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ณ„์‚ฐ ์ค‘ ๋ฒ„ํ‚ท ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๋ฐ˜๋ณต์€ ๋ชจ๋“  ๋ฒ„ํ‚ท์ด ํ•œ ๋ฒˆ๋งŒ ํ†ต๊ณผ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ •ํ™•ํ•˜๋ ค๋ฉด ๋ฒ„ํ‚ท์˜ ์ˆ˜๊ฐ€ ceil(L/delta) ์™€ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ L ๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ์ตœ๋Œ€ ๊ฐ€์ค‘์น˜์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๊ตฌํ˜„์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐ๋œ ๋ฒ„ํ‚ท ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

numOfBuckets = (int) (Math.ceil(maxEdgeWeight / delta) + 1);

์ •์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฒ„ํ‚ท์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

private int bucketIndex(double distance) {
    return (int) Math.round(distance / delta) % numOfBuckets;
}

๋”ฐ๋ผ์„œ ์ผ๋ถ€ ๋ฒ„ํ‚ท์€ ์—ฌ๋Ÿฌ ๋ฒˆ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ชจ๋“  ์ƒํ˜ธ ์ž‘์šฉ์—์„œ ๋น„์–ด ์žˆ์ง€ ์•Š์€ ์ฒซ ๋ฒˆ์งธ ๋ฒ„ํ‚ท์œผ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Screenshot from 2021-01-17 12-57-23

๋ชจ๋“  5 ๋Œ“๊ธ€

@SCHudakov ์ข€ ๋ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@d-michail ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค.

@SChudakov ๋Š” ๋ฒ„ํ‚ท ๊ณ„์‚ฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

numOfBuckets = (int) (Math.ceil(maxEdgeWeight / delta) + 1);

https://github.com/jgrapht/jgrapht/blob/master/jgrapht-core/src/main/java/org/jgrapht/alg/shortestpath/DeltaSteppingShortestPath.java#L312

์œ„์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๊ทธ๋ž˜ํ”„์˜ maxEdgeWeight๊ฐ€ 1(๋ฐ delta=1)์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„ํ‚ท์˜ ์ˆ˜๋Š” 2์ž…๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ์ ์–ด๋„ 3๊ฐœ ์ด์ƒ์˜ ์—ฐ๊ฒฐ๋œ ๊ฐ„์„ ์ด ์žˆ๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ํ’€ ์ˆ˜ ์—†๋Š” ์ด์œ ๋ฅผ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋กœ์ปฌ ์ง€์ ์˜ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฐ‹ ์œ„์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— #972๊ฐ€ ๋ณ‘ํ•ฉ๋œ ํ›„ PR์„ ์ œ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฒ„ํ‚ท ์ˆ˜ ๊ณ„์‚ฐ์ด ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ณ„์‚ฐ ์ค‘ ๋ฒ„ํ‚ท ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๋ฐ˜๋ณต์€ ๋ชจ๋“  ๋ฒ„ํ‚ท์ด ํ•œ ๋ฒˆ๋งŒ ํ†ต๊ณผ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ •ํ™•ํ•˜๋ ค๋ฉด ๋ฒ„ํ‚ท์˜ ์ˆ˜๊ฐ€ ceil(L/delta) ์™€ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ L ๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ์ตœ๋Œ€ ๊ฐ€์ค‘์น˜์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๊ตฌํ˜„์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐ๋œ ๋ฒ„ํ‚ท ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

numOfBuckets = (int) (Math.ceil(maxEdgeWeight / delta) + 1);

์ •์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฒ„ํ‚ท์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

private int bucketIndex(double distance) {
    return (int) Math.round(distance / delta) % numOfBuckets;
}

๋”ฐ๋ผ์„œ ์ผ๋ถ€ ๋ฒ„ํ‚ท์€ ์—ฌ๋Ÿฌ ๋ฒˆ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ชจ๋“  ์ƒํ˜ธ ์ž‘์šฉ์—์„œ ๋น„์–ด ์žˆ์ง€ ์•Š์€ ์ฒซ ๋ฒˆ์งธ ๋ฒ„ํ‚ท์œผ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Screenshot from 2021-01-17 12-57-23

์ด์ œ ๋‹ซ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

simlu picture simlu  ยท  14์ฝ”๋ฉ˜ํŠธ

io7m picture io7m  ยท  53์ฝ”๋ฉ˜ํŠธ

nikhilbhardwaj picture nikhilbhardwaj  ยท  3์ฝ”๋ฉ˜ํŠธ

IngerMathilde picture IngerMathilde  ยท  5์ฝ”๋ฉ˜ํŠธ

jsichi picture jsichi  ยท  12์ฝ”๋ฉ˜ํŠธ