Bonjour à tous,


Voici mes données de départ
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
Algorithme:
# 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

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;
}
Mon algorithme est-il correct?
Pourriez-vous m'aider à améliorer ce début de code?

J'ai aussi un problème avec le grep
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;
Je voudrais sélectionner 5 et 2 qui sont associés à 12.


Merci pour votre aide,


Jasmine,