OVH Cloud OVH Cloud

optimisation d'insertion de cadres de tailles différentes.

17 réponses
Avatar
Driss HANIB
Bonjour à tous

je cherche à trouver l'ordre optimal d'insertion de cadres de hauteurs
différentes dans une page.

En détail

sur feuille (ici de format A4, verticale) j'ai défini des marge d'entête et
de pied de page entre lesquelles je peux insérer ce que je veux :
ceci définit donc une hauteur disponible dans laquelle je peux insérer des
cadres

mon problème est le suivant
pour une situation donnée, j'obtiens un nombre N de tableaux à créer dont la
hauteur est variable et dépend de la situation : chaque tableau a une
hauteur propre définie par le nombre de lignes de ce tableau, toutes les
lignes étant de hauteur constante.

Exemple :

Tableau 1 : 6 lignes
Tableau 2 : 5 lignes
tableau 3 : 10 lignes
tableau 4 : 5 lignes
tableau 5 : 7 lignes

ce que je cherche est : si la somme des hauteurs des tableaux est supérieure
à la hauteur disponible (définie plus haut), comment trouver l'ordre mais
surtout les indices des tableaux à imprimer pour que le maximum d'espace
soit utilisé ?
les autres tableaux seont mis (de la même) façon sur la page suivante.
Il est bien entendu que l'espace entre les tableaux est une constante ;
considérer donc que je peux définir les hauteurs occpées par chaque
tableaux.
D'autre part, l'ordre d'écriture des tableaux n'a aucune importance.

j'espère avoir été clair. si question n'hésitez pas..

Merci pour vos pistes
NB : naturellement le commencerais par le tableau le plus haut... mais est
ce bien cela ..
Faut il tester toutes les possibilités ?

Driss

10 réponses

1 2
Avatar
Jean-marc
"Driss HANIB" a écrit dans le message de news:

Bonjour à tous

je cherche à trouver l'ordre optimal d'insertion de cadres de hauteurs
différentes dans une page.

En détail

sur feuille (ici de format A4, verticale) j'ai défini des marge d'entête
et
de pied de page entre lesquelles je peux insérer ce que je veux :
ceci définit donc une hauteur disponible dans laquelle je peux insérer des
cadres

mon problème est le suivant
pour une situation donnée, j'obtiens un nombre N de tableaux à créer dont
la
hauteur est variable et dépend de la situation : chaque tableau a une
hauteur propre définie par le nombre de lignes de ce tableau, toutes les
lignes étant de hauteur constante.

Exemple :

Tableau 1 : 6 lignes
Tableau 2 : 5 lignes
tableau 3 : 10 lignes
tableau 4 : 5 lignes
tableau 5 : 7 lignes

ce que je cherche est : si la somme des hauteurs des tableaux est
supérieure
à la hauteur disponible (définie plus haut), comment trouver l'ordre mais
surtout les indices des tableaux à imprimer pour que le maximum d'espace
soit utilisé ?
les autres tableaux seont mis (de la même) façon sur la page suivante.
Il est bien entendu que l'espace entre les tableaux est une constante ;
considérer donc que je peux définir les hauteurs occpées par chaque
tableaux.
D'autre part, l'ordre d'écriture des tableaux n'a aucune importance.

j'espère avoir été clair. si question n'hésitez pas..

Merci pour vos pistes
NB : naturellement le commencerais par le tableau le plus haut... mais est
ce bien cela ..
Faut il tester toutes les possibilités ?



Hello Driss,

Voici une question intéressante!

J'ai une solution en tête, il me faut 1 heure ou 2
pour formaliser tout cela :-)

A tout de suite!

--
Jean-marc Noury (jean_marc_n2)
MVP Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Jean-marc
"Driss HANIB" a écrit dans le message de news:

Bonjour à tous

je cherche à trouver l'ordre optimal d'insertion de cadres de hauteurs
différentes dans une page.

En détail

sur feuille (ici de format A4, verticale) j'ai défini des marge d'entête
et
de pied de page entre lesquelles je peux insérer ce que je veux :
ceci définit donc une hauteur disponible dans laquelle je peux insérer des
cadres

mon problème est le suivant
pour une situation donnée, j'obtiens un nombre N de tableaux à créer dont
la
hauteur est variable et dépend de la situation : chaque tableau a une
hauteur propre définie par le nombre de lignes de ce tableau, toutes les
lignes étant de hauteur constante.

Exemple :

Tableau 1 : 6 lignes
Tableau 2 : 5 lignes
tableau 3 : 10 lignes
tableau 4 : 5 lignes
tableau 5 : 7 lignes

ce que je cherche est : si la somme des hauteurs des tableaux est
supérieure
à la hauteur disponible (définie plus haut), comment trouver l'ordre mais
surtout les indices des tableaux à imprimer pour que le maximum d'espace
soit utilisé ?
les autres tableaux seont mis (de la même) façon sur la page suivante.
Il est bien entendu que l'espace entre les tableaux est une constante ;
considérer donc que je peux définir les hauteurs occpées par chaque
tableaux.
D'autre part, l'ordre d'écriture des tableaux n'a aucune importance.







Et voila...

Bon, voici un algo qui vaut ce qu'il vaut.
Il ne donne pas la solution optimale dans tous les cas,
mais dans tous les cas il donne une solution raisonnable.

Pour une solution "optimale", il faut implémenter l'algorithme
dit du "sac à dos" (Google "algorithme sac a dos"); une bonne
implémentation est disponible ici:
http://www.enseignement.polytechnique.fr/profs/informatique/Jean-Jacques.Levy/poly/main8/node8.html
A noter que ce problème est NP complet et que pour trouver une solution
optimale il n'y a pas mieux qu'une exploration systématique récursive
avec un temps de calacuil qui croit exponentiellement.

Revenons à ma solution:

L'idée est de trier les hauteurs (et les indices correspondants),
puis on part du plus grand et on ajoute autant de tableaux que possible
en privilégiant les plus grands d'abord (c'est la différence par rapport
à une implémentation du problème du sac à dos).

Voici la chose:
la fonction comande1 contient un simple appel avec des valeurs de test.


NOTE: j'ai programmé ça vite fait, ce n'est pas forcément
très joli mais ça marche en tout cas :-)


Option Explicit

Private Sub Command1_Click()
Dim HPage As Long
Dim Esp As Long
Dim n As Long
Dim h() As Long
Dim s As String
Dim repart() As String
Dim nb_page As Long
Dim i As Long


HPage = 200
Esp = 10
n = 5
ReDim h(n)
h(1) = 40
h(2) = 18
h(3) = 60
h(4) = 120
h(5) = 90

