Ordonnancement de plusieurs jobs sur 2 machines: Erreur d'Execution 9

Irvinia

XLDnaute Nouveau
Bonjour à tous,

Je travaille sur un exemple de job shop ou comment planifier plusieurs taches selon leur temps d'execution sur 2 machines différentes et le message "Erreur d'exécution n°9, l'indice n'appartient pas à la sélection" apparait lorsque j'essaie de lire mon code VBA. J'ai cherché pendant de longs moments ce qui n'allait pas dans mon code mais impossible de trouver!

Mes données de base sont:
Job t(i,1) t(i,2)
1 5 2
2 1 6
3 9 7
4 3 8
5 10 4
où t(i,j) correspond au temps d'execution du job i sur la machine j

La stratégie adoptée pour classer les jobs est la suivante:
- si le plus petit temps d'exécution est effectué sur la machine 1, alors on planifie ce job en premier
- si le plus petit temps d'exécution est effectué sur la machine 2, alors on planifie ce job en dernier
Dans l'exemple ci-dessus, ça donne l'ordre suivant: 2-4-3-5-1.

Ci-dessous mon code:

Sub TaskA()
Dim k, i, j, n, v, l, w, x, Z, a, b, t As Integer
Dim u() As Integer
Dim s() As Integer

n = 5 'nombre total de jobs'

ReDim u(n) 'créer un array pour stocker tous les jobs non planifiés: les valeurs sont 0 pour chaque cas et quand le job est planifié, 1"
ReDim s(n) 'créer un array pour se rappeler l'ordre des jobs planifiés'

x = 0 'compteur des jobs scheduled sur la machine 2'
Z = 0 'compteur des jobs scheduled sur la machine 1'

For i = 1 To n
b = k = 20 'indique le minimum des processing times'
w = v = 0 'indique le numéro du job avec le minimum process time'
For j = 1 To n 'pour la premiere colonne donc pour la premiere machine'
t = Cells(j, 1)
If u(j) <> 1 And (t < k) Then
k = t And v = j
End If
Next
For l = 1 To n 'pour la deuxieme machine'
a = Cells(l, 2)
If u(l) <> 1 And a < b Then
b = a And w = l
End If
Next
If b < k Then
k = b And v = w And x = x + 1 And s(5 - x + 1) = v
Else
Z = Z + 1 And s(i - Z + 1) = v
End If
u(v) = 1
Next

MsgBox " The job sequence is " & s(1) & "-" & s(2) & "-" & s(3) & "-" & s(4) & "-" & s(5)

End Sub

L'erreur apparait sur la ligne u(v)=1

Merci beaucoup pour l'aide que vous pourrez m'apporter :)

Bonne fin de journée
 

Gorfael

XLDnaute Barbatruc
Re : Ordonnancement de plusieurs jobs sur 2 machines: Erreur d'Execution 9

Salut Irvinia et le forum
Et pourquoi le forum il se décarcasse si tu n'utilises pas les balises qu'il crée, hein ?
Code:
Sub TaskA()
Dim k As Integer, i As Integer, j As Integer, n As Integer, v As Integer, l As Integer
Dim w As Integer, x As Integer, Z As Integer, a As Integer, b As Integer, t As Integer
Dim u() As Integer
Dim s() As Integer

n = 5 'nombre total de jobs'

ReDim u(n) 'créer un array pour stocker tous les jobs non planifiés: les valeurs sont 0 pour chaque cas et quand le job est planifié, 1"
ReDim s(n) 'créer un array pour se rappeler l'ordre des jobs planifiés'

x = 0 'compteur des jobs scheduled sur la machine 2'
Z = 0 'compteur des jobs scheduled sur la machine 1'

For i = 1 To n
    b = 20
    k = 20 'indique le minimum des processing times'
    w = 0
    v = 0 'indique le numéro du job avec le minimum process time'
    For j = 1 To n 'pour la premiere colonne donc pour la premiere machine'
        t = Cells(j, 1)
        If u(j) <> 1 And (t < k) Then
            k = t
            v = j
        End If
    Next
    For l = 1 To n 'pour la deuxieme machine'
        a = Cells(l, 2)
        If u(l) <> 1 And a < b Then
            b = a
            w = l
        End If
    Next
    If b < k Then
        k = b
        v = w
        x = x + 1
        s(5 - x + 1) = v
    Else
        Z = Z + 1
        s(i - Z + 1) = v
    End If
    u(v) = 1
Next
MsgBox " The job sequence is " & s(1) & "-" & s(2) & "-" & s(3) & "-" & s(4) & "-" & s(5)
End Sub
Ton code, tel que je crois qu'il fonctionnera mieux : je ne l'ai pas testé (ni le tien), mais je pense qu'il y a une erreur de compréhension (soit de toi... soit de moi :p)

And n'est pas une instruction en soi : c'est un opérateur logique => quand tu écris :
Code:
if u(j) <> 1 And (t < k) Then
        k = t And v = j
        End If
Si u(j) est différent de 1 Et que t est inférieur à k, la condition est vraie et on devrait exécuter la partie avant EndIf. Mais k = t And v = j n'est pas une instruction, ce n'est qu'une valeur qui donnera Vrai ou Faux, mais sans être exploitée, le And l'incluant dans une opération bouléenne, pas dans une instruction de définition de valeur.

À mon sens, tout faire pour réduire le nombre de lignes d'une macro en effectuant plusieurs instructions par ligne de code n'est pas une bonne idée : il est plus facile de débugger un code clair et lisible, qu'un condensé touffu et confu. Mais ce n'est qu'une opinion personnelle.

Pour dépanner, il est toujours utile de faire du pas-à-pas, en regardant que les variables évolues correctement, comme on peut le calculer.
A+
 

Discussions similaires

Réponses
7
Affichages
328

Statistiques des forums

Discussions
312 243
Messages
2 086 539
Membres
103 244
dernier inscrit
lavitzdecreu