Algorithme de chargements camions

Résolu
cs_eric89 Messages postés 10 Date d'inscription jeudi 28 août 2003 Statut Membre Dernière intervention 5 juin 2007 - 10 mai 2007 à 09:09
cs_eric89 Messages postés 10 Date d'inscription jeudi 28 août 2003 Statut Membre Dernière intervention 5 juin 2007 - 5 juin 2007 à 15:24
Bonjour

Je cherche un algorithme pour chercher le plan chargement de camions.Voici mon problème:

J'ai un camion avec 6 cuves qui ont comme capacités :
   1ere cuve 2500 kg maxi
   2eme cuve 1500 kg maxi
   3eme cuve 1500 kg maxi
   4eme cuve 2500 kg maxi
   5eme cuve 2000 kg maxi
   6eme cuve 2000 kg maxi

J'ai une commande par exemple
   1ere ligne  Client1 Produit 1 2200 Kg
   2eme ligne Client2 Produit 2 3000 Kg
   3eme ligne Client3 Produit 3 4500 Kg
   4eme ligne Client4 Produit 4 1000 Kg
Les bases de ce problèmes sont les suivantes on ne peut pas mélanger les produits et on ne peut pas mélanger les commandes.

L'algorithme devra me trouver la solution suivante:
      le Produit 1 ira dans la cuve 1
      le Produit 2 ira dans les cuves 2 et 3
      le Produit 3 ira dans les cuves 4 et 5
      le Produit 4 ira  dans la cuve 6 

Merci à celui ou celle qui poura me répondre
Eric H

23 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
14 mai 2007 à 11:04
Bon...
Jer me suis finalement débarraser d'une tâche qui m'appelait à l'extérieur et me revoilà donc.

J'ai apporté les modifications nécessaires (traitement des incasables) et suis même allé un peu plus loin ...
Amélioration : je traite en priorité les grosses commandes. Si une commande importante n'est pas casable, je cherche quand même à placer une autre commande (immédiatement inférieure en importance, etc...) ce qui fait que j'optimise l'utilisation de mes citernes.
Dans le rapport (textbox resultat), je signale bien évidemment les commandes qui n'ont pu être casées..

Il t'appartient maintenant d'arranger au mieux ton interface, notamment en donnant la meilleure largeur possible à la textbox resultat, c'est tout
Tu devrais en profiter, dans la foulée, pour contrôler la cohérence de saisie des numériques (les exemples ne manques pas sur ce forum...)

Option Explicit
Private dispo As Long, toto As String
Private Sub Command1_Click()
  If quantite.Text = "" Then quantite.SetFocus: Exit Sub
  If matiere.Text = "" Then matiere.SetFocus: Exit Sub
  listcommande.AddItem Format(quantite.Text, "000000") & " litres de  " & matiere.Text  quantite.Text "": matiere.Text ""
End Sub


Private Sub Command2_Click()
  If citerne.Text = "" Then Exit Sub
  listeciternes.AddItem citerne.Text
  citerne.Text = ""
End Sub


Private Sub Command3_Click()
  Dim total_commandes As Long, total_citernes As Long
  resultat.Text = ""
  total_commandes = faire_total(listcommande)
  total_citernes = faire_total(listeciternes)
  dispo = total_citernes
  If total_commandes > total_citernes Then
    MsgBox "pas bon ( " & total_commandes & " > " & total_citernes & ")": Exit Sub
  End If
  While listcommande.ListCount > 0
    traitercommande listcommande.ListCount - 1
  Wend
End Sub


Private Sub Form_Activate()
  listcommande.Clear
  listeciternes.Clear  quantite.Text "":   matiere.Text "": citerne.Text = ""
End Sub


Private Function faire_total(ctrl As ListBox) As Long
  Dim i As Integer
  For i = 0 To ctrl.ListCount - 1
    faire_total = faire_total + Val(ctrl.List(i))
  Next
End Function


Private Sub traitercommande(j)
  Dim acaser As Long, i As Integer, quelle_citerne As Integer
  resultat.Text = resultat.Text & vbCrLf & "traitement de la commande de " & listcommande.List(j)
  acaser = Val(listcommande.List(j))
  If acaser > dispo Then
    resultat.Text = resultat.Text & vbCrLf & "non staisfaisable"
    DoEvents
    listcommande.RemoveItem (j)
    Exit Sub
  End If
  While acaser > 0
    For i = listeciternes.ListCount - 1 To 0 Step -1
      If acaser <= Val(listeciternes.List(i)) Then
        quelle_citerne = i
        resultat.Text = resultat.Text & vbCrLf & acaser & " litres dans citerne de " & listeciternes.List(i) & " litres"
        dispo = dispo - Val(listeciternes.List(quelle_citerne))
        listeciternes.RemoveItem (i)
        acaser = 0
        Exit For
      End If
    Next
    If acaser > 0 Then resultat.Text = resultat.Text & vbCrLf & Val(listeciternes.List(quelle_citerne)) & " litres dans citerne de " & listeciternes.List(quelle_citerne) & " litres"
    acaser = acaser - Val(listeciternes.List(quelle_citerne))
    If acaser > 0 Then
      dispo = dispo - Val(listeciternes.List(quelle_citerne))
      listeciternes.RemoveItem (quelle_citerne)
    End If
    DoEvents
  Wend
  listcommande.RemoveItem (j)
End Sub


Voilà...
Si satisfait, tu dis...
J'ai fait pour toi une exception (j'évite en général de développer un ensemble de choses... préférant laisser travailler...).
Tu me ferais plaisir si, t'inspirant dse ce que j'ai écrit ici à "la va vite", tu y ajoutais un travail personnel de perfectionnement et d'optimisation.

A +
0
cs_eric89 Messages postés 10 Date d'inscription jeudi 28 août 2003 Statut Membre Dernière intervention 5 juin 2007
14 mai 2007 à 11:34
Merci de ton aide !
Je ne voyais vraiment pas comment j'allais m'en sortir.

Eric H
0
cs_eric89 Messages postés 10 Date d'inscription jeudi 28 août 2003 Statut Membre Dernière intervention 5 juin 2007
5 juin 2007 à 15:24
Bonjour

Je me suis remis à mon problème de chargement.Je ne comprend pas pourquoi cela ne marche pas :
Exemple Camion 
   Cuve1 capacite :15
   Cuve2 capacite :15
   Cuve3 capacite:20
   Cuve4 capacite:20
   Cuve5 capacite:25
   Cuve6 capacite:25

Commande :
   Produit1:10
   Produit2:22
   Produit3:30
   Produit4:45

Voila le résultat:
   
   produit 4 dans CUVE1,CUVE2,CUV5
   produit 3 dans CUVE4,CUVE6
   produit 2:non satisfait
   produit1 dans CUVE3

Il y avait une solution:
   produit 4 dans CUVE3 et CUVE5
   produit 3 dans CUVE1 et CUVE4
   produit 2 dans CUVE6
   produit 1 dans CUVE2
Eric H   
0
Rejoignez-nous