s = GetRepartTableau(n, h(), HPage, Esp)

If s <> "" Then
repart = Split(s, "#")
For i = LBound(repart()) To UBound(repart())
nb_page = nb_page + 1
Debug.Print "Page " & nb_page & " : " & repart(i)
Next i
Else
' un des tableau à lui tout seul est trop grand
MsgBox "souci, tableau trop grand"
End If

End Sub

Public Function GetRepartTableau(n As Long, h() As Long, HPage As Long, Esp
As Long) As String
Dim t_indice() As Long
Dim t_copy() As Long
Dim i As Long
Dim encore As Boolean
Dim start As Long
Dim cur As Long
Dim hauteur As Long
Dim keep As String
Dim keep2 As String
Dim G_keep As String
Dim G_keep2 As String
Dim nb_used As Long
Dim nb_tab_page As Long

ReDim t_indice(n)
ReDim t_copy(n)
For i = 1 To n
t_indice(i) = i
t_copy(i) = h(i)
Next i
Call ordonne(n, t_indice(), t_copy())

Do
hauteur = 0
encore = True
cur = 1
keep = ""
keep2 = ""
nb_tab_page = 0
Do
If InStr(G_keep, "," & Trim$(Str$(cur)) & ",") = 0 Then
If (hauteur + h(t_indice(cur)) + (nb_tab_page) * Esp) <
HPage Then
hauteur = hauteur + h(t_indice(cur)) + (nb_tab_page) *
Esp

keep = keep & "," & Trim$(Str$(cur)) & ","
keep2 = keep2 & "," & Trim$(Str$(t_indice(cur))) & ","
cur = cur + 1
nb_used = nb_used + 1
nb_tab_page = nb_tab_page + 1
Else
cur = cur + 1
End If
Else
cur = cur + 1
End If
If cur > n Then
Exit Do
End If
Loop
If hauteur = 0 Then
' un des tableaux est trop
'grand pour tenir même tout seul sur une page
MsgBox "probleme"
GetRepartTableau = ""
Exit Function
Else
G_keep = G_keep & keep & "#"
G_keep2 = G_keep2 & keep2 & "#"
End If
If nb_used = n Then
Exit Do
End If
Loop
G_keep2 = Mid$(G_keep2, 1, Len(G_keep2) - 1)
G_keep2 = Replace(G_keep2, ",,", ",")
G_keep2 = Mid$(G_keep2, 2)
G_keep2 = Mid$(G_keep2, 1, Len(G_keep2) - 1)
G_keep2 = Replace(G_keep2, "#,", "#")
G_keep2 = Replace(G_keep2, ",#", "#")
GetRepartTableau = G_keep2
End Function

Private Sub ordonne(n As Long, indice() As Long, data() As Long)
Dim i As Integer
Dim tmp As Long
Dim encore As Boolean

encore = True
While encore
encore = False
For i = 1 To n - 1
If data(i) < data(i + 1) Then
tmp = data(i)
data(i) = data(i + 1)
data(i + 1) = tmp

tmp = indice(i)
indice(i) = indice(i + 1)
indice(i + 1) = tmp

encore = True
End If
Next i
Wend
End Sub


Sur cet exmple;, le programme trouve:
Page 1 : 4,3
Page 2 : 5,1,2

C'est à dire 2 pages:
sur la premiere le tableau numero 4 et le numero 3, de hauteur respectives
120 et 60, ce qui avec l'intervalle de 10 donne 120+60+10 = 190 (pour un max
de 200)

puis sur la page 2, les numeros 5, 1 et 2 c'est à dire:
90+40+18 + 2*10 = 168 (pour le meme max de 200).

J'ai testé sur d'autres cas, ca marche plutot bien :-)

Tout feedback bienvenu :-)

--
Jean-marc Noury (jean_marc_n2)
MVP Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Patrice Henrio
cela me rappelle un problème de rouleaux de tapisserie ...


"Jean-marc" a écrit dans le message
de news: 453d0459$0$21492$
"Driss HANIB" a écrit dans le message de news:

Bonjour à tous

je cherche à trouver l'ordre optimal d'insertion de cadres de hauteurs
différentes dans une page.

En détail

sur feuille (ici de format A4, verticale) j'ai défini des marge d'entête
et
de pied de page entre lesquelles je peux insérer ce que je veux :
ceci définit donc une hauteur disponible dans laquelle je peux insérer
des
cadres

mon problème est le suivant
pour une situation donnée, j'obtiens un nombre N de tableaux à créer dont
la
hauteur est variable et dépend de la situation : chaque tableau a une
hauteur propre définie par le nombre de lignes de ce tableau, toutes les
lignes étant de hauteur constante.

Exemple :

Tableau 1 : 6 lignes
Tableau 2 : 5 lignes
tableau 3 : 10 lignes
tableau 4 : 5 lignes
tableau 5 : 7 lignes

ce que je cherche est : si la somme des hauteurs des tableaux est
supérieure
à la hauteur disponible (définie plus haut), comment trouver l'ordre mais
surtout les indices des tableaux à imprimer pour que le maximum d'espace
soit utilisé ?
les autres tableaux seont mis (de la même) façon sur la page suivante.
Il est bien entendu que l'espace entre les tableaux est une constante ;
considérer donc que je peux définir les hauteurs occpées par chaque
tableaux.
D'autre part, l'ordre d'écriture des tableaux n'a aucune importance.







Et voila...

Bon, voici un algo qui vaut ce qu'il vaut.
Il ne donne pas la solution optimale dans tous les cas,
mais dans tous les cas il donne une solution raisonnable.

Pour une solution "optimale", il faut implémenter l'algorithme
dit du "sac à dos" (Google "algorithme sac a dos"); une bonne
implémentation est disponible ici:
http://www.enseignement.polytechnique.fr/profs/informatique/Jean-Jacques.Levy/poly/main8/node8.html
A noter que ce problème est NP complet et que pour trouver une solution
optimale il n'y a pas mieux qu'une exploration systématique récursive
avec un temps de calacuil qui croit exponentiellement.

Revenons à ma solution:

L'idée est de trier les hauteurs (et les indices correspondants),
puis on part du plus grand et on ajoute autant de tableaux que possible
en privilégiant les plus grands d'abord (c'est la différence par rapport
à une implémentation du problème du sac à dos).

Voici la chose:
la fonction comande1 contient un simple appel avec des valeurs de test.


NOTE: j'ai programmé ça vite fait, ce n'est pas forcément
très joli mais ça marche en tout cas :-)


Option Explicit

