Scippy

SCIP

Solving Constraint Integer Programs

heur_multistart.h File Reference

Detailed Description

multistart heuristic for convex and nonconvex MINLPs

Author
Benjamin Mueller

The heuristic applies multiple NLP local searches to a mixed-integer nonlinear program with, probably nonconvex, constraints of the form \(g_j(x) \le 0\). The algorithm tries to identify clusters which approximate the boundary of the feasible set of the continuous relaxation by sampling and improving randomly generated points. For each cluster we use a local search heuristic to find feasible solutions. The algorithm consists of the following four steps:

  1. sample points

    Sample random points \( x^1, \ldots, x^n \) in the box \( [\ell,u] \). For an unbounded variable \( x_i \) we consider \( [\ell_i,\ell_i + \alpha], [u_i - \alpha,u_i], \) or \( [-\alpha / 2, \alpha / 2]\) for an \( \alpha > 0 \) depending on which bound is infinite.

  2. reduce infeasibility

    For each point \( x^i \) we use a gradient descent method to reduce the maximum infeasibility. We first compute

    \[ d_j = -\frac{g_j(x^i)}{||\nabla g_j(x^i)||^2} \nabla g_j(x^i) \]

    and update the current point \( x^i \) with

    \[ x^i := x^i + \frac{1}{n_j} \sum_{j} d_j \]

    where \( n_j \) is the number of strictly positive \( d_j \). The algorithm is called Constraint Consensus Method and has been introduced by here .

  3. cluster points

    We use a greedy algorithm to all of the resulting points of step 3. to find clusters which (hopefully) approximate the boundary of the feasible set locally. Points with a too large violations will be filtered.

  4. solve sub-problems

    Depending on the current setting, we solve a sub-problem for each identified cluster. The default strategy is to compute a starting point for the sub-NLP heuristic (see heur_subnlp.h) by using a linear combination of the points in a cluster \( C \), i.e.,

    \[ s := \sum_{x \in C} \lambda_x x \]

    Since the sub-NLP heuristic requires a starting point which is integer feasible we round each fractional value \( s_i \) to its closest integer.

Definition in file heur_multistart.h.

#include "scip/scip.h"

Go to the source code of this file.

Functions

SCIP_RETCODE SCIPincludeHeurMultistart (SCIP *scip)