Mon algorithme ne fonctionne pas
Fermé
hunter_civ
Messages postés
9
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
27 octobre 2020
-
Modifié le 27 oct. 2020 à 22:52
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 30 nov. 2020 à 15:58
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 30 nov. 2020 à 15:58
A voir également:
- Mon algorithme ne fonctionne pas
- Logiciel algorithme gratuit - Télécharger - Édition & Programmation
- Logiciel algorithme euromillion - Télécharger - Loisirs créatifs
- Code ascii algorithme - Guide
- Algorithme euromillion excel gratuit - Forum Algorithmes / Méthodes
- Tri d'une matrice algorithme - Forum C
1 réponse
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
30 nov. 2020 à 15:58
30 nov. 2020 à 15:58
Bonjour,
Même si le français n'est pas parfait, le sujet de l'exercice est super, ça change des exercices bien scolaires :-)))))
Peux-tu indiquer quel fichier d'entrée tu as utilisé ?
Ensuite la manière dont est formulé ton problème incite à partir sur un Branch and Bound. C'est l'approche que tu as suivi. Le code semble correct à première vue, hormis que tu n'arrêtes pas ton B&B quand une solution est trouvée. Une manière de faire pourrait consister à passer en paramètre de ta fonction
Optimisations
Dans le cas particulier où il n'y a pas de planète infectée, tu peux aussi directement utiliser un algorithme de Dijkstra qui sera bien plus efficace. Ainsi, il ne serait pas déraisonnable de chercher au préalable un chemin dans le sous-graphe en ignorant les sommets associés aux planètes infectées.
Si tu n'en trouves pas, tu peux répéter cette recherche en t'assurant qu'il n'y a pas de planète infectée dans le chemin trouvée
Ensuite il serait intéressant de voir dans quelle mesure un algorithme de Dijkstra généralisé (où la métrique d'un chemin est le couple qui contient la distance parcourue et la durée de vie de l'équipage), dont l'opération de comparaison est l'ordre lexicographique (distance parcourue, - durée de vie de l'équipage) et dont l'opération de concaténation est l'addition pour la distance parcourue et la mise à jour calcule un résultat correct. En toute rigueur il faudrait alors contrôler que la structure algébrique ainsi engendrée est un semi-anneau. Pour plus de détails, voir ce livre.
Bonne chance
Même si le français n'est pas parfait, le sujet de l'exercice est super, ça change des exercices bien scolaires :-)))))
Peux-tu indiquer quel fichier d'entrée tu as utilisé ?
Ensuite la manière dont est formulé ton problème incite à partir sur un Branch and Bound. C'est l'approche que tu as suivi. Le code semble correct à première vue, hormis que tu n'arrêtes pas ton B&B quand une solution est trouvée. Une manière de faire pourrait consister à passer en paramètre de ta fonction
Travelun booléen (partagé) par tous les appels récursifs, qui quand il est vrai, quitte la fonction
Travel. En effet l'instruction
returnne fait que quitter l'appel en cours (donc le nœud courant de ton Branch & Bound) pas les éventuelles autres branches en cours d'exploration.
#include <stdbool.h>
void Travel( ..., bool * found) {
if (x == t) {
found = true;
}
if (found) return;
...
}
int main(){
...
bool found = false;
Travel(..., &found)
...
if (found) {
// Afficher la solution trouvée
}
}
Optimisations
Dans le cas particulier où il n'y a pas de planète infectée, tu peux aussi directement utiliser un algorithme de Dijkstra qui sera bien plus efficace. Ainsi, il ne serait pas déraisonnable de chercher au préalable un chemin dans le sous-graphe en ignorant les sommets associés aux planètes infectées.
Si tu n'en trouves pas, tu peux répéter cette recherche en t'assurant qu'il n'y a pas de planète infectée dans le chemin trouvée
lbonds avant l'arrivée.
Ensuite il serait intéressant de voir dans quelle mesure un algorithme de Dijkstra généralisé (où la métrique d'un chemin est le couple qui contient la distance parcourue et la durée de vie de l'équipage), dont l'opération de comparaison est l'ordre lexicographique (distance parcourue, - durée de vie de l'équipage) et dont l'opération de concaténation est l'addition pour la distance parcourue et la mise à jour calcule un résultat correct. En toute rigueur il faudrait alors contrôler que la structure algébrique ainsi engendrée est un semi-anneau. Pour plus de détails, voir ce livre.
Bonne chance