Tableau d'un calcul de probabilités (2)

Résolu
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 - 30 juin 2013 à 20:22
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 - 7 juil. 2013 à 11:26
Je reprends ma discussion précédente, dans laquelle j'avais fait trop d'erreurs.

29 juin 2013 à 18:37
Ma demande initiale

Bonjour à tous,

Je souhaite afficher toutes les combinaisons dans une feuille excel (2003), selon l'analyse combinatoire suivante:
8 machines fonctionnent (ou pas) dans un seul de leurs modes.
On connait la consommation pour chacun des modes.
On veut que le total ne dépasse pas une valeur cible (la combinaison sera en rouge dans le tableau).
Machines A à E selon 5 modes (01234)
> Soit 5*5*5*5*5 3125 combinaisons
Machines F et G selon 3 modes (012)
> Soit 3*3 9 combinaisons
Machine H selon 2 modes (01)
=> Soit 2 combinaisons..
Au total on a donc 3125*9*2= 56250 combinaisons!

Soit un "petit" tableau de 25 colonnes sur 56250 lignes...

Un monstre, comparé à un tableau de saisies par choix multiples de 27 colonnes et 6 lignes (qui marche très bien).
Seulement voilà, on souhaite quand même disposer d'une liste de toutes les combinaisons (tri et affichage des combinaisons inadéquates ensuite).

Avant de m'y atteler, j'aimerais savoir si quelqu'un parmi vous s'est aventuré dans un truc du genre pour qu'il me donne un avis : Je crains, mais grave, que le temps de calcul soit dément, surtout que je ne vois pas comment faire autrement qu'avec des For/Next imbriquées (bonjour le casse-tête!).

Désolé pour la longueur de cette demande que j'espère claire.

Merci d'avance
Cordialement
Rataxes64


dimanche 30 juin 2013 à 15:00
Réponse de Cheyenne

Bonjour,

As-tu pensé à la représentation binaire de l'état des modes pour chaque machine ?
Il suffit pour chaque machine de A à E de faire une liste de 0 à 31 en binaire et tu auras tous les états possibles.

Pour les machines F et G, même chose mais de 0 à 7.

Cheyenne



dimanche 30 juin 2013 à 17:29
Ma réponse corrigée

Bonjour,

Je n'ai encore jamais fait ça ...

Pour info, j'ai quand même bâti le fichier (ici) avec des boucles For...Next.

Avec un petit PC portable (1,66GHz / 1Go RAM) et les valeurs entrées, il me faut 5 bonnes minutes pour qu'Excel me rende la main... Et pour écourter tant soit peu le traitement, je n'ai listé que les combinaisons dont la valeur totale dépasse la valeur cible : Dans mon fichier. Ce qui fait quand même presque 10.000 lignes!

Alors, oui, cette piste m'intéresse, mais par où commencer ? Je suis allé voir , mais je n'ai pas su utiliser le code VB proposé par ShayW (vendredi 28 juin 2013 à 18:03:04)


Mon Code VB bâti en For... Next
Private Sub OK_Click()

Application.ScreenUpdating   = False

'Valeur du Mode par Machine (initialisation)
Dim a, b, c, d, e, f, g, h
a = 0   'L1000
b = 0   'L2000
c = 0   'L5000
d = 0   'L18000(1)
e = 0   'L18000(2)
f = 0   'N1
g = 0   'TR11
h = 0   'DL

'Etats Machines (initialisation)
Dim i, j, k, l, m, n, o, p
i 0   'i 1 à 5 (5 états L1000)
j 0   'j 1 à 5 (5 états L2000)
k 0   'k 1 à 5 (5 états L5000)
l 0   'l 1 à 5 (5 états L18000-1)
m 0   'm 1 à 5 (5 états L18000-2)
n 0   'n 1 à 3 (3 états N1)
o 0   'o 1 à 3 (3 états TR11)
p 0   'p 1 à 2 (2 états DL)

