IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Algorithme de Dijkstra appliqué au probleme du taux de change


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Algorithme de Dijkstra appliqué au probleme du taux de change
    Bonjour ,

    pour mon projet de bts où je gere un portefeuille boursier j'ai besoin de
    contrevalorise des montants d'une devise A vers une devise B à une date T.
    Pour cela je m'appuie sur une table de change où l'on retrouve ces 3 données plus le change C

    Probleme
    la contrevalorisation n'est pas toujours direct . je m'explique :
    1er cas j'ai la contrevalorisation m'est inverse soit (B) -> (A) (T)
    ce qui me donne en contrevalorisation 1/C
    Jusqu' à la pas de réel souci sauf que
    2eme cas ma contravalorisation n'est pas direct je passe par une devise A' que l'on peut appeler pivot soit C : (A/A')*(A'/B) (T) tout
    cela en gérant les combinaisons inversés (A'/B)=1/(B/A')
    3eme cas ma contrevalorisation n'est toujours pas direct et passe
    par plusieurs devise et là ça devient franchement balaise
    4eme cas j'ai plusieurs possibilité pour obtenir cette fameuse contrevalorisation et bien sûr je me dois de choisir la plus courte.

    C'est pourquoi je me suis interessé à la théorie des graphes et particulierement
    l'Algorithme de Dijkstra que vous connaissez mieux que moi.
    Question est ce que je cherche dans la bonne direction (parce que là je suis un peu dépassé ) et pouvez vous m'aider dans la logique de résolution afin que je puisses le retranscrire en sql (sgbdr oracle) à moins
    que quelqu'un est déjà une solution .

    En tout cas , merci d'avance pour votre aide et je suis à l'écoute de toutes autres idées.

  2. #2
    Membre confirmé Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Points : 649
    Points
    649
    Par défaut
    BOn, je ne sais pas trop ce que contrevaloriser veut dire, et une definition pourrait peut être m'aider à mieux comprendre ce que tu veux.

    Pour resoudre ton problème, tu as deux questions à te poser :
    1. Est ce que tu peux transcrire ton problème sous forme de graphe ?
    2. Comment representer un graphe à l'aide d'une base de donnée ?


    Je preciser un peu mes points. Quand je te demande comment transcrire ton problème sous forme de graphe. Les sommets de ton graphe sont ils tes devises ? Est ce que le cout d'une arete eut être representé par le taux de change ? , etc ... Bref, il faut que tu te demandes comment modéliser ton problème à l'aide des graphes.

    Une fois que tu as modélisé ton problème sous forme de graphe, il faut maintenant reflechir à comment rrepresenter ton graphe dans une base de donnée SQL.

    J'aurais d'autre question à te poser pour mieux comprendre ton problème. Dans ta question, tu parles de retranscrire ton problème en SQL. Peux tu preciser un peu plus ton context ? Est ce que tout est dans des tables et tu dois simplement faire des requetes SQL pour repondre à ton problème ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut


    en fait lorsque j'emploie le mot contrevalorisation ce n'est ni plus ni moins que
    le taux de conversion (ex: 1 euro peut etre contrevalorise par 6,55957 francs).

    Effectivement mes sommets seraient representés par mes différentes devises par contre mon arete pourrait effectivement contenir mon taux de change, resterait pour moi alors de définir le chemin le plus court ce qui me donnera le taux de change final (le produit de mes arretes et non la somme) .

    Pour ce qui est du contexte, je travaille à partir d'une table oracle prérempli contenant ma devise A , ma devise B, ma date et mon taux de conversion (donc pour répondre à ta question tous les éléments sont dans une table ) .

    Mon but final étant de retranscrire la logique dans une fonction sql (ayant pour parametre entrant une devise de départ, une devise d'arrivée et une date) qui me retournera mon taux de conversion

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Il faudrait lire l'ensemble des couples de conversion disponibles dans ta base.

    Construire le graphe orienté (ou non) avec les arêtes là en croisant les doigts pour que ton graphe soit fortement connexe (ou connexe).

    Puis lancer un algorithme de plus court chemin avec des arêtes de poids 1 uniquement (donc possible avec dijkstra puisque les poids sont positifs)

    Puis à partir de la liste des chemins, récuperer à chaque fois la bonne ligne SQL (en inversant le taux de conversion si tu considères un graphe non orienté et la conversion étant dans le mauvais sens) et multiplié tout ça ensemble.

    Il y a peut être même moyen de selectionner juste les bonnes ligne de ta table et de faire la multiplication direct des champs de conversion dans le cas d'un graphe orienté.

    Le principe est là.
    Je ne répondrai à aucune question technique en privé

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    voici une implémentation possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    soit A la devise de départ et B celle d'arrivée. 
    Marquer tout les devises comme non empilées
    Pile[1].devise=A 
    Pile[1].coeff=1, 
    CurrentItem=1
    LastItem=1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    repeat 
         D=Pile[currentItem].devise ;
         Pour tout les "voisins" V (liaisons directes ou liaisons inverses) 
         de D  non déjà "empilés"
             begin // on empile V et si V = B on a fini
             LastItem=LastItem+1 ; 
             Pile[lastitem].devise=V
             Pile[lastitem].coeff=Pile[currentItem].coeff*T, 
                           avec T taux de change entre D et V
            marquer V comme "empilé"
            // on vérifie si V n'est pas la devise d'arrivée 
            if V=B : bingo : le taux de change = Pile[lastitem].coeff
            end
         // pour ce déplacer sur l'élément suivant de la pile 
         currentItem=currentItem+1 
         until currentitem<=lastitem
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Si on est pas passé par la case "bingo", 
    c'est qu'il n'y a pas de relations possible entre A et B
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8
    Points : 6
    Points
    6
    Par défaut

    merci pour les différents éléments que vous m'avez apporté ,
    je vais tester de ce pas

  7. #7
    Membre confirmé
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Points : 554
    Points
    554
    Par défaut
    Citation Envoyé par zebullon
    4eme cas j'ai plusieurs possibilité pour obtenir cette fameuse contrevalorisation et bien sûr je me dois de choisir la plus courte.
    J'imagine que tu parle de la plus courte en nombre de changes.
    Dans ce cas, il te suffit de faire un parcours en largeur dans ton graphe de changes. Tu n'as pas spécialement besoin de Dijkstra.

  8. #8
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Citation Envoyé par Graffito
    Bonjour,

    voici une implémentation possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    soit A la devise de départ et B celle d'arrivée. 
    Marquer tout les devises comme non empilées
    Pile[1].devise=A 
    Pile[1].coeff=1, 
    CurrentItem=1
    LastItem=1
    Juste une remarque : ce n'est pas une pile mais une file d'attente. Avec une pile on traiterait en premier le dernier élément empilé, ce qui donnerait un parcourt en profondeur qui ne limiterait pas le nombre d'intermédaires.

  9. #9
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    une pile mais une file d'attente
    En effet, le nom de la variable "pile" peut préter à confusion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    je me dois de choisir la plus courte
    .
    C'est traité dans l'algo proposé.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

Discussions similaires

  1. Algorithme Min-Max appliqué au jeu Puissance 4 en C .
    Par hebmaster dans le forum Intelligence artificielle
    Réponses: 17
    Dernier message: 29/10/2012, 07h33
  2. Petit problème avec l'algorithme de Dijkstra
    Par Raiden1234 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 28/11/2008, 16h22
  3. [vb.net] utilisation de l'algorithme de Dijkstra
    Par tangoman dans le forum Windows Forms
    Réponses: 1
    Dernier message: 29/03/2007, 23h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo