Optimisation par programmation linéaire ( fonction solver).

darshiva

XLDnaute Nouveau
Bonjour à tous,

J'ai actuellement un soucis concernant un exercice de programmation linéaire et sa résolution pour trouver une solution optimale.
3 camions doivent livrer 9 magasins qui possèdent chacun des demandes différentes. On possède dans un tableau les kilométrages entre les magasins.Le but étant donc de minimiser le kilométrage tout en satisfaisant les commandes en utilisant le SOLVER de Excel. Cependant comment traiter le problème?
Une résolutions par la "méthode de génération des colonnes" serait-elle à envisager?

Merci de vos réponses ou de vos pistes.
 

Pièces jointes

  • Exercice PL.xlsx
    9.7 KB · Affichages: 165

poulpor78

XLDnaute Junior
Re : Optimisation par programmation linéaire ( fonction solver).

Bonjour Darshiva,

Ce problème est captivant !

J'ai commencé à modéliser le problème. C'est en pièce jointe.

Commentaire au passage : je ne gère pas les livraisons partielles ou bien les sites qui pourraient accéder à leurs demandes en deux fois.

Par contre, je gère bien :
- que tous les sites sont livrés une seule fois
- que les camions ont une capacité de 30

Et je calcule les kilomètres à minimiser.

Après, et comme une fois sur deux quand je tente le solveur...je n'arrive pas à mes fins et j'ai une envie énorme de tester les valeurs via vba, même si c'est plus long.


Au lieu d'utiliser M1, M2, ... j'utilise 1, 2, ... afin de faire varier des chiffres dans mes variables.


Sur le solveur, j'indique les instruction suivantes :

Objectif: M26 à minimiser
Cellules variables : $D$22:$F$24

Contraintes :
Les contraintes de mes variables pour exprimer les sites (des entiers de 1 à 9 pour exprimer M1 à M9) :
$D$22:$F$24>=1
$D$22:$F$24<=9
$D$22:$F$24=Entier
Les contraintes du modèle :
$E$38=0 (tous les sites sont livrés)
$W26=0 (on a respecté la capacité des camions)


En choisissant le modèle 'évolutionnaire' (le seul à ne pas planter, ce qui est mauvais signe), je trouve un un total de 2471 km pour le total kilomètres des trois camions.

En espérant avoir pu faire avancer le problème.

Poulpor
 

Pièces jointes

  • Exercice PL (1).xlsx
    15.6 KB · Affichages: 162

darshiva

XLDnaute Nouveau
Re : Optimisation par programmation linéaire ( fonction solver).

Bonsoir,

Le solver donne des solutions différentes ... et certains trajets peuvent passer par la même ville.

Je crois qu'il y a des contraintes à rajouter.

Merci à vous déjà pour les pistes cela m'aide grandement.
 

pascal82

XLDnaute Occasionnel
Re : Optimisation par programmation linéaire ( fonction solver).

Bonjour,

Je pense qu'il s'agit du problème du "voyageur de commerce", et que dans ce cas il n'existe pas de solution exacte, par contre plusieurs algorithmes sont proposés en consultant Google

Cordialement
 

poulpor78

XLDnaute Junior
Re : Optimisation par programmation linéaire ( fonction solver).

@ Pascal :

