All notable changes to this project will be documented in this file.
Please note, while the major version has reached 1, breaking changes can be still introduced within any minor version. I would prefer to downgrade the major version back to 0 to be more consistent with semantic versioning, but the crates are already published. So, I stick to it for now.
This release focuses on improving heuristic and some performance optimizations.
- update rust version
- apply some minor code refactorings
- apply some performance optimizations
- refactor dbscan clustering api
- improve heuristic a bit
- replace
compare_floats
with built-intotal_cmp
- gene pool in rosomaxa
This release focuses on refactorings to simplify API, code usage, extendability and overall maintainability. It contains a lot of internal changes and has overall significant improvements.
- examples how to extend the library (
vrp-core/examples
)
- GitHub sponsors functionality
- experimental
async-evolution
feature - NSGA-II implementation and its usage
- dependency on
hashbrown
crate - state keys
- Fix issue in
fast-service
objective (#144)
- fix clippy warnings
- minor refactorings
- increase limits for ruin methods
- tweak rosomaxa algorithm
- tweak job index
- tweak infeasible search heuristic
- refactor route intervals and multi trip enablers
- refactor feature objective trait
- refactor dimensions/extras approach to avoid using strings as keys
- how the goal of optimization is defined
- flatten objectives in the pragmatic format
v1.23.0- 2023-12-22
This release combines many changes, but essentials are:
- internal route state api simplification
- increased performance
- several experimental features
- bug fixes
- original job place index in activity place to simplify activity-job place matching
experimental
: a new type of location in pragmatic format to model zero distance/duration from it to any other location. This could be useful to model optional vehicle start location.- allow user to pass alternative objectives in goal context to guide the search
experimental
: a newfast-service
objective function to serve jobs as soon as possible
- experimental
dispatch
feature
- apply code style refactoring
- improve selection sampling search
- update dependencies
- improve a bit documentation
- refactor route state
- do not use hashmaps to store activity states
- double reload assignment when initial solution is used (#126)
- unexpected total_order behavior in dynamic heuristic (#128)
- improve validation rule for break with time offset (#129)
- fix issue with skills (#133)
- do not cluster jobs if they are defined in relations (#141)
v1.22.1- 2023-08-26
experimental
recharge stations feature to support basic electric VRP use case
- apply refactorings to some core api
- update dependencies
- reload is removed from the solution passed as initial (#126)
v1.22.0- 2023-08-08
This release focuses on algorithmic and some feature changes
breaking
replace MDP with multi-armed bandit RL algorithm- change
stops.activity.time.start
not to include waiting time - improve required break functionality
- improve managing packages with cargo's workspace
- update dependencies
breaking
: refactor internal models to simplify cost/telemetry handlingbreaking
change required break definition to support time range- change duration in csv import command from minutes to seconds
breaking
useGenericError
instead ofString
withinResult
- more experimental plots in
heuristic-research
playground - geojson output if the library is used from interop api
v1.21.1- 2023-06-09
This release brings experimental async-evolution
with other improvements.
- update dependencies
- fix documentation issues
- refactor
HeuristicContext
trait to avoid usingHeuristicPopulation
directly from it - improve non-determinism based selectors logic
- add experimental feature
async-evolution
v1.21.0- 2023-04-27
This release brings hierarchical approach for local objective estimation. Additionally, it focuses on refactoring, mostly to avoid usafe code. In memory of..
- use hierarchical approach for local objective estimation
- avoid unsafe code project-wise:
- apply
#![forbid(unsafe_code)]
directive for rosomaxa/vrp-core/vrp-pragmatic/vrp-scientific - apply
#![deny(unsafe_code)]
directive for vrp-cli (due to FFI which is only one exception) - allow unsafe code only when necessary in research crates which are not used anyhow in production code
- apply
- make pyo3 an optional dependency and wrap python bindings under
py_bindings
feature - refactor
Deref
trait usage - implement
Debug
for essential core types - refactor job index to lower memory footprint for a large scale VRP (tested on 30k CVRP instance)
- use proper objective for tsplib format problems (CVRP)
- error handling types
- fix sort stability issue in elitism's improvement detection method
- switch rosomaxa learning rate to cosine annealing
- rename
shiftTime
limit tomaxDuration
- experimental
compact-tour
objective which tries to shape routes based on job neighbourhood. - heuristic filtering extension
- simple tabu list implementation used by some ruin methods
- gene pool in rosomaxa to reintroduce some genes while search progresses
v1.20.0- 2023-04-01
This release is focused on removing unsafe code from the solver core.
- refactor RouteContext to avoid using Arc and unsafe code
- refactor Network to avoid using Arc/RwLock and, as result, unsafe code in consumers
- adapt core api to required safety changes
v1.19.2 - 2023-03-22
This release introduces improvements in rosomaxa-heuristic.
- python binding with pyo3
- example how to use library with maturin
- cleaned area leftovers
- update dependencies
- update rust version on dev environment to 1.68
- fix clippy warnings
- bug fix in capacity feature
- change gsom compaction logic and adapt rosomaxa
v1.19.1 - 2022-12-14
breaking
: replaceLegSelector
withLegSelectionMode
- use different approach for leg selection: selection sampling search
- introduce initial weights in dynamic heuristic
- update dependencies
- update rust version on dev environment to the latest (1.65.0)
v1.19.0 - 2022-10-16
This release is focused on internal design improvements with some performance implications.
breaking
: combine objectives and constraint modules into feature concept- improve ruin limits logic
- change insertion position evaluation logic to speedup analysis
- update dependencies
- update rust version used for development (1.64)
breaking
: remove area constraint as it needs rework
v1.18.4 - 2022-08-21
breaking
: simplify unassigned job reason model- fix capacity violation issue related to reload feature
v1.18.3 - 2022-08-10
- add shared resource constraint for vehicle reload. Essentially, it is a limit for amount of deliveries picked from specific reload places.
- improve obsolete reload removal logic
- improve groups constraint
- refactor heuristic research crate
v1.18.2 - 2022-07-12
RedistributeSearch
heuristicdiversify
method to hyper-heuristics to increase population diversity when search stagnates
- use experimental mode to print dynamic heuristic statistics
- random trait internals
- refactor multi trip functionality
- use faster hash builders inside
RouteState
andDimensions
- update dependencies
v1.18.1 - 2022-05-13
- expose more than one reason of job unassignment. This should give more information why job was not assigned to existing tours.
- adapt weights in heuristics
v1.18.0 - 2022-05-07
This release focuses on performance improvements.
- adapt
RosomaxaWeighted
interface for weight caching - modify MDP reward of heuristic based on its execution time
breaking
: useSmallRng
as faster alternative toStdRng
and avoid initialization on each usage- improve slow search detection logic
- update dependencies
- fix issue: telemetry metrics are not included in solution file
- fix issue: capacity violation in rare cases when multi-jobs are used
WorstRouteRemoval
: removes routes with the smallest amount of jobs
- remove
MultiSelective
and useDynamicSelective
by default
v1.17.0 - 2022-04-25
This release focuses on internal algorithm improvements in direction of predictability.
- upgrade to 1.60 rust
- fix tour order issue related to break/reload activities
- fix limit violation issue in specific use cases
- improve rosomaxa and customized GSOM implementation
- use a new
Arc::new_cyclic
method to bind multi-single jobs - fix regression in runtime performance related to greediness of SWAP* heuristic implementation
- heuristic research playground with algorithm visualizations capabilities
v1.16.1 - 2022-03-10
- stopping by terminal signal
minimize-arrival-time
objective to prefer solutions where work is finished earlier.
v1.16.0 - 2022-03-03
breaking
: add required break functionality (experimental)- update dependencies
v1.15.0 - 2022-02-15
breaking
: rework area constraint
v1.14.0 - 2022-01-23
breaking
: extract rosomaxa crate with generalized heuristic implementation- update dependencies
v1.13.0 - 2021-12-05
- add
compatibility
property to the job definition - add new local search operator based on SWAP* algorithm
- migrate to 2021 edition
- update dependencies
- remove dependency on
chrono
in favor oftime
- use variable strategy for leg insertion analysis
- adjust route removal ruin methods to limit a bit amount of removed jobs
- order of initial heuristics
v1.12.0 - 2021-11-16
- a new local search operator: exchange sequence
- a vicinity job clustering: group close jobs in the same stop and visit them differently
- update dependencies
- bug fixes
v1.11.5 - 2021-09-27
- a limited support for TSPLIB95 format
- more validation rules for objective usage
- change defaults for initial solution building logic
- improve rosomaxa algorithm
- improve tour order objective logic
- update dependencies
v1.11.4 - 2021-09-10
- fix a memory leak
- update dependencies
v1.11.3 - 2021-09-07
analyze clusters
command to cli- break policy property
- a penalty property for skipping break in
maximize-value
objective
- improve clustering removal heuristic
- enhance rules for slow search detection and reduce search radius in case of it
- improve unassigned jobs handling logic
- update dependencies
v1.11.2 - 2021-08-22
group
constraint on job in pragmatic format
v1.11.1 - 2021-08-17
- slice recreate method
breaking
: move tag from task to place level in pragmatic formatbreaking
: adjust break definition to be consistent with job- update dependencies
v1.11.0 - 2021-08-08
- a metaheuristic which searches in infeasible solution space
- logic to swap objective with some small probability in rosomaxa algorithm
- refactor logging configuration
- change metaheuristic coefficients
v1.10.8 - 2021-07-21
- validation rule for any relation
v1.10.7 - 2021-07-12
- export validation function
v1.10.6 - 2021-06-27
- logging prefix in config
- minor changes in core logic
v1.10.5 - 2021-06-20
- finalize tour order implementation and make it work on job place level
- minor improvements in pragmatic format logic
- update dependencies
- undocumented
hre
format
v1.10.4 - 2021-05-15
- pre/post processing steps for problem and solution
- optimization which moves backward departure time
- coefficient of variation termination criteria is extended to support time period
- do not always try to move forward departure time
v1.10.3 - 2021-05-03
- new recreate method:
RecreateWithSkipRandom
min-cv
can be used in exploration search phase- improve rosomaxa algorithm
v1.10.2 - 2021-04-28
- introduce
min-cv
parameter instead ofcost-variation
- improved stability of some tests
- bug fixes
cost-variation
parameter
v1.10.1 - 2021-04-20
breaking
: rename job'spriority
property toorder
- change default objective behaviour when
value
property is used
v1.10.0 - 2021-04-02
This release has breaking changes in pragmatic format and internal apis.
- new objectives:
minimize-distance
andminimize-duration
- new CLI option:
init-size
to control amount of initial solutions to be built built - travelling duration scale on vehicle profile: it can be used to adjust durations for specific vehicle type
- optimize cluster ruin method
- improve unassigned code reason handling
breaking
: convert profile property on vehicle type to an object
type
property from matrix profile
v1.9.1 - 2021-03-24
- maximize value objective
- build multiple initial solutions
v1.9.0 - 2021-03-19
- use dynamic hyper-heuristic by default
- flatten objective functions definition
- rebalance coefficients of recreate methods
- reduce default population selection size
v1.8.1 - 2021-02-26
- a new ruin method which destroys closest routes
- more solution checker rules
- rebalance ruin methods
- fix an issue with huge amount of possible permutations in multi job
v1.8.0 - 2021-02-07
- a new mutation operator: decompose search which is used for bigger problem instances
- a new population type: greedy
breaking
: introduced hyper-heuristic model- an experimental dynamic selective hyper-heuristic (WIP)
- speedup processing of unassigned jobs
v1.7.4 - 2021-01-23
- introduced parallelism control options (experimental).
v1.7.3 - 2021-01-08
- update
hre
format support to v2 version - update dependencies
v1.7.2 - 2020-12-05
- update dependencies
- apply minor algorithm changes
v1.7.1 - 2020-11-29
This release focuses on improving performance and bug fixing.
- use
stale
flag internally to avoid route state updates on non-changed routes
- remove unstable push tour departure LS method
v1.7.0 - 2020-11-23
This release features a new solution space exploration algorithm called ROSOMAXA: Routing Optimizations with Self Organizing MAps and eXtrAs (pronounced as "rosomaha", from russian "росомаха" - "wolverine").
- add and use by default rosomaxa algorithm
- add a new LS method to push tour departure in the future
- add a Local Search mutation
- add farthest insertion heuristic
- move Local Search out of Ruin Recreate mutation
breaking
: use string as unassigned job reason code
v1.6.4 - 2020-10-27
- tour size constraint which limits amount of job activities per tour
v1.6.3 - 2020-10-21
- introduce dispatch feature to support vehicle dispatching functionality (depot replacement)
breaking
: removed depot feature
ExchangeIntraRouteRandom
now removes and reinserts with noise a single random job
v1.6.2 - 2020-10-18
breaking
: job skills are now defined byallOf
,oneOf
andnoneOf
conditions- use
hashbrown
library inpragmatic
crate - fixed minor bugs
config
property frompragmatic
format
v1.6.1 - 2020-10-15
breaks
property inminimize-unassigned
objective- dependencies audit by
github actions
- break assignment is made less strict by default. User has certain control on its assignment by the objective
- replaced
uniform_real(0., 1.)
usage withis_hit
method inRandom
trait - default parameters of local search operators
- minor tech debt
v1.6.0 - 2020-10-14
- cargo features to build
cli
library without certain dependencies - proper
k-regret
recreate method recreate-with-perturbation
recreate method- add
local search
operators to ruin recreate mutation:- inter route best
- inter route random
- intra route random
- renamed regret to
skip-best
method
- some issues in init readers
v1.5.0 - 2020-09-07
- accept location indices for routing matrix
- do not generate initial solutions when initial solution supplied
- ruin bug with zero-cost jobs
- population size performance issue
- incorrect checker expectations regarding
vehicleId
template
- Initial public release
- Initial commit