'N° de 1ère Colonne de valeur Ampère concernée
Dim q, r, s, t, u, v, w, x
q = 3
r = 7
s = 11
t = 15
u = 19
v = 23
w = 25
x = 27


'RAZ
'===
    'Efface tout pour les lignes au delà de 7
    If Range("A65536").End(xlUp).Row > 7 Then
        last = Range("A65536").End(xlUp).Row
        Range("A8:AA" & last).ClearContents
        Range("A8:AA" & last).Interior.ColorIndex = xlNone
        Range("A8:AA" & last).Borders.LineStyle = xlNone
        Range("A8:AA" & last).Font.Bold = False
    End If
    
'L1000
'For i 1 To 5
        a = 0
        If i > 1 Then a = Cells(5, q + i - 2).Value
        z = a
        If z > Range("B4").Value Then
            last = Range("A65536").End(xlUp).Row + 1
            If i > 1 Then
                Cells(last, q + i - 2).Value = "X"
                Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                Exit For
            End If
        End If
'L2000
'For j 1 To 5
            b = 0
            If j > 1 Then b = Cells(5, r + j - 2).Value
            z = a + b
            If z > Range("B4").Value Then
                last = Range("A65536").End(xlUp).Row + 1
                If i > 1 Then Cells(last, q + i - 2).Value = "X"
                If j > 1 Then
                    Cells(last, r + j - 2).Value = "X"
                    Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                    If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                    Exit For
                    End If
            End If
            
'L5000
'For k 1 To 5
                c = 0
                If k > 1 Then c = Cells(5, s + k - 2).Value
                z = a + b + c
                If z > Range("B4").Value Then
                    last = Range("A65536").End(xlUp).Row + 1
                    If i > 1 Then Cells(last, q + i - 2).Value = "X"
                    If j > 1 Then Cells(last, r + j - 2).Value = "X"
                    If k > 1 Then
                        Cells(last, s + k - 2).Value = "X"
                        Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                        If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                        Exit For
                    End If
                End If
                
'L18000(1)
'For l 1 To 5
                    d = 0
                    If l > 1 Then d = Cells(5, t + l - 2).Value
                    z = a + b + c + d
                    If z > Range("B4").Value Then
                        last = Range("A65536").End(xlUp).Row + 1
                        If i > 1 Then Cells(last, q + i - 2).Value = "X"
                        If j > 1 Then Cells(last, r + j - 2).Value = "X"
                        If k > 1 Then Cells(last, s + k - 2).Value = "X"
                        If l > 1 Then
                            Cells(last, t + l - 2).Value = "X"
                            Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                            If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                            Exit For
                        End If
                    End If
                    
'L18000(2)
'For m 1 To 5
                        e = 0
                        If m > 1 Then e = Cells(5, u + m - 2).Value
                        z = a + b + c + d + e
                        If z > Range("B4").Value Then
                            last = Range("A65536").End(xlUp).Row + 1
                            If i > 1 Then Cells(last, q + i - 2).Value = "X"
                            If j > 1 Then Cells(last, r + j - 2).Value = "X"
                            If k > 1 Then Cells(last, s + k - 2).Value = "X"
                            If l > 1 Then Cells(last, t + l - 2).Value = "X"
                            If m > 1 Then
                                Cells(last, u + m - 2).Value = "X"
                                Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                                If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                                Exit For
                            End If
                        End If
                        
'N1
'For n 1 To 3
                            f = 0
                            If n > 1 Then f = Cells(5, v + n - 2).Value
                            z = a + b + c + d + e + f
                            If z > Range("B4").Value Then
                                last = Range("A65536").End(xlUp).Row + 1
                                If i > 1 Then Cells(last, q + i - 2).Value = "X"
                                If j > 1 Then Cells(last, r + j - 2).Value = "X"
                                If k > 1 Then Cells(last, s + k - 2).Value = "X"
                                If l > 1 Then Cells(last, t + l - 2).Value = "X"
                                If m > 1 Then Cells(last, u + m - 2).Value = "X"
                                If n > 1 Then
                                    Cells(last, v + n - 2).Value = "X"
                                    Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                                    If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                                    Exit For
                                End If
                            End If

