École de technologie supérieure INF-130 Travail pratique #2 Travail en équipe Prospection et exploration minière Par : Frédérick Henri Utilisé par : David Beaulieu, Frédérick Henri, Hugues Saulnier et Éric Thé Remise à la 9 e semaine 1 Objectifs - Se familiariser avec le langage Visual Basic for Applications d Excel. - Utiliser l ensemble des notions présentées à présent : les variables, les instructions conditionnelles et itératives, les entrées/sorties, le découpage en sous-programmes, les tableaux à une ou plusieurs dimensions, etc. - Respecter les exigences de programmation : l indentation, l utilisation de constantes, l ajout de commentaires, etc. 2 Description du problème : Prospection et exploration minière Imaginez que vous possédiez un terrain de 50 x 40 km et que vous ayez de bonnes raisons de croire qu il s y trouve de l or (ou un autre métal précieux). Sachant que : 1) le sondage d une superficie d un kilomètre carré servant à déterminer la quantité de minerai qui s y trouve coûte 50 000 $; 2) l extraction du minerai sur une superficie d un kilomètre carré coûte 2 000 000 $; où devriez-vous sonder et creuser afin de maximiser vos profits ou minimiser vos pertes? Afin de répondre à cette question, on vous demande de développer une application servant à tester un algorithme de prospection minière. Celle-ci doit accomplir deux tâches principales : a) générer un terrain (où se trouve possiblement un minerai pouvant être miné); b) utiliser un algorithme de prospection et évaluer les profits ou les pertes encourues. 2.1 Génération du terrain L application conserve le sous-sol minier d un terrain à l aide d un tableau à deux dimensions. Chaque case du tableau correspond à une parcelle de terrain d un kilomètre carré et conserve la valeur du minerai qui s y trouve. Afin de faciliter la visualisation du terrain à l écran, l application utilise les codes de couleur suivants : - une case ne contenant aucun minerai est colorée en blanc; INF-130 Ordinateurs et programmation Automne 2015 / Page 1
- une case contenant du minerai, mais insuffisamment pour que celle-ci vaille la peine d être exploitée (2 050 000 $ ou moins) est colorée en jaune plus ou moins foncé, selon la valeur du minerai; - une case qui vaut la peine d être exploitée (plus de 2 050 000 $) est colorée en orange plus ou moins foncé, selon la valeur du minerai; - une case qui est considérée comme étant riche (6 150 000 $ ou plus) est colorée en rouge. La figure qui suit offre un exemple de terrain généré par l application. Figure 1 Carte des gisements miniers 2.2 Prospection du terrain L algorithme de prospection permet de décider où il faut effectuer les sondages. Selon les informations qu il obtient, il détermine si on doit sonder le terrain à d autres endroits. Finalement, lorsqu il a terminé les sondages, il fore à tous les endroits où il y a une valeur de plus de 2 050 000 $. Afin d indiquer à l utilisateur où l algorithme a décidé de sonder et de forer, l application : a) encadre une case qui a été sondée; b) ajoute une croix dans une case où l on doit extraire le minerai (case à forer). La figure qui suit offre un exemple de terrain où l on voit la carte de prospection. INF-130 Ordinateurs et programmation Automne 2015 / Page 2
Figure 2 Carte des gisements miniers et carte d exploration minière 3 Description de l application L application que vous devez développer comporte les 6 modules ci-dessous : 1. module_excel : ce module offre des sous-programmes servant à modifier le contenu de l unique feuille Excel. Il vous est offert et vous ne devez pas le modifier. 2. module_constantes : ce module ne contient que trois constantes. Il vous est offert et vous ne devez pas le modifier. 3. module_utilitaires : ce module offre quelques fonctions utiles qui servent fréquemment dans plusieurs sous-programmes. 4. module_terrain : ce module offre des sous-programmes permettant de générer un terrain (une carte des gisements miniers). 5. module_prospection : ce module offre deux sous-programmes publics servant respectivement à générer une carte de prospection et à évaluer les revenus associés à une carte de prospection. Il possède plusieurs sous-programmes privés. 6. module_principal : ce module offre cinq procédures publiques associées aux boutons de la feuille Excel. Il possède lui aussi plusieurs sous-programmes privés. INF-130 Ordinateurs et programmation Automne 2015 / Page 3
L application comporte également une feuille Excel nommée «Interface» qui vous est offerte et dont voici l apparence. Figure 3 Interface utilisateur La figure qui suit illustre l interaction entre les modules et la feuille Excel. Figure 4 - Interaction entre les modules et la feuille INF-130 Ordinateurs et programmation Automne 2015 / Page 4
4 Description des modules à compléter 4.1 Description du module module_utilitaires En plus de la fonction nb_aleatoire qui vous est offerte, ce module contient les deux sousprogrammes publics suivant : - somme_tab_2d : cette fonction reçoit un tableau à deux dimensions d entiers et retourne la somme des valeurs de tous les éléments du tableau. - nb_occurrences_tab_2d : cette fonction reçoit un tableau à deux dimensions d entiers ainsi qu un nombre entier. Elle retourne le nombre de fois que l entier reçu est présent dans le tableau. 4.2 Description du module module_terrain Ce module contient trois fonctions publiques permettant de générer un terrain : - creer_terrain_uniforme : cette fonction reçoit une valeur de minerai exprimée en milliers de dollars (donc, telle que 1 représente en fait 1000 $). Elle crée un nouveau terrain (un tableau dynamique à deux dimensions d entiers longs de 50 lignes et 40 colonnes) et assigne la valeur reçue en paramètre à chacun des éléments du tableau et retourne ce tableau. - creer_terrain_aleatoire : cette fonction reçoit une valeur de minerai minimal et une valeur de minerai maximal. Elle crée un nouveau terrain (un tableau dynamique à deux dimensions d entiers longs de 50 lignes et 40 colonnes) et assigne à chaque case du tableau une valeur aléatoire dans l intervalle délimité par les deux bornes reçues en paramètre et retourne le tableau. - creer_terrain_en_veines : cette fonction reçoit deux paramètres, soit le nombre de veines à créer et la valeur d une veine. Elle crée un nouveau terrain (un tableau dynamique à deux dimensions d entiers longs de 50 lignes et 40 colonnes) et y ajoute le nombre de veines demandées, chacune de la valeur spécifiée, et retourne ce tableau. Notez que l ajout d une veine à la fois se fait à l aide de la procédure privée ajouter_aleatoirement_veine qu il vaut mieux coder d abord. Voici la procédure privée nécessaire à la fonction creer_terrain_en_veines : - ajouter_aleatoirement_veine : cette procédure privée reçoit un terrain (un tableau à deux dimensions d entiers longs de 50 lignes et 40 colonnes) et une valeur de minerai. Elle débute en choisissant aléatoirement un élément (l, c) du tableau qui ne se trouve ni sur la dernière ligne, ni sur la dernière colonne. Cet élément correspond au coin supérieur gauche d un carré 2 x 2 où s effectuera l ajout de minerai. Ensuite, tant qu on n a pas ajouté dans le tableau une quantité totale de minerai égal à la valeur reçue en paramètre on répète ces deux étapes : on ajoute +1 dans chacune des cases du carré (l, c), (l + 1, c), (l, c + 1) et (l +1, c +1); dans 1 % des cas, on déplace aléatoirement d une case le coin supérieur gauche du carré 2 x 2 en s assurant que ce nouveau carré demeure à l intérieur du terrain. INF-130 Ordinateurs et programmation Automne 2015 / Page 5
4.3 Description du module module_prospection Ce module contient sept sous-programmes privés et deux sous-programmes publics : - carte_prospection_vierge : cette fonction privée reçoit la hauteur et la largeur de la carte de prospection à créer (le nombre de lignes et de colonnes). Elle crée une carte de prospection (un tableau dynamique à deux dimensions d entiers possédant le nombre de lignes et de colonnes spécifiées en paramètres) et assigne à chacun des éléments du tableau la valeur -1 qui correspond à une case non sondée et retourne ce tableau. - effectuer_premiers_sondages : cette procédure privée reçoit une carte de prospection. Elle choisit des cases à sonder à l aide d un algorithme laissé à votre discrétion. Chaque case sondée par l algorithme est prise en note dans la carte de prospection en recevant la valeur 1 qui correspond à une case sondée. - sonder_cases_voisines : cette procédure privée reçoit une carte de prospection, un indice de ligne l, un indice de colonne c et une distance d. Elle sonde (inscrit la valeur 1) les 8 cases situées à une distance d de la case (l, c). Elle s assure de ne pas écrire à l extérieur du tableau. Les figures qui suivent illustrent la tâche accomplie par la procédure. 1) On sonde les 8 cases voisines de (2, 2) à une distance de 1. 1 2 3 4 5 1 2 3 4 5 1????? 1 1 1 1?? 2? 1??? 2 1 1 1?? 3????? 3 1 1 1?? 4????? 4????? 5????? 5????? 2) On sonde les 8 cases voisines de (3, 3) à une distance de 2. 1 2 3 4 5 1 2 3 4 5 1????? 1 1? 1? 1 2????? 2????? 3?? 1?? 3 1? 1? 1 4????? 4????? 5????? 5 1? 1? 1 - sonder_autour_cases_prometteuses : cette procédure privée reçoit un terrain et une carte de prospection. Elle parcourt la carte de prospection et pour chacune des cases sondées, si la case correspondante dans le terrain contient une valeur de minerai jugée suffisante, elle sonde les cases voisines à deux cases de distance à l aide de la procédure sonder_cases_voisines. Assurez-vous d utiliser une copie de la carte de prospection quand vous sondez les cases voisines. Une fois terminée, cette copie remplacera l ancienne carte de prospection retournée par INF-130 Ordinateurs et programmation Automne 2015 / Page 6
référence. Notez que l évaluation de ce qu est une valeur de minerai suffisante est laissée à votre discrétion. - sonder_autour_cases_rentables : cette procédure privée reçoit un terrain et une carte de prospection. Elle parcourt la carte de prospection et pour chacune des cases sondées, si la case correspondante dans le terrain contient une valeur de minerai supérieur au seuil de rentabilité (2 050), elle sonde les cases voisines à une distance de 1 avec sonder_cases_voisines. Veuillez utiliser une copie de la carte de prospection quand vous sondez les cases voisines. - effectuer_forages : cette procédure privée reçoit un terrain et une carte de prospection. Elle parcourt la carte de prospection et pour chacune des cases sondées, si la case correspondante dans le terrain contient une valeur de minerai supérieur au seuil de rentabilité (2 050), on inscrit 2 dans la carte de prospection pour indiquer qu il faut forer dans cette case. - nb_cases_sondees_rentables : cette fonction privée reçoit un terrain et une carte de prospection. Elle parcourt la carte de prospection et compte le nombre de cases sondées telles que la case correspondante dans le terrain contient une valeur de minerai supérieur au seuil de rentabilité (2 050). On retourne ce nombre représentant le nombre de cases jugées rentables. - carte_prospection_terrain : cette fonction publique reçoit un terrain. Elle crée une nouvelle carte de prospection vierge de la même dimension que le terrain reçu. Elle effectue ensuite trois étapes de sondages : les premiers sondages, les sondages autour des cases prometteuses et enfin les sondages autour des cases qui sont rentables. Il est à noter que l on répète l étape des sondages autour des cases rentables tant et aussi longtemps que ceux-ci permettent de trouver de nouvelles cases rentables (c.-à-d. augmente le nombre de cases rentables). Elle se termine en forant l ensemble des cases rentables et en retournant la carte de prospection ainsi produite. - revenus_des_cases_forees : cette fonction publique reçoit un terrain et une carte de prospection. Elle retourne la somme des valeurs de toutes les cases dans le terrain qui doivent être forées en vertu de la carte de prospection. 4.4 Description du module module_principal En plus des cinq procédures publiques associées aux boutons de la feuille Excel, ce module contient cinq sous-programmes privés. - dessiner_carte_gisements : cette procédure privée reçoit un terrain et le dessine dans la feuille Excel «Interface» à l aide des sous-programmes du module module_excel. - dessiner_carte_prospection : cette procédure privée reçoit une carte de prospection et la dessine dans la feuille Excel «Interface» à l aide des sous-programmes du module module_excel. Elle entoure les cases sondées et ajoute une croix dans les cases forées. - profit_maximal_theorique : cette fonction privée reçoit un terrain et retourne le profit maximal théorique qu il est possible de réaliser si l on fore dans ce terrain. Le profit théorique maximal se calcule en faisant la somme des valeurs des cases dont la valeur du minerai est supérieure au seuil de rentabilité (2 050) et en soustrayant 2 050 pour chacune des cases INF-130 Ordinateurs et programmation Automne 2015 / Page 7
identifiées. En d autres termes, c est le profit que l on obtient si l on ne sonde et que l on ne fore que les cases rentables. - afficher_statistiques_essai : cette procédure privée reçoit un terrain et une carte de prospection. Elle calcule l ensemble des données à inscrire dans les sections «Informations sur le terrain» et «Informations sur la prospection» (par exemple : la valeur totale du minerai, le profit maximal théorique, le nombre de cases sondées, etc.) et inscrit ces valeurs dans la feuille Excel à l aide des sous-programmes du module module_excel. - realiser_prospection_terrain : cette procédure privée reçoit un terrain. Elle réalise la prospection du terrain reçu, elle dessine le terrain ainsi que la carte de prospection à l écran et elle met à jour les informations sur le terrain et la prospection. - essai_terrain_aleatoirement_pauvre, essai_terrain_uniformement_riche, essai_terrain_1_veine, essai_terrain_5_veines : ces quatre procédures publiques n attendent aucun paramètre et sont très semblables. Elles créent toutes un nouveau terrain et réalisent ensuite la prospection de ce terrain à l aide de realiser_prospection_terrain. essai_terrain_aleatoirement_pauvre crée un terrain aléatoire où chaque case contient une valeur entre 0 et 1000. essai_terrain_uniformement_riche crée un terrain où chaque case contient exactement la valeur 6 150. Les procédures essai_terrain_1_veine et essai_terrain_5_veines créent respectivement un terrain contenant une veine et cinq veines de 153 750 000 $ chacune. - simulation_terrain_a_5_veines : cette procédure publique effectue mille fois la création et la prospection d un terrain à cinq veines de 153 750 000 $ chacune. On fait la somme des profits des mille essais et on affiche le profit moyen. Notez que cette procédure n affiche aucun terrain et aucune carte de prospection, on affiche seulement une boîte de message avec le profit moyen. BONUS : cette procédure évalue la performance de votre algorithme de prospection. Les équipes qui réussiront à obtenir un profit moyen d au moins 36 000 000 $ obtiendront 5 points bonis (la note maximale restera 100). 5 Ordre de développement suggéré Commencez par écrire les module_utilitaires et module_terrain. Ensuite, codez une version partielle et simplifiée des procédures essai_unique_terrain_presque_vide, essai_unique_terrain_uniformement_riche, essai_unique_terrain_1_veine et essai_unique_terrain_5_veines en vous limitant simplement à la création et à l affichage du terrain (grâce à la procédure dessiner_carte_gisements), sans tenter de réaliser la prospection. La création du terrain étant validée, écrivez le module_prospection et complétez le module_principal en suivant l ordre de présentation de la section 4. 6 Contraintes de l'enseignant Votre programme devra respecter les contraintes suivantes : INF-130 Ordinateurs et programmation Automne 2015 / Page 8
Il devra respecter les exigences de remise des travaux pratiques. Il ne devra contenir aucune variable globale. La présence d une variable globale entraînera la perte de 25 % des points. Il ne devra contenir aucun Goto. Chaque Goto entraînera la perte de 10 % des points. Vous devez imprimer tous les modules à l exception des modules module_constantes et module_excel. Une partie qui n'est pas imprimée n'est pas corrigée et se voit attribuer la note 0. En cas de doute, n hésitez pas à consulter votre enseignant. BON TRAVAIL! INF-130 Ordinateurs et programmation Automne 2015 / Page 9