cs_eric89
Messages postés10Date d'inscriptionjeudi 28 août 2003StatutMembreDernière intervention 5 juin 2007
-
10 mai 2007 à 09:09
cs_eric89
Messages postés10Date d'inscriptionjeudi 28 août 2003StatutMembreDerniè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
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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.
cs_eric89
Messages postés10Date d'inscriptionjeudi 28 août 2003StatutMembreDerniè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