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 :

Problème du voyageur de commerce unidimensionnel


Sujet :

Algorithmes et structures de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Problème du voyageur de commerce unidimensionnel
    Bonjour,

    Je cherche comment adresser une version simplifiée du problème du commis voyageur (Travelling salesman problem en anglais), qui, plutôt que de chercher les chemin le plus court entre des points sur un plan, cherche le chemin le plus rapide passant par tous les points sur un axe. Il y a 1000 points, et suivent une distribution normale centrée en 0. Chacun est représenté par un float, positif ou négatif.

    L'objectif est d'avoir un algorithme optimisé, mais je ne connais rien en optimisation. Auriez-vous des pistes ?

  2. #2
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 333
    Points : 1 828
    Points
    1 828
    Par défaut
    Bonjour,

    Quelles sont les contraintes de ton problèmes?

    Car si il n'y en à pas, partir de la ville la plus à gauche aller linéairement jusqu'à la ville la plus droite à droite est une solution trivialement optimale (Preuve: il est difficile d'aller plus rapidement d'un point A à un point B qu'avec une ligne droite... Et A et B doivent être visitées... Donc optimal ).

    Mais peut-être y-a-t-il des subtilités supplémentaires ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'ai effectivement omis de préciser les contraintes :
    - on part du 0 et on revient au 0.
    - on définit, plutôt qu'une distance, que l'écart entre deux points correspond à un temps.
    - on veut que la moyenne du temps d'attente de chaque point avant le passage du voyageur soit le plus court possible.
    - solution algorithme polynomial (ce dont je ne saisis pas trop le sens).
    - doit être 85% plus rapide qu'un algorithme glouton (soit aller au point le plus proche à chaque étape), en moyenne sur plusieurs tests.

  4. #4
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 333
    Points : 1 828
    Points
    1 828
    Par défaut
    Pour ta question sur la complexité : si ton algorithme explore toutes les possibilités ici, s'il y n points, tu as Formule mathématique cas. (Par exemple avec 5 : 5*4*3*2*1). On dit de complexité exponentielle. Au contraire si tu prend un autre algorithme qui fait au maximum Formule mathématique opérations avec les k des constantes alors l'algorithme sera quadratique (la plus grande puissance de n est 2) donc polynomial. Wikipédia explique ça très bien.

    Si la vitesse du voyageur est constante (ce qui est probablement le cas), Alors minimiser la distance est équivalent à minimiser le temps (puisque Formule mathématique). Dans la suite je parle en terme de distance mais peu importe.

    Citation Envoyé par Saryk Voir le message
    J'ai effectivement omis de préciser les contraintes :
    - on part du 0 et on revient au 0.
    - on veut que la moyenne du temps d'attente de chaque point avant le passage du voyageur soit le plus court possible.
    Cette partie du message est la partie importante, et que je ne pouvais pas deviner .
    Je note Formule mathématiquela distance pour aller du point n-1 à n avec un chemin particulier

    Si je prends un point m, la distance totale Formule mathématique parcourue pour aller à ce point depuis le départ du voyageur est Formule mathématique

    Tu veux minimiser le temps moyen donc la distance moyenne donc Formule mathématique soit Formule mathématique soit Formule mathématique...

    J'ai formalisé ton problème, je te laisse le résoudre pour que tu apprennes aussi (je suis là si tu as des questions)

    (Dans ce genre de cas la première question à te poser est ais-je besoin d'un algorithme optimal ou une bonne approximation est elle suffisante. Si oui, quand puis-je considérer mon approximation comme suffisante?)

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci, ça aide beaucoup

    Si je prends un point m, la distance totale Formule mathématique parcourue pour aller à ce point depuis le départ du voyageur est Formule mathématique
    Si je comprends bien, on cherche donc à ordonner les points Formule mathématique de façon à ce que Formule mathématique (ou donc Formule mathématique) soit minimal.

    EDIT : les "1000" s'affichent mal :/

    Un algorithme exhaustif ferait toutes les permutations, soit Formule mathématique opérations, et ce n'est clairement pas envisageable.
    Je suppose aussi qu'il n'y a pas d'algorithme optimal en toutes circonstances ; dans le sens de ça doit dépendre de la configuration de départ.
    Je ne sais cependant pas répondre aux questions sur les approximations

  6. #6
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 594
    Points
    188 594
    Par défaut
    Citation Envoyé par Saryk Voir le message
    EDIT : les "1000" s'affichent mal :/
    Juste une histoire de syntaxe LaTeX : quand tu mets plus d'un caractère en indice ou exposant, il faut marquer le début et la fin, donc d_{1000} au lieu de d_1000.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  7. #7
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 333
    Points : 1 828
    Points
    1 828
    Par défaut
    En Latex Si tu veux afficher des blocs tu les met en crochet: par exemple x_{1000} donne Formule mathématique. Sinon seul le 1er nombre est pris. (Edit: grillé )

    Citation Envoyé par Saryk Voir le message
    Merci, ça aide beaucoup

    Si je comprends bien, on cherche donc à ordonner les points Formule mathématique de façon à ce que Formule mathématique (ou donc Formule mathématique) soit minimal.
    C'est exactement ça!

    Citation Envoyé par Saryk Voir le message
    Un algorithme exhaustif ferait toutes les permutations, soit Formule mathématique opérations, et ce n'est clairement pas envisageable.
    Oui, je ne l'ai pas précisé mais pour des raisons évidentes tu ne t'en sortira pas en testant toutes les combinaisons (les joies de l'exponentiel).

    Citation Envoyé par Saryk Voir le message
    Je suppose aussi qu'il n'y a pas d'algorithme optimal en toutes circonstances ; dans le sens de ça doit dépendre de la configuration de départ.
    Si, il y a bien évidemment des algorithmes te donnant le résultat optimal. Exemple: Générer et tester toutes les combinaisons. Il faut juste un temps quasi-infini pour le faire tourner (environ Formule mathématique combinaisons), mais c'est optimal. Ton travail c'est de trouver un algorithme plus intelligent qui te fasse arriver au même résultat (ou à une bonne approximation si on te l'autorise) en un temps plus ... humain!

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par dourouc05 Voir le message
    Juste une histoire de syntaxe LaTeX : quand tu mets plus d'un caractère en indice ou exposant, il faut marquer le début et la fin, donc d_{1000} au lieu de d_1000.
    Merci, je le saurai

  9. #9
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 394
    Points
    9 394
    Par défaut
    J'aimerais que quelqu'un m'explique cette phrase, clairement, simplement : on détermine, plutôt qu'une distance, que l'écart entre deux points correspond à un temps.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    J'aimerais que quelqu'un m'explique cette phrase, clairement, simplement : on détermine, plutôt qu'une distance, que l'écart entre deux points correspond à un temps.
    Effectivement, ça n'a pas de sens verbatim. J'ai éditépour corriger "détermine" en "définit".
    Je ne l'ai préciséque pour justifier le temps d'attente minimal avant le passage du voyageur, mais comme l'a très bien fait remarquer Emixam16, cela revient à compter la distance.

  11. #11
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 333
    Points : 1 828
    Points
    1 828
    Par défaut
    Allez, je vais t'aider a construire une solution. Je l'ai fait en 2 minutes, il y a surement des points améliorables, mais ça te montre une manière de réflechir.

    Étape 1: solution de base.

    Je note G le point le plus à gauche, D le plus à droite et O l'origine.
    3 Cas :
    - La solution optimale est de faire le chemin Formule mathématique
    - La solution optimale est de faire le chemin Formule mathématique
    - La solution optimale est une autre solution.

    Avec la formule que je t'ai donnée il est très simple de déterminer la meilleur solution entre les deux premières. A ce stade tu sais au moins de quel coté partir (le point m1)

    La solution 3 est relativement rare car elle implique un changement de coté ce qui fait une pénalité de la distance du point jusqu'à l'origine (un deuxième changement sera nécessaire pour aller chercher les points restant).

    Tu pourrais t’arrêter là et avoir une solution pas si déguelasse.

    Étape 2 : Raffinement

    On veut savoir quand un changement de côté sera rentable. C'est à dire que la coût est inférieure au gains en distance.

    Tu peux estimer le coût => Si le changement est au point m, un changement de coté pénalisera les n-m points restants d'une distance d. S'il restait l points de ce coté, ces points devront être retraversés par la suite (comme les changements de coté sont rares et de plus en plus couteux, j'approxime qu'il n'y en a jamais plus d'un(vraisemblable)), donc je dois ajouter à la pénalité la distance d' entre le prochain point du même coté et le point le plus éloigné de l'autre coté (A ou B) multiple par le nombre de points restants de ce coté. Soit Formule mathématique

    Le gain est estimable en faisant la distance si changement de coté (d1) - la distance si pas de changement de coté (d2) * le nombre de points restants (n-m). Soit Formule mathématique

    Donc au final changement de coté ssi Formule mathématique. Et franchement ça ne doit pas arriver tout les jours, surtout avec une distribution normale. En tout cas si ça arrivait ça serait dans les premiers points.

    A toi de jouer

  12. #12
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 394
    Points
    9 394
    Par défaut
    @Saryk : ce n'est pas le verbe déterminer au lieu de définir qui m'embête, j'avais compris cette partie là comme il faut. C'est la suite qui m'embête.
    De ce que je comprends, on oppose DISTANCE et ECART. On n'utilise pas la distance entre les points, mais on utilise l'écart. Et on dit que le temps pour aller d'un point à un autre est proportionnel à l'écart entre ces 2 points. En tout cas, c'est comme ça que je le comprends.
    Mais pourquoi insister sur le fait qu'on n'utilise pas la distance. Pour moi Ecart ou distance, je n'arrive pas à faire la différence dans ce contexte.
    Soit cette phrase cache une idée qui m'échappe, soit elle ne sert à rien. Bizarre.

    Je vas partir du principe que Ecart ou distance, c'est pareil, donc que cette phrase ne sert à rien.

    @emixam16.
    On n'a pas 2 cas, mais 4 cas.
    0 --> G --> D --> 0 ------> 0, -1, -2, -3, 3, 2, 1, 0
    0 --> D --> D --> 0 ------> 0, 1, 2, 3, -3, -2, -1, 0
    0 --> G --> 0 --> D --> 0 ------> 0, -1, -2, -3, 1, 2, 3, 0
    0 --> D --> 0 --> G --> 0 ------> 0, 1, 2, 3, -1, -2, -3, 0

    Et avec une distribution normale centrée en 0, la meilleure solution est la 3 ou la 4, pas la 1 ni la 2.
    Et pour choisir entre la solution 3 et la solution 4, on va calculer max(valeurs positives) et min(valeurs negatives), ains que le nombre de valeurs positives et le nombre de valeurs négatives, et à mon avis sauf cas très atypiques, ces 4 nombres doivent suffire pour trouver le meilleur parcours.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  13. #13
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 333
    Points : 1 828
    Points
    1 828
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    On n'a pas 2 cas, mais 4 cas.
    0 --> G --> D --> 0 ------> 0, -1, -2, -3, 3, 2, 1, 0
    0 --> D --> D --> 0 ------> 0, 1, 2, 3, -3, -2, -1, 0
    0 --> G --> 0 --> D --> 0 ------> 0, -1, -2, -3, 1, 2, 3, 0
    0 --> D --> 0 --> G --> 0 ------> 0, 1, 2, 3, -1, -2, -3, 0
    Évidemment c'est aux deux derniers cas que je pensais (puisqu'on passe forcément par 0 pour aller de G à D je n'ai pas vu l'intérêt à le préciser!). Pour repréciser, quand je dis 0->G->D->0 j'entends, partir de zéro, aller jusqu'à G en passant par tous les points possible, aller vers D en passant par tous les points possible (y compris zéro) et retourner à 0 (à vide forcément).

    Tes deux premiers cas sont donc compris dons mon cas poubelle "La solution optimale est une autre solution".


    Citation Envoyé par tbc92 Voir le message
    Et pour choisir entre la solution 3 et la solution 4, on va calculer max(valeurs positives) et min(valeurs negatives), ains que le nombre de valeurs positives et le nombre de valeurs négatives,
    J'ai déjà détaillé le calcul de la meilleure solution entre les deux basiques dans mon post.

    Citation Envoyé par tbc92 Voir le message
    et à mon avis sauf cas très atypiques, ces 4 nombres doivent suffire pour trouver le meilleur parcours.
    Ces cas sont peu courants mais pas si rare que ça non plus. Il suffit que la distance à l'origine soit d'un ordre de grandeur différent entre un sous-ensemble des points et le reste des points.

    Exemple: Soient les points {{-1},{-0.1},{0.1},{1}}. Il est plus rapide de faire {0}->{-0.1}->{0.1}->{1}->{-1}->{0} que {0}->{-0.1}->{-1}->{0.1}->{1}->{0} avec les contraintes définies dans le problème.

    Ce cas se présente de manière fréquente au centre de la distribution normale où on peut avoir un saut entre les points.

    Mais ça tombe bien je t'ai déjà expliqué comment intégrer ce cas au raisonnement. Je n'ai pas ultra formalisé, mais je pense largement assez pour comprendre.

    @Saryk Tu as tous les éléments pour résoudre ton problème, essaye de faire une implémentation

  14. #14
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Problème du voyageur de commerce unidimensionnel
    Bonjour,

    L'avis de tbc92 confirme mon impression: le problème est dès le départ mal posé.
    La notion de distance euclidienne séparant deux points (1, 2), qui dans un repère orthonormé part de la relation de Pythagore
    d12 = ((X2 - X1)2 + (Y2 - Y1)2)1/2
    devient sur un axe: d12 = ((X2 - X1)2)1/2 = Abs(X2 - X1) .

    Il s'agit donc de trouver l'ordre de succession des (N) points conduisant à la valeur minimale de la somme:
    S = Somme(Abs(Xj - Xi)) .
    La solution est évidente: il suffit pour cela de classer la liste des abscisses selon l'ordre croissant ou décroissant, ce qui dans les 2 cas donne le même parcours total: S = 2*(Xmax - Xmin) .

    Insérons en effet dans la chaîne deux nouveaux points points (i, j) entre deux autres (m, n) déjà ordonnés: les abscisses se présentent dans l'ordre:
    Xm < Xi < Xj < Xn ;
    deux possibilités se présentent alors pour la somme partielle associée:

    # Sa = Abs(Xi - Xm) + Abs(Xj - Xi) + Abs(Xn - Xj) = (Xi - Xm) + (Xj - Xi) + (Xn - Xj) = Xn - Xm ,

    # Sb = Abs(Xj - Xm) + Abs(Xi - Xj) + Abs(Xn - Xi) = (Xj - Xm) - (Xi - Xj) + (Xn - Xi) = (Xn - Xm) + 2*(Xj - Xi) ,

    qui conduisent aux résultat inégaux: Sa < Sb .
    Le minimum recherché correspond à la séquence monotone des 4 termes (Xm < Xi < Xj < Xn) .

    La solution proposée est l'analogue de la suppression systématique des croisements que présente la ligne brisée du parcours dans un plan.
    Nom : 2 parcours voyageur.png
Affichages : 234
Taille : 5,6 Ko


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  15. #15
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 394
    Points
    9 394
    Par défaut
    @wiwaxia
    Dans le problème classique du voyageur de commerce, l'objectif est que le temps total de la tournée soit minimum.
    Ici, c'est différent. On accepte que la durée totale soit supérieure à ce minimum, ce qu'on veut minimiser, c'est la moyenne des temps de passage.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  16. #16
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Problème du voyageur de commerce unidimensionnel
    OK, j'ai compris.
    Il s'agit de trouver la séquence des (N + 1) points (origine comprise) minimisant la somme
    S = Sommek=0N-1(N - k)*Abs(Xk - Xk + 1)
    au lieu de Sommek=0N-1Abs(Xk - Xk + 1) .

    Il est possible d'établir une expression approchée de la somme en cause dans le cas d'un très grand nombre de points, et pour des séquences très particulières.
    Considérons la liste des (N) points préalablement ordonnée dans le sens croissant, et son partage en 6 sous-ensembles connexes de même effectif N' = N / 6 , et délimités par 7 bornes (A1 = Xmin , A2 , A3 , A4 (très proche de l'origine O) , A5 , A6 , A7 = Xmax) .

    On envisage l'énumération des valeurs de chaque tranche, sans le sens croissant ou décroissant.
    Chaque tranche contient (N') termes de valeur moyenne (At+1 - At)/N' ;
    les coefficients correspondants varient de (N) à (5N/6) pour la première tranche, de (5N/6) à 4N/6) pour la suivants, etc ... et présentent par conséquent les valeurs moyennes successives:
    ( 11N/12 , 9N/12 , 7N/12 , 5N/12 , 3N/12 , N/12 )
    .
    On obtiendra finalement pour l'expression approchée de la somme:
    S ~ (11N/12)*N'(Ai+1 - Ai)/N' + (9N/12)*N'(Aj+1 - Aj)/N' + (7N/12)*N'(Ak+1 - Ak)/N' + ...
    soit finalement: S ~ (N/12)*(11*(Ai+1 - Ai) + 9*(Aj+1 - Aj) + 7*(Ak+1 - Ak) + ... +(An+1 - An)) .

    On voit immédiatement la nécessité de faire intervenir en priorité les domaines les plus étroits, si l'on recherche les plus faibles sommes.
    Un énumération "aveugle" de toutes les combinaisons possibles des tranches conduira à effectuer 6!*26 = 46080 - ce qui est beaucoup, mais accessible.
    Un distribution normale des points centrée sur l'origine se traduira par une forte concentration centrale du nuage de points: on aura donc:
    (A4 - A3) ~ (A5 - A4) < (A3 - A2) ~ (A6 - A5) < (A2 - A1) ~ (A7 - A6)
    ;
    Une somme peu élevée sera donc obtenue en introduisant prioritairement dans la combinaison linéaire:
    # (T3, T4) ou (T4, T3) dans un sens ou dans l'autre, soit 23 = 8 possibilités;
    # (T2, T5) ou (T5, T2) dans un sens ou dans l'autre, soit encore 8 possibilités;
    # (T1, T6) ou (T6, T1) idem donc 8 possibilités;
    et pour l'ensemble des combinaisons: 83 = 512 soit 90 fois moins qu'auparavant.

    Voilà une méthode susceptible de conduire à des valeurs relativement basses, sinon optimales: on envisagera, à l'intérieur de chaque tranche, toutes les abscisses successives, dans l'ordre croissant ou décroissant.
    On peut envisager plusieurs variantes, par exemple 3 tranches inférieures, d'effectifs N' = N°/3 et 3 autres d'effectifs (N - N°)/3 , la variable (N°) ne s'écartant pas trop de la valeur médiane (N/2).

    La singularité de ce problème, c'est que l'existence d'une solution optimale complexe est liée à la présence d'une zone de forte concentration; une répartition uniforme des points sur l'axe admettrait comme solution triviale la suite monotone des (N) abscisses, dans le sens croissant ou décroissant.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  17. #17
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 333
    Points : 1 828
    Points
    1 828
    Par défaut
    @wiwaxia Je suis désolé mais même en relisant plusieurs fois je n'ai compris à ton post. J'ai l'impression que tu ne part pas de zéro (contrainte) donc que ton explication est fausse mais peut-être ais-je mal saisi. Mais de toute façon j'ai déjà donné une solution quasi-optimale au problème!

    Je vais récapituler pour que ce soit clair pour tout le monde

    Je cherche comment adresser une version modifiéedu problème du commis voyageur (Travelling salesman problem en anglais)

    Contraintes
    - Il y a 1000 points, et suivent une distribution normale centrée en 0. Chacun est représenté par un float, positif ou négatif.
    - on part du 0 et on revient au 0.
    - on veut que la moyenne du temps d'attente de chaque point avant le passage du voyageur soit le plus court possible.
    - solution algorithme polynomial (ce dont je ne saisis pas trop le sens).
    - doit être 85% plus rapide qu'un algorithme glouton (soit aller au point le plus proche à chaque étape), en moyenne sur plusieurs tests.


    L'objectif est d'avoir un algorithme optimisé, mais je ne connais rien en optimisation. Auriez-vous des pistes ?
    Je note la distance pour aller du point n-1 à n avec un chemin particulier

    Si je prends un point m, la distance totale parcourue pour aller à ce point depuis le départ du voyageur est

    Tu veux minimiser le temps moyen donc la distance moyenne donc soit soit . (Relation 1)


    Construisons une solution:

    Étape 1: solution de base.


    Je note G le point le plus à gauche, D le plus à droite et O l'origine.
    3 Cas :
    - La solution optimale est de faire le chemin
    - La solution optimale est de faire le chemin
    - La solution optimale est une autre solution.


    A noter: quand je dis j'entends, partir de zéro, aller jusqu'à G en passant par tous les points possible, aller vers D en passant par tous les points possible (y compris zéro) et retourner à 0 (à vide forcément).

    Avec la formule que je t'ai donnée il est très simple de déterminer la meilleur solution entre les deux premières. A ce stade tu sais au moins de quel coté partir (le point m1)


    Cette approximation est de qualité acceptable mais pas optimale car elle ne gère pas les cas où un changement de coté est rentable, c'est à dire ou la distance à l'origine soit d'un ordre de grandeur différent entre un sous-ensemble des points et le reste des points. Ce cas se présente de manière fréquente au centre de la distribution normale.

    Exemple : Soient les points {{-1},{-0.1},{0.1},{1}}. Il est plus rapide de faire {0}->{-0.1}->{0.1}->{1}->{-1}->{0} que {0}->{-0.1}->{-1}->{0.1}->{1}->{0} avec les contraintes définies dans le problème. Donc le cas 1 et 2 n'est pas toujours optimal, on doit raffiner la solution.

    Étape 2 : Raffinement de la solution


    On veut savoir quand un changement de côté sera rentable. C'est à dire que la coût est inférieure au gains en distance.

    Tu peux estimer le coût => Si le changement est au point m, un changement de coté pénalisera les n-m points restants d'une distance d (cf. relation 1). S'il restait l points de ce coté, ces points devront être retraversés par la suite (comme les changements de coté sont rares et de plus en plus couteux, j'approxime qu'il n'y en a jamais plus d'un(c'est la seule approximation de ma réponse et elle est vraisemblable pour une distribution normale)), donc je dois ajouter à la pénalité la distance d' entre le prochain point du même coté et le point le plus éloigné de l'autre coté (A ou B) multiple par le nombre de points restants de ce coté. Soit

    Le gain est estimable en faisant la distance si changement de coté (d1) - la distance si pas de changement de coté (d2) * le nombre de points restants (n-m). Soit

    Donc au final changement de coté ssi (Relation 2).


    Étape 3 : Construction d'algorithme qui résout le problème

    On peut alors résoudre le problème avec le pseudocode suivant. (Oui, je prend les fonctions qui m'arrangent, et alors?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    fonction genereSolution(Point[] points)
    | (triéNégatif, triéPositif) = monSuperTri(points) // triéNégatif contient les points triés de 0 à -min. triéPositif contient les points triés de 0 à max.
    | Solution1 = genereSolution(triéNégatif + triéPositif) // le + concatène les ensembles
    | Solution2 = genereSolution(triéPositif triéNégatif )
    | bestSolution= max(Solution1.getScore(), Solution2.getScore()) // getScore utilise la relation 1.
    | 
    | firstPointOtherSide = bestSolution.firstPointOtherSide() 
    | for( i in 0 : bestSolution.lenghtSideDeparture()-1)
    | | if( bestSolution.crossoverScore() > bestSolution.noCrossoverScore()) // Utilise la relation 2
    | | | bestSolution.applyCrossover() // On fait un changement de coté donc on réorganise bestSolution (le point i+1 est le premier point restant de l'autre coté, le point i+2 est le 2ème point restant de l'autre coté et ainsi de suite)
    | return bestSolution
    J'espère être clair

    Bonne journée.

  18. #18
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Problème du voyageur de commerce unidimensionnel
    J'ai proposé une solution à un problème intéressant, qui me paraissait inédit.
    L'expression approchée de la somme fait ressortir le rôle de l'accumulation des points dans la partie centrale, et débouche sur un algorithme; il serait intéressant de le tester.

    Je ne conteste en rien la validité de ton procédé, et son aptitude à produire un meilleur résultat.

    PS: Je me soucie généralement peu du temps d'exécution des programmes (quoique je ne pousse pas l'inconscience jusqu'à entreprendre N! calculs), et j'ai repensé à la demande initialement exprimée:

    - solution algorithme polynomial (ce dont je ne saisis pas trop le sens).
    - doit être 85% plus rapide qu'un algorithme glouton (soit aller au point le plus proche à chaque étape), en moyenne sur plusieurs tests.
    La somme est ici calculée sur 6 blocs de frontières prédéterminées: le temps d'exécution est donc proportionnel à (N) - Ouf !
    L'algorithme glouton évoqué ne paraît pas dépourvu d'intérêt, mais le critère de choix n'est pas assez étendu: c'est une option qu'il conviendrait d'examiner de plus près. Le temps de calcul, ici proportionnel à (N2), est probablement plus long..


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

Discussions similaires

  1. Problème du voyageur de commerce
    Par bleach1234 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 04/05/2009, 14h57
  2. Problème du voyageur de commerce parallélisé
    Par Cyberstein dans le forum Mathématiques
    Réponses: 2
    Dernier message: 06/04/2009, 17h49
  3. Réponses: 2
    Dernier message: 03/02/2009, 20h21
  4. Problème du voyageur du commerce avec plusieurs voyageurs
    Par Treuze dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 21/12/2007, 11h46
  5. Réponses: 3
    Dernier message: 12/04/2007, 09h32

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