Private Sub Command1_Click()
Dim HPage As Long
Dim Esp As Long
Dim n As Long
Dim h() As Long
Dim s As String
Dim repart() As String
Dim nb_page As Long
Dim i As Long


HPage = 200
Esp = 10
n = 5
ReDim h(n)
h(1) = 40
h(2) = 18
h(3) = 60
h(4) = 120
h(5) = 90

s = GetRepartTableau(n, h(), HPage, Esp)

If s <> "" Then
repart = Split(s, "#")
For i = LBound(repart()) To UBound(repart())
nb_page = nb_page + 1
Debug.Print "Page " & nb_page & " : " & repart(i)
Next i
Else
' un des tableau à lui tout seul est trop grand
MsgBox "souci, tableau trop grand"
End If

End Sub

Public Function GetRepartTableau(n As Long, h() As Long, HPage As Long,
Esp As Long) As String
Dim t_indice() As Long
Dim t_copy() As Long
Dim i As Long
Dim encore As Boolean
Dim start As Long
Dim cur As Long
Dim hauteur As Long
Dim keep As String
Dim keep2 As String
Dim G_keep As String
Dim G_keep2 As String
Dim nb_used As Long
Dim nb_tab_page As Long

ReDim t_indice(n)
ReDim t_copy(n)
For i = 1 To n
t_indice(i) = i
t_copy(i) = h(i)
Next i
Call ordonne(n, t_indice(), t_copy())

Do
hauteur = 0
encore = True
cur = 1
keep = ""
keep2 = ""
nb_tab_page = 0
Do
If InStr(G_keep, "," & Trim$(Str$(cur)) & ",") = 0 Then
If (hauteur + h(t_indice(cur)) + (nb_tab_page) * Esp) <
HPage Then
hauteur = hauteur + h(t_indice(cur)) + (nb_tab_page) *
Esp

keep = keep & "," & Trim$(Str$(cur)) & ","
keep2 = keep2 & "," & Trim$(Str$(t_indice(cur))) & ","
cur = cur + 1
nb_used = nb_used + 1
nb_tab_page = nb_tab_page + 1
Else
cur = cur + 1
End If
Else
cur = cur + 1
End If
If cur > n Then
Exit Do
End If
Loop
If hauteur = 0 Then
' un des tableaux est trop
'grand pour tenir même tout seul sur une page
MsgBox "probleme"
GetRepartTableau = ""
Exit Function
Else
G_keep = G_keep & keep & "#"
G_keep2 = G_keep2 & keep2 & "#"
End If
If nb_used = n Then
Exit Do
End If
Loop
G_keep2 = Mid$(G_keep2, 1, Len(G_keep2) - 1)
G_keep2 = Replace(G_keep2, ",,", ",")
G_keep2 = Mid$(G_keep2, 2)
G_keep2 = Mid$(G_keep2, 1, Len(G_keep2) - 1)
G_keep2 = Replace(G_keep2, "#,", "#")
G_keep2 = Replace(G_keep2, ",#", "#")
GetRepartTableau = G_keep2
End Function

Private Sub ordonne(n As Long, indice() As Long, data() As Long)
Dim i As Integer
Dim tmp As Long
Dim encore As Boolean

encore = True
While encore
encore = False
For i = 1 To n - 1
If data(i) < data(i + 1) Then
tmp = data(i)
data(i) = data(i + 1)
data(i + 1) = tmp

tmp = indice(i)
indice(i) = indice(i + 1)
indice(i + 1) = tmp

encore = True
End If
Next i
Wend
End Sub


Sur cet exmple;, le programme trouve:
Page 1 : 4,3
Page 2 : 5,1,2

C'est à dire 2 pages:
sur la premiere le tableau numero 4 et le numero 3, de hauteur respectives
120 et 60, ce qui avec l'intervalle de 10 donne 120+60+10 = 190 (pour un
max de 200)

puis sur la page 2, les numeros 5, 1 et 2 c'est à dire:
90+40+18 + 2*10 = 168 (pour le meme max de 200).

J'ai testé sur d'autres cas, ca marche plutot bien :-)

Tout feedback bienvenu :-)

--
Jean-marc Noury (jean_marc_n2)
MVP Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/








Avatar
Jean-marc
> "Patrice Henrio" a écrit dans le message de
news:
cela me rappelle un problème de rouleaux de tapisserie ...



Exact, un grand nombre de problèmes d'optimisation
sont équivalents d'un point de vue algorithmique
au problème du sac à dos ou à l'une de ses
nombreuses variantes :-)

De même que dans l'optimisation de parcours, en
particulier avec contraintes, on tombe dans bien
des cas sur l'une ou l'autre variante du
problème du voyageur de commerce...

--
Jean-marc Noury (jean_marc_n2)
MVP Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Driss HANIB
merci jean marc, ;o)))))

j me plonge dans cette algo du sac à dos et dans ta réponse à ma question..
je te tiens au courant

Driss
"Jean-marc" a écrit dans le message
de news:453d0459$0$21492$
"Driss HANIB" a écrit dans le message de news:

> Bonjour à tous
>
> je cherche à trouver l'ordre optimal d'insertion de cadres de hauteurs
> différentes dans une page.
>
> En détail
>
> sur feuille (ici de format A4, verticale) j'ai défini des marge d'entête
> et
> de pied de page entre lesquelles je peux insérer ce que je veux :
> ceci définit donc une hauteur disponible dans laquelle je peux insérer


des
> cadres
>
> mon problème est le suivant
> pour une situation donnée, j'obtiens un nombre N de tableaux à créer


dont
> la
> hauteur est variable et dépend de la situation : chaque tableau a une
> hauteur propre définie par le nombre de lignes de ce tableau, toutes les
> lignes étant de hauteur constante.
>
> Exemple :
>
> Tableau 1 : 6 lignes
> Tableau 2 : 5 lignes
> tableau 3 : 10 lignes
> tableau 4 : 5 lignes
> tableau 5 : 7 lignes
>
> ce que je cherche est : si la somme des hauteurs des tableaux est
> supérieure
> à la hauteur disponible (définie plus haut), comment trouver l'ordre


mais
> surtout les indices des tableaux à imprimer pour que le maximum d'espace
> soit utilisé ?
> les autres tableaux seont mis (de la même) façon sur la page suivante.
> Il est bien entendu que l'espace entre les tableaux est une constante ;
> considérer donc que je peux définir les hauteurs occpées par chaque
> tableaux.
> D'autre part, l'ordre d'écriture des tableaux n'a aucune importance.
>




Et voila...

Bon, voici un algo qui vaut ce qu'il vaut.
Il ne donne pas la solution optimale dans tous les cas,
mais dans tous les cas il donne une solution raisonnable.

