Bonjour à tous,
Voici mes données de départ
Algorithme:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 my %H_Bact = ( 'Bact1' => [1, 2, 3, 4], 'Bact2' => [5, 6], 'Bact3' => [7, 8, 9, 10, 11], 'Bact4' => [12], ); my @A_MauvaisesCombinaisons = qw[5-12 1-9 2-12 4-5 1-5]; # Recherche les numéros par bactérie en évitant les mauvaises combinaisons # Il faut favoriser les numéros des bactéries les moins représentées # par exemple, il faut aboslument garder n°12 qui est unique # GARDER AU MOINS UN NUMERO PAR BACTERIE # NE PAS OUBLIER LES CAS SANS SOLUTION OU CERTAINES BACTERIES NE PEUVENT PAS AVOIR DE NUMERO A CAUSE DE CONFLITS # ici on doit trouver 12, 6, [7-8-10-11], 3
# 1) On recherche la bactérie ayant le moins de combinaisons
# 2-3) On regarde dans la liste des mauvaises combinaisons les numéros à supprimer chez les autres bactéries dans %H_Bact
# 4) On retire ces mauvaises combinaisons de @A_MauvaisesCombinaisons
dans cet exemple :
# 1) on sélectionne Bact4
# 2) mauvaises combinaisons : 5-12 2-12 2-12
# 3) retirer 5 et 2 ches les bactéries correspondantes dans %H_Bact
# 4) on retire les mauvaises combianisons de @A_MauvaisesCombinaisons
# 1) on sélectionne Bact2 chez qui il ne reste que le numéro 6
# 2) mauvaises combinaisons : aucune
# 1) on sélectionne le numéro 1 de Bact1 (chez qui il reste 1, 3 et 4)
# 2) mauvaises combinaisons : 1-9 (1-5 ayant déjàé été enlevée)
# 3) retirer 9 dans %H_Bact
# 4) on retire la mauvaise combianison de @A_MauvaisesCombinaisons
# 1) ON NE SELECTIONNE PAS 3 DE BACT1 MAIS ON PASSE A BACT3
# - pour augmenter la probabilité d'avoir au moins un numéro par bactérie
# - après avoir faire tous le tour des bactéries, on revient aux numéros qui n'ont pas encore été testés
#...
# jusqu'à ce que @A_MauvaisesCombinaisons soit vide
Début de mon code
Mon algorithme est-il correct?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 use strict; use warnings; use Statistics::Lite qw(:all); my %H_Bact = ( 'Bact1' => [1, 2, 3, 4], 'Bact2' => [5, 6], 'Bact3' => [7, 8, 9, 10, 11], 'Bact4' => [12], ); my @A_MauvaisesCombinaisons = qw[5-12 1-9 2-12 4-5 1-5]; #while(@A_MauvaisesCombinaisons !=0) for(my $i=0; $i<4; $i++) { # 1) On recherche la bactérie ayant le moins de combinaisons #-------------------------------------------------------------- # Creation d'un hash contenant la taille clé : taille array, valeur : bact (peu importe si on écrase une des bactéries) my %H_Tailles; # Creation d'un array contenant la liste des différentes tailles my @A_Tailles; foreach (keys %H_Bact) { $H_Tailles{@{$H_Bact{$_}}}=$_; push(@A_Tailles, @{$H_Bact{$_}}); }; # recherche de la taille la plus petite my $TailleArrayBact = min (@A_Tailles); # Bactérie dont le nombre de numéros est le plus petit my $Bact = $H_Tailles{$TailleArrayBact}; # on prend le premier numéro de l'array my $NumBact = ${$H_Bact{$Bact }}[0]; # 2) On regarde dans la liste des mauvaises combinaisons les numéros à supprimer chez les autres bactéries dans %H_Bact #------------------------------------------------------------------------------------------------------------------------- # Liste des numéros à supprimer my @A_SelectMauvCombi = grep { $_ =~ /^$NumBact-| $NumBact$/ } @A_MauvaisesCombinaisons; # Liste des numéros à garder (pour le cycle suivant) @A_MauvaisesCombinaisons = grep { $_ !~ /^$NumBact-| $NumBact$/ } @A_MauvaisesCombinaisons; print "$Bact\t$NumBact\n"; map{print $_."\n";}@A_SelectMauvCombi; }
Pourriez-vous m'aider à améliorer ce début de code?
J'ai aussi un problème avec le grep
Je voudrais sélectionner 5 et 2 qui sont associés à 12.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 my $NumBact = 12; my @A_MauvaisesCombinaisons = qw[5-12 1-9 2-12 4-5 1-5]; my @A_SelectMauvCombi = grep { $_ =~ /[ -]$NumBact[ -]/ } @A_MauvaisesCombinaisons; map{print $_."\n";}@A_SelectMauvCombi;
Merci pour votre aide,
Jasmine,
Partager