'TR11
'For o 1 To 3
                                g = 0
                                If o > 1 Then g = Cells(5, w + o - 2).Value
                                z = a + b + c + d + e + f + g
                                If z > Range("B4").Value Then
                                    last = Range("A65536").End(xlUp).Row + 1
                                    If i > 1 Then Cells(last, q + i - 2).Value = "X"
                                    If j > 1 Then Cells(last, r + j - 2).Value = "X"
                                    If k > 1 Then Cells(last, s + k - 2).Value = "X"
                                    If l > 1 Then Cells(last, t + l - 2).Value = "X"
                                    If m > 1 Then Cells(last, u + m - 2).Value = "X"
                                    If n > 1 Then Cells(last, v + n - 2).Value = "X"
                                    If o > 1 Then
                                        Cells(last, w + o - 2).Value = "X"
                                        Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                                        If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                                        Exit For
                                    End If
                                End If
                                
'DL
'For p 1 To 2
                                    h = 0
                                    If p > 1 Then h = Cells(5, x + p - 2).Value
                                    z = a + b + c + d + e + f + g + h
                                    If z > Range("B4").Value Then
                                        last = Range("A65536").End(xlUp).Row + 1
                                        If i > 1 Then Cells(last, q + i - 2).Value = "X"
                                        If j > 1 Then Cells(last, r + j - 2).Value = "X"
                                        If k > 1 Then Cells(last, s + k - 2).Value = "X"
                                        If l > 1 Then Cells(last, t + l - 2).Value = "X"
                                        If m > 1 Then Cells(last, u + m - 2).Value = "X"
                                        If n > 1 Then Cells(last, v + n - 2).Value = "X"
                                        If o > 1 Then Cells(last, w + o - 2).Value = "X"
                                        If last / 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                                        If p > 1 Then
                                            Cells(last, x + p - 2).Value = "X"
                                            Range("A" & last).Value = "Scénrario" & last - 7 & ": " & z & "A"
                                            If last Mod 2 0 Then Range("A" & last & ":AA" & last).Interior.ColorIndex 15
                                           Exit For
                                        End If
                                    End If
                                Next p
                            Next o
                        Next n
                    Next m
                Next l
            Next k
        Next j
    Next i


'FINALISATION
'last Range("A65536").End(xlUp).Row
    If last > 7 Then
        'Style des lignes 8 à la dernière
        Range("A8:AA" & last).Borders.LineStyle = xlContinuous
        Range("A8:AA" & last).Font.Bold = True
        'Nombre de scénarii trouvés
        Range("A7").Value = last - 7 & " cas de" & Chr(10) & "surcharge"
        Range("B5").Select
        'Filtrage activé
        Range("C7:AA7").AutoFilter
    End If

End Sub


Désolé pour ce mic-mac, en vous remerciant d'avance de votre indulgence, et de vos réponses.

Cordialement
Rataxes64

34 réponses

CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
2 juil. 2013 à 09:16
Re,

Autre chose.

Pendant cette présentation, on ne veut pas ne faire qu'un "constat".
Etant donné qu'il n'est pas possible de définir des "priorités" puisque les mises en route sont aléatoirement déclenchées par l'alarme incendie, le tableau doit pouvoir proposer des possibilités de modifications. Par exemple, si tel moteur est remplacé par un moins gourmand (Valeur de mode changée pour ce moteur) : Que se passe-t'il?
Sur quel moteur agir prioritairement? Là, cela devient vite un vrai casse-tête. Et ce n'est plus mon affaire, mais celle des motoristes qui seront présents.
Moi, je propose de "seulement" démontrer que :
1 - Il y a un GROS problème.
2 - Il est possible de "tester" des solutions de façon "parlante" pour les décideurs.
3 - Les décideurs pourront effectivement "vérifier" les solutions proposées par les motoristes.

