Problème de remplissage d’une matrice

Problème de remplissage d’une matrice - VB/VBA/VBS - Programmation

Marsh Posté le 28-06-2006 à 10:49:58    

Problème de remplissage d’une matrice.
 
Bonjour, je développe une macro qui réalise une chaîne de cote de pignon et je rencontre un problème tout bête à faire à la main, mais pour le programmer, je m’emmêle les pinceaux.
 
Voici mon cas d’étude :
 
J’ai un premier tableau dit « Condition » (3 lignes et 3 colonnes pour l’exemple):
(1ère colonne = N° de la condition, 2ème = Origine de la cote, 3ème = extrémité de la cote)
Les origines et les extrémités vont de 10 en 10.
 
C1 10 20
C2 20 40
C3 30 40
 
J’ai un second tableau dit « Transition » (idem 3 lignes et 3 colonnes)
 
T1 10 20
T2 10 30
T3 10 40
 
A partir de ces 2 tableaux, je voudrais créer une matrice ayant les conditions en lignes et les transitions en colonne.
 
On doit trouver pour cet exemple que
T1 = C1
T2 = C1+C2-C3
T3 = C1+C3
 
Soit la matrice que je dois obtenir.
 C1 C2 C3
T1 1 0 0
 
T2 1 1 -1
 
T3 1 1 0
 
En fait je n’arrive pas à trouver comment la remplir sauf pour en (T1,C1)
 
Voici le programme : VBA sous CatiaV5R14
Sub CATmain()
 
    'Création des cotes conditions
    Dim C(3, 3)
    '1er colonne
    C(1, 1) = 1: C(2, 1) = 2: C(3, 1) = 3
    '2ème
    C(1, 2) = 10: C(2, 2) = 20: C(3, 2) = 30
    '3ème
    C(1, 3) = 20: C(2, 3) = 40: C(3, 3) = 40
 
    'Tableau T
    Dim T(4, 3)
    '1er colonne
    T(1, 1) = 1: T(2, 1) = 2: T(3, 1) = 3
    '2ème
    T(1, 2) = 10: T(2, 2) = 10: T(3, 2) = 10
    '3ème
    T(1, 3) = 20: T(2, 3) = 30: T(3, 3) = 40
     
    Dim M1(3, 3)
    For i = 0 To 3
        For j = 0 To 3
            M1(i, j) = 0
        Next j
    Next i
     
    'Matrice M1 de la forme M1(T(i),C(j))
    Dim NbreFace: NbreFace = 4
    For i = 1 To NbreFace - 1
        For j = 1 To NbreFace - 1
         
            If T(i, 2) = C(j, 2) And T(i, 3) = C(j, 3) Then
                M1(i, j) = 1
            End If
 
            X1 = 10
            X2 = 20
             
            Do While X2 < NbreFace * 10
                If X1 = C(j, 2) And X2 < C(j, 3) Then
                    M1(i, j) = 1
                End If
                X2 = X2 + 10
            Loop
        Next j
         
    Next i
     
    'pour Vérifier ma matrice
    Dim A1, A2, A3, B1, B2, B3, C1, C2, C3
    A1 = M1(1, 1): A2 = M1(1, 2): A3 = M1(1, 3)
    B1 = M1(2, 1): B2 = M1(2, 2): B3 = M1(2, 3)
    C1 = M1(3, 1): C2 = M1(3, 2): C3 = M1(3, 3)
     
     
End Sub
 
 
 :bounce: SI vous avez une idée???
merci
Steph

Reply

Marsh Posté le 28-06-2006 à 10:49:58   

Reply

Marsh Posté le 28-06-2006 à 11:14:49    

un coup tu fais for i=0 to 3 pour ta matrice M1, l'auter coup du fais for i=1 to...
soit tu fais toujours de 0 à X
soit 1 à X
sinon tu perds des données =)

Reply

Marsh Posté le 28-06-2006 à 14:27:20    