Je ne pense pas que ce soit la réplique exacte (sur ce que j'ai pu lire dans wikipedia). Par contre, c'est un dérivé de ce problème.

(on a 3 camions, on a des capacités de camions, on a des livraisons à effectuer).

Cependant, l'info est intéressante. Je vais aller de ce pas me renseigner pour en savoir un peu plus.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Optimisation par programmation linéaire ( fonction solver).

Bonjour darshiva, poulpor78

Pour le fun...

(...) Après, et comme une fois sur deux quand je tente le solveur...je n'arrive pas à mes fins et j'ai une envie énorme de tester les valeurs via vba, même si c'est plus long. (...)

L'essai proposé ne répond pas à la question posée concerenant le "Solver". Je ne garantis pas les résultats même si j'ai vérifié à l'aide des données initiales quelques résultats de kilométrage et de poids des camions.

L'hypothèse retenue est qu'un camion ne revient pas à sa base pour repartir faire d'autres livraisons. Chaque camion ne fait au maximum qu'une tournée ou bien aucune tournée.

On examine tous les trajets possibles (après en avoir éliminé d'emblée quelques uns au départ qui conduiraient à des trajets équivalents).

Si, par exemple, on a 4 camions: le premier magasin sera toujours livré par le camion 1; le second magasin sera toujours livré par les camions 1 ou 2; le troisième magasin sera livré par les camions 1 ou 2 ou 3; les magasins suivants seront livrés par les camions 1 ou 2 ou 3 ou 4.
Il reste des combinaisons de camions aboutissant à des résultats équivalents par échange des rôles de camions i et j. Ces résultats équivalents sont éliminés à la fin des calculs - pas trouvé comment les éliminer au départ.

Pour 9 magasins, 3 camions et une charge max. de 30t, on aboutit à 261 trajets retenus.
Pour 9 magasins, 3 camions et une charge max. de 28t, on aboutit à 91 trajets retenus.

Avec certaines valeurs initiales, on peut aboutir à une impossibilité. Avec les données présentes dans le fichier, si on choisit 9 magasins et 2 camions et une charge max. de 30t, alors il n'y a pas de solution. Le total des commandes des 9 magasins est de 77 tonnes alors, qu'avec une charge maximale de 30 tonnes par camion, deux camions ne peuvent livrer que 60 tonnes.

Le temps de calcul augmente considérablement avec le volume de trajets à examiner. Sur ma vieille bécane:
  • pour 8 magasins et 3 camions et 30t max -> 1,7 sec.
  • pour 8 magasins et 4 camions et 30t max -> 21,7 sec.
  • pour 9 magasins et 2 camions et 30t max -> Impossible
  • pour 9 magasins et 3 camions et 30t max -> 3,9 sec.
  • pour 9 magasins et 4 camions et 30t max -> 120,0 sec.


Sur la feuille "Param", indiquer:
  • le nombre de magasin (Mag)
  • Le nombre de camion (Cam)
  • la charge maximale d'un camion (MaxCharge)
  • Pour les quantités commandées par magasin, on ne prend en compte que les Mag premières cellules
  • Pour les distances entre base+magasins, on ne prend en compte que les (Mag+1) premières lignes et (Mag+1) premières colonnes du tableau des distances.
  • les valeurs prises en compte prennent un fond jaune clair

Cliquer sur le bouton "Calcul" de la feuilles "Parcours" pour lancer les calculs.

Description des colonnes en résultat:
  • Colonnes en bleu -> on indique pour chaque magasin quel camion fait la livraison
  • Colonnes en rose -> on indique pour chaque camion le kilométrage à parcourir
  • 1ière colonne jaune -> le total des kimomètres à parcourir pour l'ensemble des camions
  • 2ième colonne jaune -> la moyenne des écarts absolus des kilométrages de chaque camion par rapport à la moyenne arithmétique des kilométrages. Cette valeur pourrait servir à "équilibrer" les tournées de chaque chauffeur en ne choisissant pas forcément le plus petit kilométrage.
  • Colonnes en rose -> on indique pour chaque camion le tonnage livré

Le code est dans Module1.

Préférer la version v3 ICI
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Optimisation par programmation linéaire ( fonction solver).

Bonjour à tous,

Une correction de la v1 qui ne prend plus en compte les camions non utilisés dans le calcul de l'écart moyen.

On pourrait diminuer encore la durée du traitement car je calcule deux fois les tonnages livrés (les aléas du développement :p) mais j'ai la flemme de procéder à l'adaptation de tous les indices de boucle et dimensions des zones :(.

Décidément mal réveillé ce matin :mad:. La version v3 ici devrait contenir la juste correction.
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Optimisation par programmation linéaire ( fonction solver).

(re) Bonjour à tous,

La version v3 qui j'espère contient la bonne correction pour le calcul de l'écart moyen !


Nota: Bonjour Staple1600 :). Je vais me mettre en mode week-end ;)
 

Pièces jointes

  • Exercice PL v3.xlsm
    41 KB · Affichages: 152

Statistiques des forums

Discussions
312 234
Messages
2 086 470
Membres
103 226
dernier inscrit
smail12