Pour une solution "optimale", il faut implémenter l'algorithme
dit du "sac à dos" (Google "algorithme sac a dos"); une bonne
implémentation est disponible ici:



http://www.enseignement.polytechnique.fr/profs/informatique/Jean-Jacques.Levy/poly/main8/node8.html
A noter que ce problème est NP complet et que pour trouver une solution
optimale il n'y a pas mieux qu'une exploration systématique récursive
avec un temps de calacuil qui croit exponentiellement.

Revenons à ma solution:

L'idée est de trier les hauteurs (et les indices correspondants),
puis on part du plus grand et on ajoute autant de tableaux que possible
en privilégiant les plus grands d'abord (c'est la différence par rapport
à une implémentation du problème du sac à dos).

Voici la chose:
la fonction comande1 contient un simple appel avec des valeurs de test.


NOTE: j'ai programmé ça vite fait, ce n'est pas forcément
très joli mais ça marche en tout cas :-)


Option Explicit

Private Sub Command1_Click()
Dim HPage As Long
Dim Esp As Long
Dim n As Long
Dim h() As Long
Dim s As String
Dim repart() As String
Dim nb_page As Long
Dim i As Long


HPage = 200
Esp = 10
n = 5
ReDim h(n)
h(1) = 40
h(2) = 18
h(3) = 60
h(4) = 120
h(5) = 90

s = GetRepartTableau(n, h(), HPage, Esp)

If s <> "" Then
repart = Split(s, "#")
For i = LBound(repart()) To UBound(repart())
nb_page = nb_page + 1
Debug.Print "Page " & nb_page & " : " & repart(i)
Next i
Else
' un des tableau à lui tout seul est trop grand
MsgBox "souci, tableau trop grand"
End If

End Sub

Public Function GetRepartTableau(n As Long, h() As Long, HPage As Long,


Esp
As Long) As String
Dim t_indice() As Long
Dim t_copy() As Long
Dim i As Long
Dim encore As Boolean
Dim start As Long
Dim cur As Long
Dim hauteur As Long
Dim keep As String
Dim keep2 As String
Dim G_keep As String
Dim G_keep2 As String
Dim nb_used As Long
Dim nb_tab_page As Long

ReDim t_indice(n)
ReDim t_copy(n)
For i = 1 To n
t_indice(i) = i
t_copy(i) = h(i)
Next i
Call ordonne(n, t_indice(), t_copy())

Do
hauteur = 0
encore = True
cur = 1
keep = ""
keep2 = ""
nb_tab_page = 0
Do
If InStr(G_keep, "," & Trim$(Str$(cur)) & ",") = 0 Then
If (hauteur + h(t_indice(cur)) + (nb_tab_page) * Esp) <
HPage Then
hauteur = hauteur + h(t_indice(cur)) + (nb_tab_page) *
Esp

keep = keep & "," & Trim$(Str$(cur)) & ","
keep2 = keep2 & "," & Trim$(Str$(t_indice(cur))) & ","
cur = cur + 1
nb_used = nb_used + 1
nb_tab_page = nb_tab_page + 1
Else
cur = cur + 1
End If
Else
cur = cur + 1
End If
If cur > n Then
Exit Do
End If
Loop
If hauteur = 0 Then
' un des tableaux est trop
'grand pour tenir même tout seul sur une page
MsgBox "probleme"
GetRepartTableau = ""
Exit Function
Else
G_keep = G_keep & keep & "#"
G_keep2 = G_keep2 & keep2 & "#"
End If
If nb_used = n Then
Exit Do
End If
Loop
G_keep2 = Mid$(G_keep2, 1, Len(G_keep2) - 1)
G_keep2 = Replace(G_keep2, ",,", ",")
G_keep2 = Mid$(G_keep2, 2)
G_keep2 = Mid$(G_keep2, 1, Len(G_keep2) - 1)
G_keep2 = Replace(G_keep2, "#,", "#")
G_keep2 = Replace(G_keep2, ",#", "#")
GetRepartTableau = G_keep2
End Function

Private Sub ordonne(n As Long, indice() As Long, data() As Long)
Dim i As Integer
Dim tmp As Long
Dim encore As Boolean

encore = True
While encore
encore = False
For i = 1 To n - 1
If data(i) < data(i + 1) Then
tmp = data(i)
data(i) = data(i + 1)
data(i + 1) = tmp

tmp = indice(i)
indice(i) = indice(i + 1)
indice(i + 1) = tmp

encore = True
End If
Next i
Wend
End Sub


Sur cet exmple;, le programme trouve:
Page 1 : 4,3
Page 2 : 5,1,2

C'est à dire 2 pages:
sur la premiere le tableau numero 4 et le numero 3, de hauteur respectives
120 et 60, ce qui avec l'intervalle de 10 donne 120+60+10 = 190 (pour un


max
de 200)

puis sur la page 2, les numeros 5, 1 et 2 c'est à dire:
90+40+18 + 2*10 = 168 (pour le meme max de 200).

J'ai testé sur d'autres cas, ca marche plutot bien :-)

Tout feedback bienvenu :-)

--
Jean-marc Noury (jean_marc_n2)
MVP Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/








Avatar
Driss HANIB
question avant de tester :

est ce un problème si je passe les hauteur en single, plutot qu'en long ?

Driss
"Jean-marc" a écrit dans le message
de news:453d0459$0$21492$
"Driss HANIB" a écrit dans le message de news:

> Bonjour à tous
>
> je cherche à trouver l'ordre optimal d'insertion de cadres de hauteurs
> différentes dans une page.
>
> En détail
>
> sur feuille (ici de format A4, verticale) j'ai défini des marge d'entête
> et
> de pied de page entre lesquelles je peux insérer ce que je veux :
> ceci définit donc une hauteur disponible dans laquelle je peux insérer


des
> cadres
>
> mon problème est le suivant
> pour une situation donnée, j'obtiens un nombre N de tableaux à créer


dont
> la
> hauteur est variable et dépend de la situation : chaque tableau a une
> hauteur propre définie par le nombre de lignes de ce tableau, toutes les
> lignes étant de hauteur constante.
>
> Exemple :
>
> Tableau 1 : 6 lignes
> Tableau 2 : 5 lignes
> tableau 3 : 10 lignes
> tableau 4 : 5 lignes
> tableau 5 : 7 lignes
>
> ce que je cherche est : si la somme des hauteurs des tableaux est
> supérieure
> à la hauteur disponible (définie plus haut), comment trouver l'ordre