Cordialement
Rataxes64
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
2 juil. 2013 à 09:31
Re,

L'analyse de Ucfoutu est très pertinente :
mise en route envisageable ou non d'autres machines
et
vérification, avant l'ajout, de ce que cet ajout ne fera pas dépasser la limite permise.

C'est justement la raison de l'existence de la partie Sélection(choix) du tableau : On clique , selon un ORDRE PRIORITAIREMENT CHOISI dans les cases de Mode (1 seul mode par moteur ; sélection marquée par un "X"), et AU FUR ET A MESURE, les cases dont la sélection ferait dépasser la consommation passe en rouge (avec un message d'erreur si l'on veut quand même les sélectionner).

J'espère être clair...

Cordialement
Rataxes64
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
2 juil. 2013 à 23:05
Bonsoir,

Suite aux échanges MP proposés par Cheyenne concernant l'utilisation d'un tableau Tbl(65356,25), j'en ai conclu que l'on améliorerait pas le temps de traitement ou d'affichage. En effet le bouclage de chaque combinaison étant "surveillé" par un Exit for dès que l'on dépasse la cible, on a toutes les configurations MINIMUM qui conduisent au dépassement de la cible. Et ça suffit.
Donc le temps de traitement est déjà bien optimisé.
Il est long?
Non, on est trop pressé!

Reste à "toiletter mon code de travail (option explicit, etc., etc.)

Voilà.

Merci à vous.

Cordialement
Rataxes64
0
Utilisateur anonyme
3 juil. 2013 à 01:03
Bonjour,

Donc le temps de traitement est déjà bien optimisé.


Peut-être. C'est là que l'on voit la limite des langages interprétés comme VBA. Tu pourrais envisager d'utiliser un langage compilé comme VB.net ou Caiguisé et un DataCridView pour l'affichage

Il est long?


Je n'ai pas regardé si tu as-tu mis :

application.screenupdating = false

au début de la macro et

application.screenupdating = true

à la fin. En éliminant la mise à jour continuelle de l'affichage, tu gagnerais un peu de temps. En revanche, tu perds tout contrôle visuel de la progression du travail

Non, on est trop pressé!


Peut-être.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
3 juil. 2013 à 01:05
Je n'ai pas regardé si tu as-tu mis :

application.screenupdating = false

au début de la macro et

application.screenupdating = true


Ils sont bien là.
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
3 juil. 2013 à 13:53
Bonjour,

Histoire d'optimiser un petit peu :
Mettre "X" en Constant dans les déclarations.

au lieu de :
Range("A" & last & ":AB" & last).patati
Range("A" & last & ":AB" & last).patata
Range("A" & last & ":AB" & last).patato

utiliser :
With Range("A" & last & ":AB" & last)
   .patati
   .patata
   .patato
End With

Mais bon ce n'est pas cela qui te fera gagner beaucoup de temps !

Cheyenne
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
4 juil. 2013 à 09:03
Bonjour,

Plus "propre", certes, mais aucun gain sur le temps de traitement.

C'était prévisible, car il dépend essentiellement des boucles For... Next.

Merci quand même!

Cordialement
Rataxes64
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
4 juil. 2013 à 13:42
Bonjour,

Ok, pas de gain de temps.
Justement à propos du couple For/Next essaye avec Do...Until, c'est 7 fois plus rapide.
Toutefois ce test a été réalisé avec une boucle comportant 1 million d'itérations, toi, au pire, tu n'en as que 5, mais c'est à tenter.
Je suppose que tu mesures le temps d'exécution avec la fonction GetTickCount...

Bonne journée,

