reinterpretcat / vrp

A Vehicle Routing Problem solver
https://reinterpretcat.github.io/vrp/
Apache License 2.0
331 stars 68 forks source link

Can't set termination in solver builder #17

Open skyien opened 3 years ago

skyien commented 3 years ago

In vrp-core/src/solver/builder.rs:

 pub fn with_termination(mut self, termination: Arc<dyn Termination + Send + Sync>) -> Self {
        self.config.telemetry.log("configured to use custom termination parameters");
        self.config.termination = termination;
        self
    }

but below in:

pub fn build(self) -> Result<Solver, String>

termination configuration overrides by this line:

config.termination = Arc::new(CompositeTermination::new(criterias));
reinterpretcat commented 3 years ago

Yeah, it looks like I have to redesign a bit this method to make the library more usable from code. At the moment, I'm focusing mostly on usage from CLI interface, so there might be some inconsistency for different scenarios.

skyien commented 3 years ago

@reinterpretcat, как Вы думаете имеет ли смысл идея, если реализовать критерий завершения по условию, что, например, в N последних генерациях не изменяются косты и количество неназначенных задач? Просто я смотрю, что в основном лучшее решение находится буквально 100-й генерации, а дальше никаких изменений.

reinterpretcat commented 3 years ago

Вообще, конечно, подобное условие уже есть - cost variation на основе коэффициэнта вариации. Но по умолчанию оно будет работать немного неожиданно, т.к. оно включается для последней фазы поиска, когда алгоритм находится в режиме активного исследования локального оптимума (exploitation), который занимает последние 10 процентов времени исполнения. Мне кажется, что если разрешить его использование в режиме параллельного поиска новых локальных оптимумов (exploration), cost variation может остановить алгоритм слишком рано в некоторых случаях.

Самое простое решение сейчас - это использовать cost variation с search-mode=deep, который включает алгоритм поиска на основе механизма элитизма в режиме exploitation, вместо алгоритма диверсификации по умолчанию (rosomaxa). Недостаток - снизится возможность алгоритма находить другие локальные оптимумы.

См. документацию здесь: https://reinterpretcat.github.io/vrp/getting-started/solver.html#search-mode https://reinterpretcat.github.io/vrp/getting-started/solver.html#cost-variation

skyien commented 3 years ago

Илья, благодарю за ответ! Видимо я невнимательно изучил документацию. Попробую этот вариант. И заодно хотелось бы Вас поблагодарить за Ваш проект!

reinterpretcat commented 3 years ago

Спасибо за отзыв!

Этот момент недостаточно описан еще в документации, так как проект еще по-прежнему в своеобразном экспериментальном состоянии. Необходимо будет время, чтобы упорядочить и описать реализованные идеи.