mais
> surtout les indices des tableaux à imprimer pour que le maximum d'espace
> soit utilisé ?
> les autres tableaux seont mis (de la même) façon sur la page suivante.
> Il est bien entendu que l'espace entre les tableaux est une constante ;
> considérer donc que je peux définir les hauteurs occpées par chaque
> tableaux.
> D'autre part, l'ordre d'écriture des tableaux n'a aucune importance.
>




Et voila...

Bon, voici un algo qui vaut ce qu'il vaut.
Il ne donne pas la solution optimale dans tous les cas,
mais dans tous les cas il donne une solution raisonnable.

Pour une solution "optimale", il faut implémenter l'algorithme
dit du "sac à dos" (Google "algorithme sac a dos"); une bonne
implémentation est disponible ici:



http://www.enseignement.polytechnique.fr/profs/informatique/Jean-Jacques.Levy/poly/main8/node8.html
A noter que ce problème est NP complet et que pour trouver une solution
optimale il n'y a pas mieux qu'une exploration systématique récursive
avec un temps de calacuil qui croit exponentiellement.

Revenons à ma solution:

L'idée est de trier les hauteurs (et les indices correspondants),
puis on part du plus grand et on ajoute autant de tableaux que possible
en privilégiant les plus grands d'abord (c'est la différence par rapport
à une implémentation du problème du sac à dos).

Voici la chose:
la fonction comande1 contient un simple appel avec des valeurs de test.


NOTE: j'ai programmé ça vite fait, ce n'est pas forcément
très joli mais ça marche en tout cas :-)


Option Explicit

Private Sub Command1_Click()
Dim HPage As Long
Dim Esp As Long
Dim n As Long
Dim h() As Long
Dim s As String
Dim repart() As String
Dim nb_page As Long
Dim i As Long


HPage = 200
Esp = 10
n = 5
ReDim h(n)
h(1) = 40
h(2) = 18
h(3) = 60
h(4) = 120
h(5) = 90

s = GetRepartTableau(n, h(), HPage, Esp)

If s <> "" Then
repart = Split(s, "#")
For i = LBound(repart()) To UBound(repart())
nb_page = nb_page + 1
Debug.Print "Page " & nb_page & " : " & repart(i)
Next i
Else
' un des tableau à lui tout seul est trop grand
MsgBox "souci, tableau trop grand"
End If

End Sub

Public Function GetRepartTableau(n As Long, h() As Long, HPage As Long,


Esp
As Long) As String
Dim t_indice() As Long
Dim t_copy() As Long
Dim i As Long
Dim encore As Boolean
Dim start As Long
Dim cur As Long
Dim hauteur As Long
Dim keep As String
Dim keep2 As String
Dim G_keep As String
Dim G_keep2 As String
Dim nb_used As Long
Dim nb_tab_page As Long

ReDim t_indice(n)
ReDim t_copy(n)
For i = 1 To n
t_indice(i) = i
t_copy(i) = h(i)
Next i
Call ordonne(n, t_indice(), t_copy())

Do
hauteur = 0
encore = True
cur = 1
keep = ""
keep2 = ""
nb_tab_page = 0
Do
If InStr(G_keep, "," & Trim$(Str$(cur)) & ",") = 0 Then
If (hauteur + h(t_indice(cur)) + (nb_tab_page) * Esp) <
HPage Then
hauteur = hauteur + h(t_indice(cur)) + (nb_tab_page) *
Esp

keep = keep & "," & Trim$(Str$(cur)) & ","
keep2 = keep2 & "," & Trim$(Str$(t_indice(cur))) & ","
cur = cur + 1
nb_used = nb_used + 1
nb_tab_page = nb_tab_page + 1
Else
cur = cur + 1
End If
Else
cur = cur + 1
End If
If cur > n Then
Exit Do
End If
Loop
If hauteur = 0 Then
' un des tableaux est trop
'grand pour tenir même tout seul sur une page
MsgBox "probleme"
GetRepartTableau = ""
Exit Function
Else
G_keep = G_keep & keep & "#"
G_keep2 = G_keep2 & keep2 & "#"
End If
If nb_used = n Then
Exit Do
End If
Loop
G_keep2 = Mid$(G_keep2, 1, Len(G_keep2) - 1)
G_keep2 = Replace(G_keep2, ",,", ",")
G_keep2 = Mid$(G_keep2, 2)
G_keep2 = Mid$(G_keep2, 1, Len(G_keep2) - 1)
G_keep2 = Replace(G_keep2, "#,", "#")
G_keep2 = Replace(G_keep2, ",#", "#")
GetRepartTableau = G_keep2
End Function

Private Sub ordonne(n As Long, indice() As Long, data() As Long)
Dim i As Integer
Dim tmp As Long
Dim encore As Boolean

encore = True
While encore
encore = False
For i = 1 To n - 1
If data(i) < data(i + 1) Then
tmp = data(i)
data(i) = data(i + 1)
data(i + 1) = tmp

tmp = indice(i)
indice(i) = indice(i + 1)
indice(i + 1) = tmp

encore = True
End If
Next i
Wend
End Sub


Sur cet exmple;, le programme trouve:
Page 1 : 4,3
Page 2 : 5,1,2

C'est à dire 2 pages:
sur la premiere le tableau numero 4 et le numero 3, de hauteur respectives
120 et 60, ce qui avec l'intervalle de 10 donne 120+60+10 = 190 (pour un


max
de 200)

puis sur la page 2, les numeros 5, 1 et 2 c'est à dire:
90+40+18 + 2*10 = 168 (pour le meme max de 200).

J'ai testé sur d'autres cas, ca marche plutot bien :-)

Tout feedback bienvenu :-)

--
Jean-marc Noury (jean_marc_n2)
MVP Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/








Avatar
jm
Non, ce n'est pas un problème.


Jean-marc Noury (jean_marc_n2)
MVP Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/



"Driss HANIB" wrote in message
news:%
question avant de tester :

est ce un problème si je passe les hauteur en single, plutot qu'en long ?

Driss
"Jean-marc" a écrit dans le
message
de news:453d0459$0$21492$
"Driss HANIB" a écrit dans le message de news:

> Bonjour à tous
>
> je cherche à trouver l'ordre optimal d'insertion de cadres de hauteurs
> différentes dans une page.
>
> En détail
>
> sur feuille (ici de format A4, verticale) j'ai défini des marge
> d'entête
> et
> de pied de page entre lesquelles je peux insérer ce que je veux :
> ceci définit donc une hauteur disponible dans laquelle je peux insérer


des
> cadres
>
> mon problème est le suivant
> pour une situation donnée, j'obtiens un nombre N de tableaux à créer


