Programmation branch and bound en C/C++

Fermé
ania_10 Messages postés 1 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 7 janvier 2006 - 7 janv. 2006 à 09:32
mamiemando Messages postés 33401 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 novembre 2024 - 15 avril 2008 à 19:18
bonjour tout le monde
voila, je dois faire un tp qui consiste à programmer l'algorithme du branch and bound (separation et evaluation) utilisé pour resoudre des problemes lineaire en nombres entiers en C ou C++
est ce que quelqu'un sait comment faire?
merci
A voir également:

4 réponses

salut ania
on est à la recherche de la même chose
état initial , état final n'est pas ?
mais si je trouve quoi que ce soit je te tiendrais au courant.
0
mamiemando Messages postés 33401 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 novembre 2024 7 804
29 janv. 2006 à 21:20
Moi je l'ai fait dans ma jeunesse et le plus simple c'est encore de faire un appel récursif à ta fonction d'exploration de l'arbre de recherche.

Bien penser à lui passer en paramètre la valeur de la solution optimale f(s*) (borne inférieure) trouvée jusqu'ici et le vecteur solution courant s. Ne pas perdre de vue que l'ordre dans lequel on affecte les variable peut avoir une grande influence sur la rapidité de l'algo(utiliser une heuristique pour bien la choisir)

Idéalement trouver un critère de coupure pour accélerer la recherche.

Attention à ne pas se planter avec les pointeurs. Il ne faut pas perdre de vue que lorsqu'on appelle une fonction en C (ou en C++), les paramètres passés à la fonction sont une copie des variables, ce qui permet d'éviter de se prendre la tête sur comment allouer la solution courante.

Ca doit donner un code qui a à peu près cette structure (à vérifier !).

//solution est une structure décrivant le vecteur solution à 
//caractériser. Dans cette structure il faut pouvoir savoir à tout
//moment quelle variable n'ont pas encore été affectée (ie n'ont pas 
//été soumises à une séparation dans les noeud de recherche 
//supérieur)

solution branch_and_bound(){
    solution s_opt=solution_vide;
    int f_s_opt=+infini; //pour un pb de minimisation
    solution s=solution_vide;
    explorer noeud(f_s_opt,&s_opt,s);
    return s_opt;
}

void explorer noeud(int *f_s_opt,solution *s_opt,solution s){
    tester critère de coupure sur s
    pour chaque variable non affectée si{
      choisir variable candidate si
      pour chaque valeur xi de di (domaine de la variable si){
          explorer(f_s_opt,s*,s <- s(si = xi))
      }
   }
   si (f(s)<f(s*)){
       free(s_opt);
       *s_opt=s;
       *f_s_opt=f(s);
   }
}


Bonne chance
0
alias_bella Messages postés 2 Date d'inscription mardi 15 avril 2008 Statut Membre Dernière intervention 15 avril 2008
15 avril 2008 à 14:46
Bonjour à tous;

Je voudrais savoir si l'un de vous n'aurait pas déja programmé Branch and bound en C#.Net ou visual C++.Net; et plus particulièrement une aplication sut un probleme d'ordonnancement de tâches avec plusieurs processeurs.

Merci beaucoup à tous ceux qui pourrait m'accorder un peu de leur temps.
0
mamiemando Messages postés 33401 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 novembre 2024 7 804
15 avril 2008 à 19:18
Il serait plus logique d'utiliser une API C++ genre COIN-OR ou CPLEX. Sinon tu recodes ton propre branch and bound.
-1