Skip to content

Variable Neighborhood Descent (VND)

Variable Neighborhood Descent (VND) is a deterministic improvement method that systematically explores multiple neighborhood structures to escape local optima. Unlike VNS, VND doesn't use shakes.

Algorithm Overview

VND cycles through a set of improvement methods, usually local searches, until a local optimum with respect to all neighborhoods is reached.

graph TD
    A[Start with Solution s] --> B[k = 0]
    B --> C[Apply LS in Neighborhood k]
    C --> D{Improvement Found?}
    D -->|Yes| E[Accept New Solution]
    E --> B
    D -->|No| F[k = k + 1]
    F --> G{k > kmax?}
    G -->|No| C
    G -->|Yes| H[Return Solution]

The solution returned by a VND method is a local optimum for all its configured improvement methods. A key difference between a sequence of improvement methods (for example, using Improver::serial) is that VND always resets to the first improvement when the solution improves.

Algorithm Outline

VND(solution s) {
    k = 0
    while (k <= kmax) {
        s' = improvers[k].improve(s)

        if (s'.isBetterThan(s)) {
            s = s'
            k = 0  // Restart when improved
        } else {
            k = k + 1 
        }
    }
    return s
}