dont
> la
> hauteur est variable et dépend de la situation : chaque tableau a une
> hauteur propre définie par le nombre de lignes de ce tableau, toutes
> les
> lignes étant de hauteur constante.
>
> Exemple :
>
> Tableau 1 : 6 lignes
> Tableau 2 : 5 lignes
> tableau 3 : 10 lignes
> tableau 4 : 5 lignes
> tableau 5 : 7 lignes
>
> ce que je cherche est : si la somme des hauteurs des tableaux est
> supérieure
> à la hauteur disponible (définie plus haut), comment trouver l'ordre


mais
> surtout les indices des tableaux à imprimer pour que le maximum
> d'espace
> soit utilisé ?
> les autres tableaux seont mis (de la même) façon sur la page suivante.
> Il est bien entendu que l'espace entre les tableaux est une constante ;
> considérer donc que je peux définir les hauteurs occpées par chaque
> tableaux.
> D'autre part, l'ordre d'écriture des tableaux n'a aucune importance.
>




Et voila...

Bon, voici un algo qui vaut ce qu'il vaut.
Il ne donne pas la solution optimale dans tous les cas,
mais dans tous les cas il donne une solution raisonnable.

Pour une solution "optimale", il faut implémenter l'algorithme
dit du "sac à dos" (Google "algorithme sac a dos"); une bonne
implémentation est disponible ici:



http://www.enseignement.polytechnique.fr/profs/informatique/Jean-Jacques.Levy/poly/main8/node8.html
A noter que ce problème est NP complet et que pour trouver une solution
optimale il n'y a pas mieux qu'une exploration systématique récursive
avec un temps de calacuil qui croit exponentiellement.

Revenons à ma solution:

L'idée est de trier les hauteurs (et les indices correspondants),
puis on part du plus grand et on ajoute autant de tableaux que possible
en privilégiant les plus grands d'abord (c'est la différence par rapport
à une implémentation du problème du sac à dos).

Voici la chose:
la fonction comande1 contient un simple appel avec des valeurs de test.


NOTE: j'ai programmé ça vite fait, ce n'est pas forcément
très joli mais ça marche en tout cas :-)


Option Explicit

Private Sub Command1_Click()
Dim HPage As Long
Dim Esp As Long
Dim n As Long
Dim h() As Long
Dim s As String
Dim repart() As String
Dim nb_page As Long
Dim i As Long


HPage = 200
Esp = 10
n = 5
ReDim h(n)
h(1) = 40
h(2) = 18
h(3) = 60
h(4) = 120
h(5) = 90

s = GetRepartTableau(n, h(), HPage, Esp)

If s <> "" Then
repart = Split(s, "#")
For i = LBound(repart()) To UBound(repart())
nb_page = nb_page + 1
Debug.Print "Page " & nb_page & " : " & repart(i)
Next i
Else
' un des tableau à lui tout seul est trop grand
MsgBox "souci, tableau trop grand"
End If

End Sub

Public Function GetRepartTableau(n As Long, h() As Long, HPage As Long,


Esp
As Long) As String
Dim t_indice() As Long
Dim t_copy() As Long
Dim i As Long
Dim encore As Boolean
Dim start As Long
Dim cur As Long
Dim hauteur As Long
Dim keep As String
Dim keep2 As String
Dim G_keep As String
Dim G_keep2 As String
Dim nb_used As Long
Dim nb_tab_page As Long

ReDim t_indice(n)
ReDim t_copy(n)
For i = 1 To n
t_indice(i) = i
t_copy(i) = h(i)
Next i
Call ordonne(n, t_indice(), t_copy())

Do
hauteur = 0
encore = True
cur = 1
keep = ""
keep2 = ""
nb_tab_page = 0
Do
If InStr(G_keep, "," & Trim$(Str$(cur)) & ",") = 0 Then
If (hauteur + h(t_indice(cur)) + (nb_tab_page) * Esp) <
HPage Then
hauteur = hauteur + h(t_indice(cur)) + (nb_tab_page)
*
Esp

keep = keep & "," & Trim$(Str$(cur)) & ","
keep2 = keep2 & "," & Trim$(Str$(t_indice(cur))) &
","
cur = cur + 1
nb_used = nb_used + 1
nb_tab_page = nb_tab_page + 1
Else
cur = cur + 1
End If
Else
cur = cur + 1
End If
If cur > n Then
Exit Do
End If
Loop
If hauteur = 0 Then
' un des tableaux est trop
'grand pour tenir même tout seul sur une page
MsgBox "probleme"
GetRepartTableau = ""
Exit Function
Else
G_keep = G_keep & keep & "#"
G_keep2 = G_keep2 & keep2 & "#"
End If
If nb_used = n Then
Exit Do
End If
Loop
G_keep2 = Mid$(G_keep2, 1, Len(G_keep2) - 1)
G_keep2 = Replace(G_keep2, ",,", ",")
G_keep2 = Mid$(G_keep2, 2)
G_keep2 = Mid$(G_keep2, 1, Len(G_keep2) - 1)
G_keep2 = Replace(G_keep2, "#,", "#")
G_keep2 = Replace(G_keep2, ",#", "#")
GetRepartTableau = G_keep2
End Function

Private Sub ordonne(n As Long, indice() As Long, data() As Long)
Dim i As Integer
Dim tmp As Long
Dim encore As Boolean

encore = True
While encore
encore = False
For i = 1 To n - 1
If data(i) < data(i + 1) Then
tmp = data(i)
data(i) = data(i + 1)
data(i + 1) = tmp

tmp = indice(i)
indice(i) = indice(i + 1)
indice(i + 1) = tmp

encore = True
End If
Next i
Wend
End Sub


Sur cet exmple;, le programme trouve:
Page 1 : 4,3
Page 2 : 5,1,2

C'est à dire 2 pages:
sur la premiere le tableau numero 4 et le numero 3, de hauteur
respectives
120 et 60, ce qui avec l'intervalle de 10 donne 120+60+10 = 190 (pour un


max
de 200)

puis sur la page 2, les numeros 5, 1 et 2 c'est à dire:
90+40+18 + 2*10 = 168 (pour le meme max de 200).

J'ai testé sur d'autres cas, ca marche plutot bien :-)

Tout feedback bienvenu :-)

--
Jean-marc Noury (jean_marc_n2)
MVP Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/












Avatar
Driss HANIB
Je viens d'utiliser ton exemple et surtout de le décortiquer (pour
comprendre bien sur)
Et c'est bon sur tous les points. ;o))
j'ai juste remplacé ton keep et G_Keep par un tableau de booléens de même
taille que les tableaux que tu crées et que je mets à jour à chaque
utilisation d'un indice.
Je me suis permis de renommer tes variables pour pouvoir bien comprendre ton
cheminement.

Je vais maisntenant l'insérer dans mon prog et je te tiens au courant


je me permets de te remettre ma version..

Public Function GetRepartTableau(NbLignes As Long, TabHauteurs() As Single,
_
HauteurDispo As Single, Espace As Single)
As String
' variables qui vont contenir une copie des données pour faire le tri
Dim TabIndices() As Single
Dim T_Copy() As Single
Dim TabUtilisés() As Boolean

Dim i As Long
'Dim Encore As Boolean
'Dim Start As Long
Dim Cur As Long ' indice courant
Dim Hauteur As Long ' hauteur de l'ensemble des tableaux
sélectionnés
Dim ChaineTempo As String ' contiendra la liste des indices du tableau
initial pour une page
Dim ChaineFInale As String ' contiendra le séquence des indices séparés par
page..
Dim nb_used As Long ' nombre d'indice déjà utilisés
Dim nb_tab_page As Long

' initialisation et remplissage des tableaux
ReDim TabIndices(NbLignes)
ReDim T_Copy(NbLignes)
ReDim TabUtilisés(NbLignes)
For i = 1 To NbLignes ' remplissage du tableau d'indices
TabIndices(i) = i
T_Copy(i) = TabHauteurs(i) 'recopie des hauteurs

Next i
' tri décroissant des hauteurs
Call ClasseDécroissant(NbLignes, TabIndices(), T_Copy())

Do
Hauteur = 0
' Encore = True
Cur = 1
ChaineTempo = ""
nb_tab_page = 0

Do ' on parcourt les indices de la chaine pour savoir si on l'a déjà
retenue
If TabUtilisés(Cur) = False Then ' non retenue
If (Hauteur + TabHauteurs(TabIndices(Cur)) + (nb_tab_page) *
Espace) < HauteurDispo Then
'on peut le mettre
Hauteur = Hauteur + TabHauteurs(TabIndices(Cur)) +
(nb_tab_page) * Espace ' mise à jour de la hauteur
If ChaineTempo <> vbNullString Then
ChaineTempo = ChaineTempo & ","
End If
ChaineTempo = ChaineTempo & Trim$(Str$(TabIndices(Cur))) ' &
"," ' on garde l'indice du tableau correzspondant
' on met à jour l'utilisation
TabUtilisés(Cur) = True
nb_used = nb_used + 1
nb_tab_page = nb_tab_page + 1
' incrémentation
Cur = Cur + 1

Else ' hauteur trop grand
Cur = Cur + 1
End If
Else ' déjà utilisé
Cur = Cur + 1
End If
If Cur > NbLignes Then
Exit Do
End If
Loop

If Hauteur = 0 Then
' un des tableaux est trop
'grand pour tenir même tout seul sur une page
MsgBox "probleme"
GetRepartTableau = ""
Exit Function
Else
If ChaineFInale <> vbNullString Then
ChaineFInale = ChaineFInale & "#"
End If

ChaineFInale = ChaineFInale & ChaineTempo
End If
If nb_used = NbLignes Then
Exit Do
End If
Loop

GetRepartTableau = ChaineFInale
End Function



Driss

"Jean-marc" a écrit dans le message
de news:453d0459$0$21492$
"Driss HANIB" a écrit dans le message de news:

> Bonjour à tous
>
> je cherche à trouver l'ordre optimal d'insertion de cadres de hauteurs
> différentes dans une page.
>
> En détail
>
> sur feuille (ici de format A4, verticale) j'ai défini des marge d'entête
> et
> de pied de page entre lesquelles je peux insérer ce que je veux :
> ceci définit donc une hauteur disponible dans laquelle je peux insérer


des
> cadres
>
> mon problème est le suivant
> pour une situation donnée, j'obtiens un nombre N de tableaux à créer


dont
> la
> hauteur est variable et dépend de la situation : chaque tableau a une
> hauteur propre définie par le nombre de lignes de ce tableau, toutes les
> lignes étant de hauteur constante.
>
> Exemple :
>
> Tableau 1 : 6 lignes
> Tableau 2 : 5 lignes
> tableau 3 : 10 lignes
> tableau 4 : 5 lignes
> tableau 5 : 7 lignes
>
> ce que je cherche est : si la somme des hauteurs des tableaux est
> supérieure
> à la hauteur disponible (définie plus haut), comment trouver l'ordre


mais
> surtout les indices des tableaux à imprimer pour que le maximum d'espace
> soit utilisé ?
> les autres tableaux seont mis (de la même) façon sur la page suivante.
> Il est bien entendu que l'espace entre les tableaux est une constante ;
> considérer donc que je peux définir les hauteurs occpées par chaque
> tableaux.
> D'autre part, l'ordre d'écriture des tableaux n'a aucune importance.
>




Et voila...

Bon, voici un algo qui vaut ce qu'il vaut.
Il ne donne pas la solution optimale dans tous les cas,
mais dans tous les cas il donne une solution raisonnable.

Pour une solution "optimale", il faut implémenter l'algorithme
dit du "sac à dos" (Google "algorithme sac a dos"); une bonne
implémentation est disponible ici:



http://www.enseignement.polytechnique.fr/profs/informatique/Jean-Jacques.Levy/poly/main8/node8.html
A noter que ce problème est NP complet et que pour trouver une solution
optimale il n'y a pas mieux qu'une exploration systématique récursive
avec un temps de calacuil qui croit exponentiellement.

Revenons à ma solution:

L'idée est de trier les hauteurs (et les indices correspondants),
puis on part du plus grand et on ajoute autant de tableaux que possible
en privilégiant les plus grands d'abord (c'est la différence par rapport
à une implémentation du problème du sac à dos).

Voici la chose:
la fonction comande1 contient un simple appel avec des valeurs de test.


NOTE: j'ai programmé ça vite fait, ce n'est pas forcément
très joli mais ça marche en tout cas :-)


Option Explicit

Private Sub Command1_Click()
Dim HPage As Long
Dim Esp As Long
Dim n As Long
Dim h() As Long
Dim s As String
Dim repart() As String
Dim nb_page As Long
Dim i As Long


HPage = 200
Esp = 10
n = 5
ReDim h(n)
h(1) = 40
h(2) = 18
h(3) = 60
h(4) = 120
h(5) = 90

s = GetRepartTableau(n, h(), HPage, Esp)