Y a-t-il d'autres condition comme par exemple :
 Les conditions (début) vont de 10 en 10 et la longueur de chaque condition est 10 pus 20 pour un même début...enfin des trucs du genre pour pouvoir sortir quelque règles. (c'est quoi tes X1 et X2 ?)

Reply

Marsh Posté le 28-06-2006 à 14:30:00    

et aussi tes exemples sont faux...
T2=C1+C2-C3 ??
tu peux nous débrouissailler tout ca stp  :bounce:

Reply

Marsh Posté le 28-06-2006 à 14:33:07    

Si j'ai compris ... le but du jeux c'est de trouver le chainage
T2=10-30
=10-20 + 20-40 + (40-30)
avec 10-20 = C1
20-40 = C2
40-30=-C3 (C3=30-40)
 
Faut-il qu'il y est toujours une solution ou pas ?

Reply

Marsh Posté le 28-06-2006 à 14:34:19    

Oups effectivement un des exemples est faux :
T3=C1+C2
 
c'est ok dans ton tableau mais pas dans la formule.

Reply

Marsh Posté le 28-06-2006 à 14:35:58    


c'est un jeu de dominos alors  :jap:  
tu fais appel à la théorie des graphes peut etre ?

Reply

Marsh Posté le 28-06-2006 à 14:37:17    

Je crois qu'aujourd'hui il fait surtout appel à nous !!

Reply

Marsh Posté le 28-06-2006 à 17:41:42    

Excusé moi, je me suis effectivement planté dans mon exemple.
 
Je vais essayer d’être plus clair. Je réalise une macro sous Catia V5r14 (logiciel de CAO). J’utilise le module VB pour développer ma macro. Mon objectif est de réaliser les chaînes de côtes de fabrication des pignons équipant les moteurs : type TP400 (Airbus A400), CFM (famille Airbus).
 
En fait, on prend une vue en coupe d’un pignon, on identifie chaque face verticale de celui-ci.  
 
Les faces ont été nommées par ordre croissant de la gauche vers la droite et de 10 en 10.
Face 1 = 10
Face 2 = 20
Face 3 = 30…
 
Bien évidemment, le pignon a été dimensionné par le bureau d’étude et donc à partir de ces dimensions et du nom des faces, j’obtiens une relation entre eux (exemple simple):
 
Ce que j’ai appelé Cote Condition  
 
                                       Origine de la cote                Extrémité de la cote
Cote Condition 1    C1                     10                                   20
Cote Condition 2    C2                     20                                   40
Cote Condition 3    C3                     30                                   40
 
(Par la suite, je travaille plutôt avec 40 à 50 côtes conditions)  
 
En fait la cote C1 (10/20) peut très bien faire 20mm et la cote C2 (20/40)= 10 mm. Les origines et les extrémités sont indépendantes de la valeur de la cote.
 
A partie de cela, j’ai besoin d’une matrice de passage et c’est là qu’interviennent les éléments de transitions.
 
                                     Origine    Extrémité
Transition 1          T1         10          20
Transition 2          T2         10          30
Transition 3          T3         10          40
 
A Présent, je veux relier les Ci aux Ti.
Il faudrait que j’arrive à retrouver la matrice suivante à partir de mes 2 tableaux précédents:
 
            C1          C2         C3
T1          1           0            0
T2          1           1            -1
T3          1           1            0
 
Si vous ne voyer pas trop comment j’obtiens la matrice, dessiné 4 droites verticales, parallèles et nommer les de 10 en 10 de gauche à vers la droite, puis tracer les cotes condition et à coté les transitions. Sur le papier, c’est enfantin…..Mais…
Je pense que la solution est toutes bête mais impossible de la trouver, je commence à tous mélanger et le programme est vraiment bloqué sans sa.
 

Reply

Marsh Posté le 28-06-2006 à 18:00:51    

Paul Hood a écrit :

Si j'ai compris ... le but du jeux c'est de trouver le chainage
T2=10-30
=10-20 + 20-40 + (40-30)
avec 10-20 = C1
20-40 = C2
40-30=-C3 (C3=30-40)
 
Faut-il qu'il y est toujours une solution ou pas ?


   
 
Oui, il doit toujours y avoir une solution

Reply

Marsh Posté le 28-06-2006 à 18:00:51   

Reply

Marsh Posté le 28-06-2006 à 18:19:58    

xtremiste a écrit :

Oui, il doit toujours y avoir une solution


si ton nombre de pignons différents est limité (ici 3, tu peux et contenter de faire des switch début et fin, et tu alimentes par la suiet tes matrices selon un processus itératif en disant A->B existe A->C existe, pour faire B->C j'utilise -(A->B) + (A->C)...
donc en résumant,
si nombre limité, ecris tous les cas à la main
sinon processus empirique par appel récursif.

Reply

Marsh Posté le 28-06-2006 à 18:28:52    

jpcheck a écrit :

si ton nombre de pignons différents est limité (ici 3, tu peux et contenter de faire des switch début et fin, et tu alimentes par la suiet tes matrices selon un processus itératif en disant A->B existe A->C existe, pour faire B->C j'utilise -(A->B) + (A->C)...
donc en résumant,
si nombre limité, ecris tous les cas à la main
sinon processus empirique par appel récursif.


 
Merci de répondre si vite.
Je ne peux pas écrite toutes les solutions. (dans certain cas ma matrice sera de dimension 50x50) Il faut que j'utilise un

Citation :

processus empirique par appel récursif

. Mais c'est la que je suis nul. Je maitrise la CAO mais pas la programmation et j'arrive pas à pondre cette boucle. Si vous pouviez me donner la trame du prog, cela m'aiderait vraiment. :hello:

Reply

Marsh Posté le 29-06-2006 à 10:03:12    

Le problème c'est que des chemins peuvent ne mener à rien ... il faut donc dépiler jusqu'à ce qu'on puisse repartir sur un autre chemin.
 
Ca va pas être coton !!
 
Je pense qu'il s'agit plus d'algo que de code...tu devrais essayer de poser la question dans le groupe "Algorithme".
 
En attendant j'y réfléchi...mais pas à temps plein.

Reply

Marsh Posté le 29-06-2006 à 10:03:18    

le processus empirique risque d'etre lourd sur la durée, je retire mon idée. par contre, tu peux gérer tes chainages de pignons selon une méthode pas trop compliquée.
comme tu gères début et fin dans ton chainage, tu peux faire un premier test  
-est ce que (débutconnu,finconnue) existe ? (1 pignon seulement)
    .oui, je le prends
    .non, boucle de test existe-t-il (debutconnu,x) et (x,finconnue) (2 pignons seulement)
                .oui, je prends
                .non, boucle de test (debutconnu,x)(x,y)(y,finconnue) (3 pignons)
etc.
pour t'assurer de ne pas tourner dans le vide, assure toi via une liste des pignons possibles, que tu as le bon embout final ^^
et comme toutes les chaines sont possibles, tu finiras par trouver
le processus récursif vient par le fait que si tu ne trouves pas (debut,fin,1) tu lanceras (debut,fin,2) etc. le nombrefinal étant le nombre de pignon que tu cherches à obtenir...
 
ca te convient ?
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed