Quindi ho un incarico dal college dove devo applicare più metaeuristiche a problemi diversi. Ho pensato che avrei dovuto rendere tutto quanto più modulare e riutilizzabile possibile per riutilizzare la metaeuristica con diversi problemi con il minimo cambiamento possibile.
Ho bisogno di queste classi:
- Soluzione
- NeighbourOperator
- ExplorationStrategy
- metaeuristica
Inizialmente pensavo che Metaheuristic
conterrebbe un ExplorationStrategy
che conterrebbe un NeighbourOperator
. La strategia riceverebbe una soluzione e restituirebbe un vicino in base ai suoi membri. La strategia di esplorazione e metaheuristc avrebbero la classe della soluzione come modello.
Il mio ideale main.cpp dovrebbe essere:
SomeProblemSolution<int> solt = randomGeneratedSolution();
SomeNeighbourOperator op;
SomeExplorationStrategy<SomeProblemSolution> strat(op);
SomeMetaheuristic<SomeProblemSolution> mthr(strat);
mthr.apply(solt);
Ma questo è come apparirebbe il codice:
SomeProblemSolution<int> solt = randomGeneratedSolution();
SomeNeighbourOperator<int> op;
SomeExplorationStrategy<SomeProblemSolution, int> strat(op);
SomeMetaheuristic<SomeProblemSolution, int> mthr(strat);
mthr.apply(solt);
Ora ogni classe che interagisce con una soluzione richiede un modello.
template<class T>
class NeighOperator {
public:
virtual void applyOp(Solution<T> &, int) = 0;
....
template<class T, class S>
class NeighExplorator {
protected:
NeighOperator<S> *_neighOperator;
public:
virtual T exploreNg(T &sol) = 0;
....
Quindi
C'è qualche errore di progettazione con cui ho bisogno del tipo di modello della soluzione in ogni altra classe?
Esiste comunque la possibilità di rendere il programma generico in modo da utilizzare solo il tipo di modello (quello che rappresenta la soluzione) in Soluzione e non in tutti i punti in cui è implicata una soluzione?
Sto facendo qualcosa di sbagliato con i modelli (dovrei in qualche modo dedurre il tipo) o dovrei solo essere amico delle classi di cui ho bisogno?
Qualsiasi aiuto è molto apprezzato.