If s <> "" Then
repart = Split(s, "#")
For i = LBound(repart()) To UBound(repart())
nb_page = nb_page + 1
Debug.Print "Page " & nb_page & " : " & repart(i)
Next i
Else
' un des tableau à lui tout seul est trop grand
MsgBox "souci, tableau trop grand"
End If

End Sub

Public Function GetRepartTableau(n As Long, h() As Long, HPage As Long,


Esp
As Long) As String
Dim t_indice() As Long
Dim t_copy() As Long
Dim i As Long
Dim encore As Boolean
Dim start As Long
Dim cur As Long
Dim hauteur As Long
Dim keep As String
Dim keep2 As String
Dim G_keep As String
Dim G_keep2 As String
Dim nb_used As Long
Dim nb_tab_page As Long

ReDim t_indice(n)
ReDim t_copy(n)
For i = 1 To n
t_indice(i) = i
t_copy(i) = h(i)
Next i
Call ordonne(n, t_indice(), t_copy())

Do
hauteur = 0
encore = True
cur = 1
keep = ""
keep2 = ""
nb_tab_page = 0
Do
If InStr(G_keep, "," & Trim$(Str$(cur)) & ",") = 0 Then
If (hauteur + h(t_indice(cur)) + (nb_tab_page) * Esp) <
HPage Then
hauteur = hauteur + h(t_indice(cur)) + (nb_tab_page) *
Esp

keep = keep & "," & Trim$(Str$(cur)) & ","
keep2 = keep2 & "," & Trim$(Str$(t_indice(cur))) & ","
cur = cur + 1
nb_used = nb_used + 1
nb_tab_page = nb_tab_page + 1
Else
cur = cur + 1
End If
Else
cur = cur + 1
End If
If cur > n Then
Exit Do
End If
Loop
If hauteur = 0 Then
' un des tableaux est trop
'grand pour tenir même tout seul sur une page
MsgBox "probleme"
GetRepartTableau = ""
Exit Function
Else
G_keep = G_keep & keep & "#"
G_keep2 = G_keep2 & keep2 & "#"
End If
If nb_used = n Then
Exit Do
End If
Loop
G_keep2 = Mid$(G_keep2, 1, Len(G_keep2) - 1)
G_keep2 = Replace(G_keep2, ",,", ",")
G_keep2 = Mid$(G_keep2, 2)
G_keep2 = Mid$(G_keep2, 1, Len(G_keep2) - 1)
G_keep2 = Replace(G_keep2, "#,", "#")
G_keep2 = Replace(G_keep2, ",#", "#")
GetRepartTableau = G_keep2
End Function

Private Sub ordonne(n As Long, indice() As Long, data() As Long)
Dim i As Integer
Dim tmp As Long
Dim encore As Boolean

encore = True
While encore
encore = False
For i = 1 To n - 1
If data(i) < data(i + 1) Then
tmp = data(i)
data(i) = data(i + 1)
data(i + 1) = tmp

tmp = indice(i)
indice(i) = indice(i + 1)
indice(i + 1) = tmp

encore = True
End If
Next i
Wend
End Sub


Sur cet exmple;, le programme trouve:
Page 1 : 4,3
Page 2 : 5,1,2

C'est à dire 2 pages:
sur la premiere le tableau numero 4 et le numero 3, de hauteur respectives
120 et 60, ce qui avec l'intervalle de 10 donne 120+60+10 = 190 (pour un


max
de 200)

puis sur la page 2, les numeros 5, 1 et 2 c'est à dire:
90+40+18 + 2*10 = 168 (pour le meme max de 200).

J'ai testé sur d'autres cas, ca marche plutot bien :-)

Tout feedback bienvenu :-)

--
Jean-marc Noury (jean_marc_n2)
MVP Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/








Avatar
Jean-marc
>"Driss HANIB" a écrit dans le message de news:




<réponse inline>

Je viens d'utiliser ton exemple et surtout de le décortiquer (pour
comprendre bien sur)



C'est la bonne démarche :-)

Et c'est bon sur tous les points. ;o))



Content que ça fonctionne pour toi :-)

j'ai juste remplacé ton keep et G_Keep par un tableau de booléens de même
taille que les tableaux que tu crées et que je mets à jour à chaque
utilisation d'un indice.



C'est tout à fait judicieux! J'ai utilisé g_keep par pure fainéantise :o)
La méthode que tu emploies est la meilleure et la plus accadémique.

Je me suis permis de renommer tes variables pour pouvoir bien comprendre
ton
cheminement.
Je vais maisntenant l'insérer dans mon prog et je te tiens au courant



super, merci par avance!


je me permets de te remettre ma version..




<snip le (très bon) code>

Juste une minuscule remarque si tu veux bien: on préfère en
général éviter d'utiliser des caractères accentués dans les
noms de variables ( TabUtilisés() ), entre autre par ce que
ce n'est pas très lisible mais surtout par ce qu'il n'y a
pas d'accents sur les claviers qwerty.

En dehors de ce détail, l'adaptation m'à l'air parfaite :-)

--
Jean-marc Noury (jean_marc_n2)
MVP Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Patrice Henrio
je me permets une remarque de puriste sur les booléens (cheval de bataille
depuis 20 ans)

If TabUtilisés(Cur) = False Then

devrait s'écrire

If not(TabUtilisés(Cur)) Then

A plus ....

"Jean-marc" a écrit dans le message
de news: 453e4df0$0$31475$
>"Driss HANIB" a écrit dans le message de news:
>

<réponse inline>

Je viens d'utiliser ton exemple et surtout de le décortiquer (pour
comprendre bien sur)



C'est la bonne démarche :-)

Et c'est bon sur tous les points. ;o))



Content que ça fonctionne pour toi :-)

j'ai juste remplacé ton keep et G_Keep par un tableau de booléens de même
taille que les tableaux que tu crées et que je mets à jour à chaque
utilisation d'un indice.



C'est tout à fait judicieux! J'ai utilisé g_keep par pure fainéantise :o)
La méthode que tu emploies est la meilleure et la plus accadémique.

Je me suis permis de renommer tes variables pour pouvoir bien comprendre
ton
cheminement.
Je vais maisntenant l'insérer dans mon prog et je te tiens au courant



super, merci par avance!


je me permets de te remettre ma version..




<snip le (très bon) code>

Juste une minuscule remarque si tu veux bien: on préfère en
général éviter d'utiliser des caractères accentués dans les
noms de variables ( TabUtilisés() ), entre autre par ce que
ce n'est pas très lisible mais surtout par ce qu'il n'y a
pas d'accents sur les claviers qwerty.

En dehors de ce détail, l'adaptation m'à l'air parfaite :-)

--
Jean-marc Noury (jean_marc_n2)
MVP Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/








1 2