sdvrp

Crates.iosdvrp
lib.rssdvrp
version0.1.3
created_at2025-08-08 05:06:09.697061+00
updated_at2025-08-08 15:27:22.324827+00
descriptionRust binding of Alkaid-SDVRP: An Efficient Open-Source Solver for the Vehicle Routing Problem with Split Deliveries
homepage
repository
max_upload_size
id1786208
size1,733,258
(HellOwhatAs)

documentation

README

sdvrp

Rust binding of Alkaid-SDVRP: An Efficient Open-Source Solver for the Vehicle Routing Problem with Split Deliveries.

Quick Start

[dependencies]
sdvrp = "1.0"

Examples

use sdvrp::{config, instance, solve_sdvrp};

#[rustfmt::skip]
fn dense_matrix_example() -> instance::Instance {
    instance::Instance::from_dense_matrix(
        100,
        vec![60, 90, 60, 90, 60, 90, 60, 90],
        vec![
            vec![0, 100000, 100000, 100000, 100000, 200000, 200000, 200000, 200000],
            vec![100000, 0, 141421, 200000, 141421, 100000, 223607, 300000, 223607],
            vec![100000, 141421, 0, 141421, 200000, 223607, 100000, 223607, 300000],
            vec![100000, 200000, 141421, 0, 141421, 300000, 223607, 100000, 223607],
            vec![100000, 141421, 200000, 141421, 0, 223607, 300000, 223607, 100000],
            vec![200000, 100000, 223607, 300000, 223607, 0, 282843, 400000, 282843],
            vec![200000, 223607, 100000, 223607, 300000, 282843, 0, 282843, 400000],
            vec![200000, 300000, 223607, 100000, 223607, 400000, 282843, 0, 282843],
            vec![200000, 223607, 300000, 223607, 100000, 282843, 400000, 282843, 0],
        ],
    )
}

#[rustfmt::skip]
fn coord_list_example() -> instance::Instance {
    instance::Instance::from_coord_list(
        100,
        vec![
            60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90,
            60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90,
            60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90, 60, 90,
        ],
        vec![
            (    0,      0),
            ( 1000,      0),
            (  924,    383),
            (  707,    707),
            (  383,    924),
            (    0,   1000),
            ( -383,    924),
            ( -707,    707),
            ( -924,    383),
            (-1000,      0),
            ( -924,   -383),
            ( -707,   -707),
            ( -383,   -924),
            (   -0,  -1000),
            (  383,   -924),
            (  707,   -707),
            (  924,   -383),
            ( 2000,      0),
            ( 1848,    765),
            ( 1414,   1414),
            (  765,   1848),
            (    0,   2000),
            ( -765,   1848),
            (-1414,   1414),
            (-1848,    766),
            (-2000,      0),
            (-1848,   -765),
            (-1414,  -1414),
            ( -766,  -1848),
            (   -0,  -2000),
            (  765,  -1848),
            ( 1414,  -1414),
            ( 1848,   -766),
            ( 3000,      0),
            ( 2772,   1148),
            ( 2121,   2121),
            ( 1148,   2772),
            (    0,   3000),
            (-1148,   2772),
            (-2121,   2121),
            (-2772,   1148),
            (-3000,      0),
            (-2772,  -1148),
            (-2122,  -2121),
            (-1148,  -2771),
            (   -0,  -3000),
            ( 1148,  -2772),
            ( 2121,  -2122),
            ( 2771,  -1149),
            ( 4000,      0),
            ( 3696,   1531),
            ( 2828,   2828),
            ( 1531,   3695),
            (    0,   4000),
            (-1531,   3696),
            (-2828,   2829),
            (-3695,   1531),
            (-4000,      0),
            (-3696,  -1530),
            (-2829,  -2828),
            (-1531,  -3695),
            (   -1,  -4000),
            ( 1530,  -3696),
            ( 2828,  -2829),
            ( 3695,  -1531),
        ],
    )
}

fn main() {
    let mut config = config::Config::default();
    config.time_limit = 5.0;
    println!("{:?}", solve_sdvrp(&config, &dense_matrix_example()));
    config.time_limit = 10.0;
    println!("{:?}", solve_sdvrp(&config, &coord_list_example()));
}

Output:

End at 5.00003s: 2282842
[
    [(1, 40), (5, 60)],
    [(3, 40), (7, 60)],
    [(4, 10), (8, 90)],
    [(2, 80), (3, 20)],
    [(4, 80), (1, 20)],
    [(2, 10), (6, 90)],
]

End at 10.0004s: 268473
[
    [(14, 80), (13, 20)],
    [(57, 60), (41, 40)],
    [(45, 20), (46, 80)],
    [(63, 60), (47, 40)],
    [(33, 20), (34, 80)],
    [(51, 60), (35, 40)],
    [(36, 80), (35, 20)],
    [(30, 90), (14, 10)],
    [(16, 10), (32, 90)],
    [(16, 80), (15, 20)],
    [(40, 10), (56, 90), (8, 0)],
    [(58, 90), (42, 10)],
    [(12, 80), (11, 20)],
    [(34, 10), (50, 90), (2, 0)],
    [(61, 60), (45, 40)],
    [(27, 60), (11, 40)],
    [(13, 40), (29, 60)],
    [(26, 90), (10, 10)],
    [(9, 20), (10, 80)],
    [(46, 10), (62, 90)],
    [(40, 80), (39, 20)],
    [(39, 40), (55, 60)],
    [(38, 10), (54, 90), (6, 0)],
    [(33, 40), (49, 60)],
    [(23, 60), (7, 40)],
    [(43, 20), (44, 80)],
    [(28, 90), (12, 10)],
    [(41, 20), (42, 80)],
    [(31, 60), (15, 40)],
    [(59, 60), (43, 40)],
    [(25, 60), (9, 40)],
    [(37, 40), (53, 60)],
    [(38, 80), (37, 20)],
    [(17, 60), (1, 40)],
    [(4, 80), (3, 20)],
    [(20, 90), (4, 10)],
    [(24, 90), (8, 10)],
    [(18, 90), (2, 10)],
    [(7, 20), (8, 80)],
    [(3, 40), (19, 60)],
    [(2, 80), (1, 20)],
    [(6, 80), (5, 20)],
    [(6, 10), (22, 90)],
    [(5, 40), (21, 60)],
    [(12, 0), (60, 90), (44, 10)],
    [(32, 0), (48, 10), (64, 90), (16, 0)],
    [(32, 0), (48, 80), (47, 20)],
    [(4, 0), (52, 90), (36, 10)],
]
Commit count: 0

cargo fmt