topologicalSort
This commit is contained in:
parent
3232e8ea7f
commit
428d594e7b
7 changed files with 50 additions and 19 deletions
2
TODO.md
2
TODO.md
|
@ -29,7 +29,7 @@ TODO avant rendu :
|
||||||
- [ ] `contains()`
|
- [ ] `contains()`
|
||||||
- [x] Surcharge : afficher toutes les tâches
|
- [x] Surcharge : afficher toutes les tâches
|
||||||
- [ ] `consult_tasks()` <!-- faudrait testé si elles sont vraiment pas modifiable avant de cocher cette case -->
|
- [ ] `consult_tasks()` <!-- faudrait testé si elles sont vraiment pas modifiable avant de cocher cette case -->
|
||||||
- [ ] `topologicalSort()`
|
- [x] `topologicalSort()`
|
||||||
|
|
||||||
#### ProtoProjet
|
#### ProtoProjet
|
||||||
|
|
||||||
|
|
|
@ -3,15 +3,16 @@
|
||||||
|
|
||||||
#include "../includes/Tache.hpp"
|
#include "../includes/Tache.hpp"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
class Projet {
|
class Projet {
|
||||||
// Graphe acyclique
|
|
||||||
std::vector<Tache *> taches;
|
|
||||||
|
|
||||||
// Première tâche qui sera exécutée
|
Tache
|
||||||
const Tache debut;
|
// Première tâche qui sera exécutée
|
||||||
|
debut,
|
||||||
|
|
||||||
// Source du graphe aka la dernière à être exécutée
|
// Source du graphe aka la dernière à être exécutée
|
||||||
const Tache fin;
|
fin;
|
||||||
|
|
||||||
friend std::ostream &operator<<(std::ostream &, const Projet &);
|
friend std::ostream &operator<<(std::ostream &, const Projet &);
|
||||||
|
|
||||||
|
@ -22,6 +23,9 @@ protected:
|
||||||
Projet(const Projet &); // copy constructor
|
Projet(const Projet &); // copy constructor
|
||||||
const Projet &operator=(const Projet &); // copy assignement
|
const Projet &operator=(const Projet &); // copy assignement
|
||||||
|
|
||||||
|
// Graphe acyclique
|
||||||
|
std::vector<Tache *> taches;
|
||||||
|
|
||||||
// Retourne une paire d'indentifiants de tâches au hasard
|
// Retourne une paire d'indentifiants de tâches au hasard
|
||||||
const std::pair<const int, const int> pick_two_random_tasks() const;
|
const std::pair<const int, const int> pick_two_random_tasks() const;
|
||||||
|
|
||||||
|
@ -33,7 +37,7 @@ protected:
|
||||||
const std::vector<Tache *> consult_tasks() const;
|
const std::vector<Tache *> consult_tasks() const;
|
||||||
|
|
||||||
// Corrige les éventuelles anomalies du vector de tâches
|
// Corrige les éventuelles anomalies du vector de tâches
|
||||||
void topologicalSort() const;
|
std::vector<Tache *> topologicalSort();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -15,10 +15,10 @@ public:
|
||||||
const ProtoProjet &operator=(const ProtoProjet &); // copy assignement
|
const ProtoProjet &operator=(const ProtoProjet &); // copy assignement
|
||||||
|
|
||||||
// Remet tous les marquages à leur valeur initiale
|
// Remet tous les marquages à leur valeur initiale
|
||||||
/* void cleanMarks();
|
void cleanMarks();
|
||||||
|
|
||||||
// Insère une nouvelle tâche en la plaçant entre deux tâches au hasars
|
// Insère une nouvelle tâche en la plaçant entre deux tâches au hasars
|
||||||
bool ajoute(std::string nom, int duree); */
|
/* bool ajoute(std::string nom, int duree); */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -34,6 +34,9 @@ class Tache final {
|
||||||
void _copy(const Tache &);
|
void _copy(const Tache &);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
// Vrai si la tâche à été visitée par le parcours en profondeur
|
||||||
|
bool visite;
|
||||||
|
|
||||||
Tache(const std::string, const int); // constructor
|
Tache(const std::string, const int); // constructor
|
||||||
virtual ~Tache(); // destructor
|
virtual ~Tache(); // destructor
|
||||||
|
|
||||||
|
@ -51,6 +54,9 @@ public:
|
||||||
|
|
||||||
// Calcule la durée totale max de réalisation d'une tâche et des dépendances
|
// Calcule la durée totale max de réalisation d'une tâche et des dépendances
|
||||||
int dureeParal() const;
|
int dureeParal() const;
|
||||||
|
|
||||||
|
// Parcours en profondeur
|
||||||
|
void PP_postfixe(std::vector<Tache *>);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -66,9 +66,18 @@ const Tache *Projet::contains(const std::string name) const {
|
||||||
|
|
||||||
const std::vector<Tache *> Projet::consult_tasks() const { return taches; }
|
const std::vector<Tache *> Projet::consult_tasks() const { return taches; }
|
||||||
|
|
||||||
void Projet::topologicalSort() const {
|
std::vector<Tache *> Projet::topologicalSort() {
|
||||||
// Recupere le calcul fait par PP_postfixe et construit son tri
|
// Construction de la pile
|
||||||
// PP_postfixe(this->taches);
|
std::vector<Tache *> pile;
|
||||||
|
for (Tache *it : taches) {
|
||||||
|
if (!it->visite) {
|
||||||
|
it->PP_postfixe(pile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
// Reverse de la pile
|
||||||
|
std::reverse(pile.begin(), pile.end());
|
||||||
|
|
||||||
|
// Renvoie la liste de tâches topologiquement triée
|
||||||
|
return pile;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,12 +14,12 @@ const ProtoProjet &ProtoProjet::operator=(const ProtoProjet &src) {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* void ProtoProjet::cleanMarks(){
|
void ProtoProjet::cleanMarks() {
|
||||||
for (auto t : this->getTaches()) {
|
for (auto t : taches) {
|
||||||
t.second = false;
|
t->visite = false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
bool ProtoProjet::ajoute(std::string nom, int duree) {
|
/* bool ProtoProjet::ajoute(std::string nom, int duree) {
|
||||||
return false;
|
return false;
|
||||||
} */
|
} */
|
||||||
|
|
|
@ -113,3 +113,15 @@ int Tache::dureeParal() const {
|
||||||
// On ajoute la valeur max à notre durée totale
|
// On ajoute la valeur max à notre durée totale
|
||||||
return ret_value + max_duree;
|
return ret_value + max_duree;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Tache::PP_postfixe(std::vector<Tache *> pile) {
|
||||||
|
visite = true;
|
||||||
|
for (Tache *it : dependances) {
|
||||||
|
if (!it->visite) {
|
||||||
|
it->PP_postfixe(pile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Moment post-fix du parcours
|
||||||
|
pile.push_back(this);
|
||||||
|
}
|
||||||
|
|
Reference in a new issue