#ifndef VNS_H
#define VNS_H

#include <iostream>
#include "Global.h"

struct MoveObservations
{
 	virtual unsigned operator()(cluster::View& view) const = 0;
	virtual ~MoveObservations() {}
};

struct LocalSearch
{
	virtual cluster::View& operator()(cluster::View& view) const = 0;
	virtual ~LocalSearch() {}
};

struct Perturbation
{
	virtual bool operator() (cluster::View & view,unsigned k) const = 0;
	virtual ~Perturbation() {}
};



class VNS : public global::Algorithmus
{
  protected:
	const MoveObservations * moveObs;
	const LocalSearch      * localSearch;
	const Perturbation     * perturb;
	const global::Initialisation * init;
	unsigned kMax;

	VNS() {}

  public:

	VNS(const MoveObservations       & _moveObs,
	    const LocalSearch            & _ls,
	    const Perturbation           & _perturb,
	    const global::Initialisation & _init,
	    unsigned _kMax = 10 )
	: moveObs(&_moveObs),localSearch(&_ls),perturb(&_perturb),
	  init(&_init),kMax(_kMax)
	{

	}

	//! Run the VNS
	virtual cluster::View& operator()(cluster::View& view) const;

	void eraseEmptyCluster( cluster::View & view ) const;
};


#endif
