Salut tout le monde, je renvoie une version corrigée du script de présimulation pour le cantonnement année (il y avait un petit problème quand on faisait un cantonnment engin-spécifique). J'ajoute également un script de présimulation pour des changements de paramètre controlable, éventuellement spatialisé et saisonnalisé. Elle a l'air de marcher (en tout cas pour les simus que j'ai fait), mais je garantie rien Bonne chance Hilaire PS: j'ai égalent mis les fichiers sur la zone simulateur I:\logiciel\ISIS-Fish\Isis-fish-2.0.7\NllesMesuresGestion -- Hilaire Drouineau IFREMER, département EMH Centre de Nantes - BP 21105 - 44311 Nantes Cedex 3 tel : +33 (0)2 40 37 43 06 - fax : +33 (0)2 40 37 40 75 email : hilaire.drouineau@ifremer.fr - web : http://www.ifremer.fr ***************************************************************** //attention: cette règle de gestion ne fonctionne que si la fermeture a lieu pour toutes //les années de simulation var nomZone="VIIIa"; //entrez le nom de la zone fermée, non si pas de sélection sur zone var engin="chalut jumeau"; var moisDeb=0; //entrez le mois debut de fermeture var moisFin=11;//entrez le mois de fin de fermeture var nouvelleValeurParam="100";//entrez la valeur du paramètre contrôlable if (nomZone!="non") { var ZoneFermee=SecteurFactory.findByNom(nomZone); } var EnginInterdit=EnginFactory.findByNom(engin); writeln("nom de l'engin interdit "+EnginInterdit.getNom()); var RegionSimu=EnginInterdit.getRegion(); var ListeMetiers=MetierFactory.findAllByRegion(RegionSimu); var MoisDeb=new Packages.fr.ifremer.nodb.Mois(moisDeb); var MoisFin=new Packages.fr.ifremer.nodb.Mois(moisFin); var SaisonFermee= new Packages.fr.ifremer.nodb.Saison(moisDeb,moisFin); for (var imetier = ListeMetiers.iterator() ; imetier.hasNext();){ var metier=imetier.next(); writeln ("metier examiné "+metier.getNom()+"son engin "+metier.getEngin().getNom()); if (!metier.getEngin().equals(EnginInterdit)){ writeln("l engin du métier n est pas concerné"); } else { writeln("l engin du métier est bien concerné"); if (nomZone=="non" && moisDeb==0 && moisFin==11){ //aucun critère spatio-temporel il suffit donc de mettre //le param controlable à la nouvelle valeur metier.setValeurParamControlable(nouvelleValeurParam); writeln("aucune spatialisation ni saisonnalité, on passe le Param Controlable a "+nouvelleValeurParam); } else { var ListeSaisons = metier.getInfoSaison(); for (var isaisonmetier = ListeSaisons.iterator() ; isaisonmetier.hasNext();){ var saisonmetier=isaisonmetier.next(); var saison=saisonmetier.getSaison(); var taille=0; if (nomZone!="non"){ var maillefermee=ZoneFermee.getMaille(); var MailleMetier=saisonmetier.getSecteur().getMaille().copy(); MailleMetier.retainAll(maillefermee); taille=MailleMetier.size(); } else { writeln ("pas de sélection de zone, toute la zone d'étude est donc concernée"); } if (nomZone=="non" || taille!=0){ if (saison.contains(SaisonFermee)){ writeln ("il y a intersection de la zone metier au cours de la saison"+saison.toString()); var moisconcerne=saison.copy().toListMois(); moisconcerne.retainAll(SaisonFermee.toListMois()); var NouveauMetier=MetierFactory.create(metier.getNom()+" Mois "+moisconcerne.get(0).getNumMois()+" a "+moisconcerne.get(moisconcerne.size()-1).getNumMois()+" ValeurParam "+nouvelleValeurParam, RegionSimu, EnginInterdit,nouvelleValeurParam, "métier créé pendant la simu pour le changement de paramètre contrôlable"); for (var iinfsais=metier.getInfoSaison().iterator();iinfsais.hasNext();){ var infsais=iinfsais.next(); var sais=infsais.getSaison(); var NouveauInfoSaison=InfoSaisonMetierFactory.create(NouveauMetier, sais, infsais.getSecteur(), "créé durant la simulation") NouveauMetier.addInfoSaison(NouveauInfoSaison); } //On ajoute aux strategies qui pratiquent le métier le nouveau métier var listestrategies=StrategyFactory.findAllByRegion(RegionSimu); for(var i=0; i<listestrategies.size(); i++){ var strategie=listestrategies.get(i); var SetOfBateau=strategie.getSetOfVessels(); var MetiersPosibles=SetOfBateau.getMetiers(); if (MetiersPosibles.contains(metier)){ var AncienEffort=SetOfBateau.getEffort(metier); var DescriptionEffort=EffortDescriptionFactory.create(NouveauMetier, SetOfBateau, AncienEffort.getFishingOperation(), AncienEffort.getFishingOperationDuration(), AncienEffort.getGearsNumberPerOperation(), AncienEffort.getCrewSize(), AncienEffort.getUnitCostOfFishing(), AncienEffort.getFixedCrewSalary(), AncienEffort.getCrewShareRate(), AncienEffort.getCrewFoodCost(), AncienEffort.getRepairAndMaintenanceGearCost(), AncienEffort.getLandingCosts(), AncienEffort.getOtherRunningCosts(), "effort description créé durant la simulation"); SetOfBateau.addPossibleMetiers(DescriptionEffort); //on a ajouté le nouveau métier au set of vessels, maintenant, on va reporté l'effort du métier ancien vers le nouveau pour les mois concernés for (var intmois=0; intmois<=11;intmois++){ var mois=new Packages.fr.ifremer.nodb.Mois(intmois); var PropStratMois=strategie.getStrategyMonthInfo(mois); var NouveauStrMet=PropStrMetFactory.create(PropStratMois, NouveauMetier, 0, "créé durant la simulation"); PropStratMois.addPropStrMet(NouveauStrMet); if (moisconcerne.contains(mois) && PropStratMois.getProportionMetier(metier)!=0){ //on créé un nouveau PropStrMet writeln ("la stratégie "+strategie.getName()+" pratique bien le metier "+metier.getNom()+" au mois "+mois.getNumMois()); PropStratMois.setProportionMetier(NouveauMetier,PropStratMois.getProportionMetier(metier)); PropStratMois.setProportionMetier(metier,0); } } } } } } } } } } //attention: cette règle de gestion ne fonctionne que si la fermeture a lieu pour toutes //les années de simulation var nomZone="VIIIa"; //entrez le nom de la zone fermée var engin="non";//entrez le nom de l'engin fermée ou non si pas de sélection sur engin var moisDeb=0; //entrez le mois debut de fermeture var moisFin=11;//entrez le mois de fin de fermeture var ZoneFermee=SecteurFactory.findByNom(nomZone); if (engin!="non") {var EnginInterdit=EnginFactory.findByNom(engin);} var RegionSimu=ZoneFermee.getRegion(); var ListeMetiers=MetierFactory.findAllByRegion(RegionSimu); var MoisDeb=new Packages.fr.ifremer.nodb.Mois(moisDeb); var MoisFin=new Packages.fr.ifremer.nodb.Mois(moisFin); var SaisonFermee= new Packages.fr.ifremer.nodb.Saison(moisDeb,moisFin); var metChomage = MetierFactory.findByKey("nonActivite", RegionSimu); for (var imetier = ListeMetiers.iterator() ; imetier.hasNext();){ var metier=imetier.next(); writeln ("metier examiné "+metier.getNom()); if ((!metier.getEngin().equals(EnginInterdit)) && engin!="non"){ writeln("l engin du métier n est pas concerné"); } else { writeln("l engin du métier est bien concerné"); var ListeSaisons = metier.getInfoSaison(); for (var isaisonmetier = ListeSaisons.iterator() ; isaisonmetier.hasNext();){ var saisonmetier=isaisonmetier.next(); var maillefermee=ZoneFermee.getMaille(); var MailleMetier=saisonmetier.getSecteur().getMaille().copy(); MailleMetier.retainAll(maillefermee); if (MailleMetier.size()!=0){ MailleMetier=saisonmetier.getSecteur().getMaille().copy(); var saison=saisonmetier.getSaison(); if (saison.contains(SaisonFermee)){ writeln("il y a bien intersection entre la zone métier et le cantonnement pour la saison "+saison.toString()); // calcule de la zone restante: var ToutFerme=false; var DebInclus=saison.contains(MoisDeb); var FinInclus=saison.contains(MoisFin); MailleMetier.removeAll(maillefermee); writeln("inter maille:"+MailleMetier.size()); // test pour savoir si toute la zone de pratique du metier // (reunion de toutes les zones metiers de metier a date) // est totalement incluse dans la zone Cantonnement if (MailleMetier.size() != 0){ //le cas intersection.length==mailleMetier est dans condition // si toute la zone de pratique du metier n'est pas incluse dans zone Cantonnement //creation du nouveau secteur de metier ToutFerme=false; var secteurResult = MetaSecteurFactory.create("MetaCantonnement-"+metier.getNom()+saison.toString(), RegionSimu, "Secteur créé durant la simulation."); writeln("nouveau secteur cree:"+secteurResult); var zonesMetier = saisonmetier.getSecteur().getAllSecteur(); writeln("zonesMetier:"+zonesMetier); writeln("zonesMetier.size:"+zonesMetier.size()); for(var i=0; i<zonesMetier.size(); i++){ var zonemet = zonesMetier.get(i); writeln("zonemet:"+zonemet); // intersection entre la zeme zone metier a date et zone de Cantonnement var listemailleszonemetier = zonemet.getMaille().copy(); var nbMailleZoneMetier = listemailleszonemetier.size(); writeln("maille metier:"+listemailleszonemetier); writeln("maille Cantonnement:"+maillefermee); listemailleszonemetier.removeAll(maillefermee); if(0==listemailleszonemetier.size()){ //si completement inclus on le supprime //donc on ne le met pas dans le nouveau writeln("on supprime la zone"+zonemet); } else if (listemailleszonemetier.size() != nbMailleZoneMetier) { // si la zone metier n'est pas totalement incluse dans zone de Cantonnement // on reduit la zeme zone metier de cette intersection // pas de modif de la matrice de proportion strmet writeln("on cree une nouvelle zone a partir de:"+zonemet+" avec "+listemailleszonemetier); var simpleSecteur = SecteurSimpleFactory.create("Cantonnement-"+metier.getNom()+"-"+zonemet+saison.toString(), RegionSimu, "Secteur creer durant la simulation."); simpleSecteur.addAllMaille(listemailleszonemetier); secteurResult.addSecteur(simpleSecteur); writeln("apres addSecteur"); } else { //sinon on le met dans le nouveau writeln("On remet tel quelle la zone:"+zonemet); secteurResult.addSecteur(zonemet); } }// fin du for sur les zone metier de la zone de pratique du metier } else { var secteurResult=saisonmetier.getSecteur().getAllSecteur(); writeln("Toute la zone metier est ferme"); ToutFerme=true; } //1er cas: la saison métier est identique (ou totalement incluse dans la saison fermée, dans ce cas là, on change juste //le secteur if (SaisonFermee.toListMois().containsAll(saison.toListMois())){ writeln("toute la saison metier est incluse dans la saison de fermeture"); //si tout est fermé, on met le metier au chômage if (ToutFerme==true){ writeln ("toute la zone est fermée, le metier passe donc à chômage pour cette saison"); var listestrategies=StrategyFactory.findAllByRegion(RegionSimu); var ListeMois=saison.toListMois(); for(var i=0; i<listestrategies.size(); i++){ var SetOfBateau=listestrategies.get(i).getSetOfVessels(); var MetiersPosibles=SetOfBateau.getMetiers(); if (MetiersPosibles.contains(metier)){ for (imois=ListeMois.iterator();imois.hasNext();){ var mois=imois.next(); var InfoMois=listestrategies.get(i).getStrategyMonthInfo(mois); if (InfoMois.getProportionMetier(metier)!=0){ InfoMois.setProportionMetier(metChomage,InfoMois.getProportionMetier(metChomage)+InfoMois.getProportionMetier(metier)); InfoMois.setProportionMetier(metier,0); } } } } } else { writeln("tout n'est pas fermée, le secteur de pêche devient "+secteurResult); var ListeMois=SaisonFermee.toListMois(); for (imois=ListeMois.iterator();imois.hasNext();){ mois=imois.next(); metier.setSecteurMois(secteurResult, mois); } } } //2ème cas de figure: moisDeb est inclus mais pas moisFin (ou alors c'est le dernier mois) else if (DebInclus && ((!FinInclus) || moisFin==saison.getLastMois().getNumMois())){ writeln ("il y a intersection de la saison de fermeture avec la saison métier de "+moisDeb+" à "+saison.getLastMois().getNumMois()); //si tout est fermé on met les proportions à 0 pour les mois fermes if (ToutFerme==true){ writeln ("toute la zone métier est fermée"); var listestrategies=StrategyFactory.findAllByRegion(RegionSimu); var ListeMois=SaisonFermee.toListMois().retainAll(saison.toListMois()); writeln ("de "+ListeMois.get(0)+" a "+ ListeMois.get(ListeMois.size())+ ", le metier est donc mis au chomage"); for(var i=0; i<listestrategies.size(); i++){ var SetOfBateau=listestrategies.get(i).getSetOfVessels(); var MetiersPosibles=SetOfBateau.getMetiers(); if (MetiersPosibles.contains(metier)){ for (imois=ListeMois.iterator();imois.hasNext();){ var mois=imois.next(); var InfoMois=listestrategies.get(i).getStrategyMonthInfo(mois); if (InfoMois.getProportionMetier(metier)!=0){ InfoMois.setProportionMetier(metChomage,InfoMois.getProportionMetier(metChomage)+InfoMois.getProportionMetier(metier)); InfoMois.setProportionMetier(metier,0); } } } } } else { //on commence par crée les nouvelles saisons var NouvelleSaison2= new Packages.fr.ifremer.nodb.Saison(moisDeb,saison.getLastMois().getNumMois()); var NouvelleSaison1= new Packages.fr.ifremer.nodb.Saison(saison.getFirstMois().getNumMois(),moisDeb-1); saisonmetier.setSaison(NouvelleSaison1); //on crée un nouveau infoSaisonMetier var NouvelInfoSaison=InfoSaisonMetierFactory.create(metier, NouvelleSaison2, secteurResult, "saison crée pendant la simulation") ; metier.addInfoSaison(NouvelInfoSaison); writeln ("de "+saison.getFirstMois().getNumMois()+" à "+moisDeb-1+" le metier peche en "+saisonmetier.getSecteur()); writeln ("de "+moisDeb+" à "+saison.getLastMois().getNumMois()+" le metier peche en "+secteurResult); } } //3ème cas de figure: moisFin est inclus mais pas moisDeb (ou alors il est égal au premier mois) else if (((!DebInclus) || moisDeb==saison.getFirstMois().getNumMois()) && FinInclus){ writeln ("il y a intersection de la saison de fermeture avec la saison métier de "+moisDeb+" à "+saison.getLastMois().getNumMois()); //si tout est fermé on met les proportions à 0 pour les mois fermes if (ToutFerme==true){ writeln ("toute la zone est fermee"); var listestrategies=StrategyFactory.findAllByRegion(RegionSimu); var ListeMois=SaisonFermee.toListMois().retainAll(saison.toListMois()); writeln ("de "+ListeMois.get(0)+" a "+ ListeMois.get(ListeMois.size())+ ", le metier est donc mis au chomage"); for(var i=0; i<listestrategies.size(); i++){ var SetOfBateau=listestrategies.get(i).getSetOfVessels(); var MetiersPosibles=SetOfBateau.getMetiers(); if (MetiersPosibles.contains(metier) ){ for (imois=ListeMois.iterator();imois.hasNext();){ var mois=imois.next(); var InfoMois=listestrategies.get(i).getStrategyMonthInfo(mois); if (InfoMois.getProportionMetier(metier)!=0){ InfoMois.setProportionMetier(metChomage,InfoMois.getProportionMetier(metChomage)+InfoMois.getProportionMetier(metier)); InfoMois.setProportionMetier(metier,0); } } } } } else { //on commence par crée les nouvelles saisons var NouvelleSaison1= new Packages.fr.ifremer.nodb.Saison(saison.getFirstMois().getNumMois(),moisFin); var NouvelleSaison2= new Packages.fr.ifremer.nodb.Saison(moisFin+1,saison.getLastMois.getNumMois()); saisonmetier.setSaison(NouvelleSaison2); //on crée un nouveau infoSaisonMetier var NouvelInfoSaison=InfoSaisonMetierFactory.create(metier, NouvelleSaison1, secteurResult, "saison crée pendant la simulation") ; metier.addInfoSaison(NouvelInfoSaison); writeln ("de "+saison.getFirstMois().getNumMois()+" à "+moisFin+" le metier peche en "+secteurResult); writeln ("de "+moisFin+1+" à "+saison.getLastMois().getNumMois()+" le metier peche en "+saisonmetier.getSecteur()); } } //dernier cas de figure: les deux sont inclus et sont différents des bornes else { //si tout est fermé on met les proportions à 0 pour les mois fermes if (ToutFerme==true){ writeln("toute la zone métier est fermée"); var listestrategies=StrategyFactory.findAllByRegion(p.metier.getRegion()); var ListeMois=SaisonFermee.toListMois(); writeln("le métier passe à chômage de "+moisDeb+" à "+moidFin); for(var i=0; i<listestrategies.size(); i++){ var SetOfBateau=listestrategies.get(i).getSetOfVessels(); var MetiersPosibles=SetOfBateau.getMetiers(); if (MetiersPosibles.contains(metier) ){ for (imois=ListeMois.iterator();imois.hasNext();){ var mois=imois.next(); var InfoMois=listestrategies.get(i).getStrategyMonthInfo(mois); if (InfoMois.getProportionMetier(metier)!=0){ InfoMois.setProportionMetier(metChomage,InfoMois.getProportionMetier(metChomage)+InfoMois.getProportionMetier(p.metier)); InfoMois.setProportionMetier(p.metier,0); } } } } } else { //on commence par crée les nouvelles saisons var NouvelleSaison1= new Packages.fr.ifremer.nodb.Saison(saison.getFirstMois().getNumMois(),moisDeb-1); var NouvelleSaison2= new Packages.fr.ifremer.nodb.Saison(moisDeb,saison.getLastMois().getNumMois()); saisonmetier.setSaison(NouvelleSaison1); //on crée 2 nouveau infoSaisonMetier var NouvelInfoSaison2=InfoSaisonMetierFactory.create(metier, NouvelleSaison2, secteurResult, "saison crée pendant la simulation") ; var NouvelInfoSaison3=InfoSaisonMetierFactory.create(metier, NouvelleSaison2, saisonmetier.getSecteur(), "saison crée pendant la simulation") ; metier.addInfoSaison(NouvelInfoSaison2); metier.addInfoSaison(NouvelInfoSaison3); metier.add writeln ("de "+saison.getFirstMois().getNumMois()+" à "+(moisDeb-1)+" le metier peche en "+saisonmetier.getSecteur()); writeln ("de "+moisDeb+" à "+moisFin+" le metier peche en "+secteurResult); writeln ("de "+(moisFin+1)+" à "+saison.getLastMois().getNumMois()+" le metier peche en "+saisonmetier.getSecteur()); } } } } } } }