Cheyenne
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
5 juil. 2013 à 09:40
Bonjour,

Je suppose que tu mesures le temps d'exécution avec la fonction GetTickCount...


Non, ...avec un chronomètre! "Je ne connaissais pas GetTickConte". Je vais chercher pour voir comme je peux utiliser ça, après avoir testé Do...While.

Cordialement
Rataxes64
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
5 juil. 2013 à 14:01
Bonjour CerberusPau,

Ce n'est pas GetTickConte mais GetTickCount.
Je vais chercher pour voir comme je peux utiliser ça, après avoir testé Do...While.
Ben non, il vaudrait mieux faire l'inverse. Implémenter d'abord la fonction, faire la mesure avec For/Next les changer en Do/While et faire une 2éme mesure. Faire une moyenne sur 5 ou 10 tests pour chaque essai avec For et Do.
Parce que chrono en main, ce n'est pas le top pour faire évaluer le temps d'exécution d'un code.

Cheyenne
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
5 juil. 2013 à 16:21
Bonjour,

Il semblerait que'avec l'API GetTickCount:
Option Explicit
Dim StartTime As Variant
Dim EndTime As Variant
Public Declare Function GetTickCount Lib "kernel32" () As Long


Sub APIstart()
'donne le nombre total de secondes
StartTime = GetTickCount() / 1000
Range("D7").Value = StartTime
End Sub


Sub APIend()
'donne le nombre total de secondes
EndTime = GetTickCount() / 1000
Range("E7").Value = EndTime
End Sub

on ait le même résultat qu'avec Time
Sub TIMstart()
'donne le nombre de minutes:secondes
Range("G7").Value = Time
End Sub


Sub TIMend()
'donne le nombre de minutes:secondes
Range("H7").Value = Time
End Sub


Mais exprimé de façon différente

La différence TIMend - TIMstar, me paraît plus directement "parlante" car directement en mn:s.
J'utilise donc Time.

Résultat : beaucoup, mais beaucoup plus long...

J'ai des doutes sur mon script Do While...

i=0
do while i<6
 ... autres loop ...
loop


Cordialement
Rataxes64
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
5 juil. 2013 à 18:12
Bonjour,
Il ne faut pas s'égarer à vouloir à tout prix sodomiser les coléoptères !
On parle ici de quoi ? de quelles différences (en quelles unités) de durée de traitement ?
Inutile, ici, d'abuser de la fonction GerTickCount. Inutile égalerment de "dépenser" une cellule ===>>

au lancement des instructions en cause :
dim debut as double
debut = timer
et en fin d'exécution des instruction en cause
msgbox timer - début
affichera la durée avec une précision nettement inférieure au centième de seconde
exemple :
Dim deb As Double, i As Long, a As Long
deb = Timer
For i = 1 To 10000000
  a = a + 1 ' ou n'importe quelles instructions
Next
MsgBox Timer - deb


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
cs_cheyenne Messages postés 693 Date d'inscription samedi 18 mai 2002 Statut Membre Dernière intervention 17 avril 2017 2
5 juil. 2013 à 19:35
Re,

Oui, inutile de sacrifier 2 cellules (au passage bonjour à ucfoutu). Oui, soit, Timer convient également, la précision est suffisante pour la demande.

J'aurais plutôt vu le code ainsi :
i = 0
Do
   i = i + 1
   ' traitement

   j = 0
   Do
      j = j + 1
      ' traitement
      
      k = 0
      Do
         k = k + 1
         ' traitement
      Loop Until k = 5
   
   Loop Until j = 5
Loop Until i = 5

Cheyenne
0
CerberusPau Messages postés 377 Date d'inscription lundi 3 avril 2006 Statut Membre Dernière intervention 22 août 2018 1
7 juil. 2013 à 11:26
Re,

Avec un "s" à "bon", ce sera mieux!

Rataxes64
0
Rejoignez-nous