ordre des métiers et stratégies dans la base
Hello, on a rencontré un probleme récement à propos de l'odre des métiers et des stratégies dans différentes bases. Du coup j airais quelques questions. Voila la situation : En fait l une de nos regles de gestion necessite de charger des coefficients pour chaque métier et strategie à partir de fichiers csv. On avait donc préalablement fait afficher une liste des métiers de la base dans les logs pour savoir dans quel ordre ils étaient rangés, dans quel ordre ils apparaiseent quand on boucle dessus et ranger nos coefficients dans le même ordre dans le csv. - du coup premiere question : d'où vient cet ordre ? par quoi est il déterminé ? Ensuite en voulant utiliser la règle de gestion sur une autre base on s est aperçus que l ordre avait changé. Pourtant cette base avait ete créée a partir de la précédente (par une copie). - du coup on se demande comment ca se fait que l ordre des métiers ait été modifié ? Finalement pour éviter les problèmes il faudrait que nous chargions nos tableaux de coefficients en s affranchissant de cet ordre. Auiriez vous une idee d un moyen rapide et efficace pour le faire (j ai peur de faire 1000 lignes de code moche, quand 5 jolies suffiraient ;-) ) ? (j ai mis la regle en pj et je suis dispo pour en discuter quand vous voulez) Merci d'avance de vos réponses. Sigrid -- Sigrid LEHUTA ~ ><> ~ Doctorante Département Ecologie et Modèles pour l'Halieutique IFREMER, rue de l'ile d'Yeu BP 21105 44311 Nantes Cedex 03 Tél : +33 (0)2 40 37 41 23 (interne : 8123) package rules; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import static org.nuiton.i18n.I18n._; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.math.matrix.*; import scripts.ResultName; import scripts.RuleUtil; import scripts.SiMatrix; import fr.ifremer.isisfish.IsisFishDAOHelper; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.rule.AbstractRule; import fr.ifremer.isisfish.simulator.MetierMonitor; import fr.ifremer.isisfish.simulator.PopulationMonitor; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.types.Date; import fr.ifremer.isisfish.types.Month; import org.nuiton.topia.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import org.nuiton.util.*;// pour pouvoir utiliser la methode StringUtil.toDouble() import scripts.ResultName; import java.io.*; import java.util.*; import org.nuiton.math.matrix.*; import fr.ifremer.isisfish.*; import fr.ifremer.isisfish.types.*; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.types.Date; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.simulator.SimulationParameter; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.datastore.ResultStorage; /** * TACMPARUMMultiCosts.java * * Created: 7 septembre 2006 * * @author anonymous <anonymous@labs.libre-entreprise.org> * @version $Revision: 1.3 $ * * Last update: $Date: 2007/01/24 18:25:34 $ * by : $Author: bpoussin $ */ /** * */ public class FrTACMPARumMultiCost_Anchois extends AbstractRule { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(FrTACMPARumMultiCost_Anchois.class); /** public : **/ public Population param_pop = null ; public Double param_fuelprice = 0.3411; public Month param_beginMonth = Month.JANUARY; public Month param_endMonth = Month.DECEMBER; public Date param_beginDateTAC = new Date(0); public Date param_endDateTAC = new Date(500); public double param_tacInTons = 1320000; public Zone param_zoneMPA = null; public Date param_beginDateMPA = new Date(12); // obligatoire de commencer l'année 1 pour pouvoir appliquer le RUM public Date param_endDateMPA = new Date(500); public Month param_beginMonthMPA = Month.APRIL; public Month param_endMonthMPA = Month.JULY; /** matrix of coefficients of rum**/ String param_nomfichier_coeffRUM0 = "Inputs_Anchois/CoeffRumMultiCost/CoeffRum0.csv";//0=str_bolbasques String param_nomfichier_coeffRUM1 = "Inputs_Anchois/CoeffRumMultiCost/CoeffRum1.csv";//1=str_bolbretons String param_nomfichier_coeffRUM2 = "Inputs_Anchois/CoeffRumMultiCost/CoeffRum2.csv";//2=str_pelprofil1 String param_nomfichier_coeffRUM3 = "Inputs_Anchois/CoeffRumMultiCost/CoeffRum3.csv";//3=str_pelprofil2 /**matrix of coefficients of relations Effort - Value others met other et anchovy et anchovy met other **/ String param_nomfichier_coeffOthers0 = "Inputs_Anchois/CoeffOthers_ssIntercept/CoeffOthers0.csv"; String param_nomfichier_coeffOthers1 = "Inputs_Anchois/CoeffOthers_ssIntercept/CoeffOthers1.csv"; String param_nomfichier_coeffOthers2 = "Inputs_Anchois/CoeffOthers_ssIntercept/CoeffOthers2.csv"; String param_nomfichier_coeffOthers3 = "Inputs_Anchois/CoeffOthers_ssIntercept/CoeffOthers3.csv"; /**matrix of mean VPUE over 2000-2004 per french strategie an species**/ String param_nomfichier_VPUE0_A = "Inputs_Anchois/VPUEMoyen20002004/VPUEMoy0_A.csv"; String param_nomfichier_VPUE1_A = "Inputs_Anchois/VPUEMoyen20002004/VPUEMoy1_A.csv";//yv String param_nomfichier_VPUE2_A = "Inputs_Anchois/VPUEMoyen20002004/VPUEMoy2_A.csv";//yv String param_nomfichier_VPUE3_A = "Inputs_Anchois/VPUEMoyen20002004/VPUEMoy3_A.csv";//yv String param_nomfichier_VPUE0_O = "Inputs_Anchois/VPUEMoyen20002004/VPUEMoy0_O.csv"; String param_nomfichier_VPUE1_O = "Inputs_Anchois/VPUEMoyen20002004/VPUEMoy1_O.csv";//yv String param_nomfichier_VPUE2_O = "Inputs_Anchois/VPUEMoyen20002004/VPUEMoy2_O.csv";//yv String param_nomfichier_VPUE3_O = "Inputs_Anchois/VPUEMoyen20002004/VPUEMoy3_O.csv";//yv /**matrix o distances**/ String param_nomfichier_distances0 = "Inputs_Anchois/CoeffRumMultiCost/Distances0.csv"; String param_nomfichier_distances1 = "inputs_Anchois/CoeffRumMultiCost/Distances1.csv"; String param_nomfichier_distances2 = "Inputs_Anchois/CoeffRumMultiCost/Distances2.csv"; String param_nomfichier_distances3 = "Inputs_Anchois/CoeffRumMultiCost/Distances3.csv"; /** protected RUM**/ static final protected String VPUE_O = "LandingsValueOther"; static final protected String VPUE_A = "LandingsValueAnchovy"; static final protected String INTERCEPT = "Intercept"; static final protected String EFFORT_PY = "EffortPY"; static final protected String EFFORT_PM = "EffortPM"; static final protected String EFFORT = "Effort"; static final protected String LVALUE_O = "LandingsValueOther"; static final protected String LVALUE_A = "LandingsValueAnchovy"; static final protected String BETA_O = "BetaOthers"; static final protected String BETA_A = "BetaAnchovy"; static final protected String ALPHA_O = "AlphaOthers"; static final protected String ALPHA_A = "AlphaAnchovy"; static final protected String COST = "Cost"; protected File CoeffRum0; protected File CoeffRum1; protected File CoeffRum2; protected File CoeffRum3; protected File CoeffOthers0; protected File CoeffOthers1; protected File CoeffOthers2; protected File CoeffOthers3; protected File VPUE0_A; protected File VPUE1_A; protected File VPUE2_A; protected File VPUE3_A; protected File VPUE0_O; protected File VPUE1_O; protected File VPUE2_O; protected File VPUE3_O; protected File Distances0; protected File Distances1; protected File Distances2; protected File Distances3; protected MatrixND matrixCoeffRUM; protected MatrixND matrixCoeffOthers; protected MatrixND matrixAverageVPUE_A; protected MatrixND matrixAverageVPUE_O; protected MatrixND matrixVar; protected MatrixND matrixDistances; protected MatrixND vectorTACPresenceAbsence; // vector TAC reached last year protected MatrixND matMPAPresenceAbsence; // matrice strategy x metier x mois de presence absence MPA totale /** To keep and export %effort / metier date**/ File exportEffort = new File ("Effort.csv");//yv protected List<Metier> metiers; protected Map<String , Strategy> mesStrategies; protected boolean first = true; protected String [] necessaryResult = { ResultName.MATRIX_BIOMASS, ResultName.MATRIX_GROSS_VALUE_OF_LANDINGS_PER_STRATEGY_MET, ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_POP, ResultName.MATRIX_EFFORT_PER_STRATEGY_MET, ResultName.MATRIX_EFFORT_NOMINAL_PER_STRATEGY_MET, }; /** * @return the necessaryResult */ public String[] getNecessaryResult() { return this.necessaryResult; } /** * Permet d'afficher a l'utilisateur une aide sur la regle. * @return L'aide ou la description de la regle */ public String getDescription() { return _("TAC partage a 50% entre les espagnols et les francais /"+ "MPA sur tous les engins"+ "et calcul le temps passe sur chaque metier possible a l aide des RUM / "+ "necessite au moins 2 annes de simulation / "+ "attend une matrice de coefficients du RUM / "+ "une matrice de coeff pour le calcul des valeurs des especes non decrites / "+ "exporte les pourcentages et valeurs calculees chaque mois"); } /** * Appelthode permet d'initialiser * des valeurs * @param simulation La simulation pour lequel on utilise cette regle */ public void init(SimulationContext context) throws Exception { //System.out.println("est ce qu il passe dans le init ?"); /** load coefficients of rum file in a matrix**/ if (param_nomfichier_coeffRUM0==null || "".equals(param_nomfichier_coeffRUM0)){ CoeffRum0 = FileUtil.getFile(".*.csv", "fichierRum 0 csv separateur ';'"); CoeffRum1 = FileUtil.getFile(".*.csv", "fichierRum 1 csv sparateur ';'"); CoeffRum2 = FileUtil.getFile(".*.csv", "fichierRum 2 csv sparateur ';'"); CoeffRum3 = FileUtil.getFile(".*.csv", "fichierRum 3 csv sparateur ';'"); } else { CoeffRum0 = new File(param_nomfichier_coeffRUM0); CoeffRum1 = new File(param_nomfichier_coeffRUM1); CoeffRum2 = new File(param_nomfichier_coeffRUM2); CoeffRum3 = new File(param_nomfichier_coeffRUM3); } /** load coefficients of relation others file in a matrix**/ if (param_nomfichier_coeffOthers0==null || "".equals(param_nomfichier_coeffOthers0)){ CoeffOthers0 = FileUtil.getFile(".*.csv", "fichierOthers 0 csv sparateur ';'"); CoeffOthers1 = FileUtil.getFile(".*.csv", "fichierOthers 1 csv sparateur ';'"); CoeffOthers2 = FileUtil.getFile(".*.csv", "fichierOthers 2 csv sparateur ';'"); CoeffOthers3 = FileUtil.getFile(".*.csv", "fichierOthers 3 csv sparateur ';'"); } else { CoeffOthers0 = new File(param_nomfichier_coeffOthers0); CoeffOthers1 = new File(param_nomfichier_coeffOthers1); CoeffOthers2 = new File(param_nomfichier_coeffOthers2); CoeffOthers3 = new File(param_nomfichier_coeffOthers3); } /**load mean VPUE per French strategy*coeff*metier*month**/ if (param_nomfichier_VPUE0_A==null || "".equals(param_nomfichier_VPUE0_A)){ VPUE0_A = FileUtil.getFile(".*.csv", "fichierAverageVPUE_A 0 csv parateur ';'"); VPUE1_A = FileUtil.getFile(".*.csv", "fichierAverageVPUE_A 1 csv sparateur ';'"); VPUE2_A = FileUtil.getFile(".*.csv", "fichierAverageVPUE_A 2 csv sparateur ';'"); VPUE3_A = FileUtil.getFile(".*.csv", "fichierAverageVPUE_A 3 csv sparateur ';'"); VPUE0_O = FileUtil.getFile(".*.csv", "fichierAverageVPUE_O 0 csv sparateur ';'"); VPUE1_O = FileUtil.getFile(".*.csv", "fichierAverageVPUE_O 1 csv sparateur ';'"); VPUE2_O = FileUtil.getFile(".*.csv", "fichierAverageVPUE_O 2 csv sparateur ';'"); VPUE3_O = FileUtil.getFile(".*.csv", "fichierAverageVPUE_O 3 csv sparateur ';'"); } else { VPUE0_A = new File(param_nomfichier_VPUE0_A); VPUE1_A = new File(param_nomfichier_VPUE1_A); VPUE2_A = new File(param_nomfichier_VPUE2_A); VPUE3_A = new File(param_nomfichier_VPUE3_A); VPUE0_O = new File(param_nomfichier_VPUE0_O); VPUE1_O = new File(param_nomfichier_VPUE1_O); VPUE2_O = new File(param_nomfichier_VPUE2_O); VPUE3_O = new File(param_nomfichier_VPUE3_O); } //Load file of distances Distances0 = new File(param_nomfichier_distances0); Distances1 = new File(param_nomfichier_distances1); Distances2 = new File(param_nomfichier_distances2); Distances3 = new File(param_nomfichier_distances3); /** reccuperation des metiers et strategies**/ SiMatrix siMatrix = SiMatrix.getSiMatrix(context); metiers = siMatrix.getMetiers(new Date(0)); List<Strategy> allStrategies = siMatrix.getStrategies(new Date(0)); List <String> coeffs = Arrays.asList(new String[]{ALPHA_O,BETA_O,ALPHA_A,BETA_A}); List <String> coeffRum = Arrays.asList(new String[]{INTERCEPT, EFFORT_PY, EFFORT_PM, VPUE_O ,VPUE_A, COST}); List <Month> months = Month.getMonths(param_beginMonth,param_endMonth); //System.out.println("liste mois: " + months); // creation de mes strategies qui ne contient pas les espagnols mesStrategies = new HashMap<String, Strategy>(); for(Strategy str : allStrategies) { mesStrategies.put(str.getName(), str); } mesStrategies.remove("Espagnols"); //// import des fichiers de coeff des rum [1 par strategie, metier*coeff] MatrixND matCoeffRum0 = MatrixFactory.getInstance().create( "matCoeffRum0", new List[]{ metiers,coeffRum}, new String[]{"Metiers","Coeff"}); MatrixND matCoeffRum1 = MatrixFactory.getInstance().create( "matCoeffRum1", new List[]{ metiers,coeffRum}, new String[]{"Metiers","Coeff"}); MatrixND matCoeffRum2 = MatrixFactory.getInstance().create( "matCoeffORum2", new List[]{metiers,coeffRum}, new String[]{"Metiers","Coeff"}); MatrixND matCoeffRum3 = MatrixFactory.getInstance().create( "matCoeffRum3", new List[]{metiers,coeffRum}, new String[]{"Metiers","Coeff"}); matCoeffRum0.importCSV(new FileReader(CoeffRum0),new int []{0,0}); matCoeffRum1.importCSV(new FileReader(CoeffRum1),new int []{0,0}); matCoeffRum2.importCSV(new FileReader(CoeffRum2),new int []{0,0}); matCoeffRum3.importCSV(new FileReader(CoeffRum3),new int []{0,0}); //// import des fichiers de coeff pour le calcul des valeurs non simulees [1 par strategie, metier*coeff] MatrixND matCoeffOthers0 = MatrixFactory.getInstance().create( "matCoeffOthers0", new List[]{metiers,coeffs}, new String[]{"Metiers","Coeff"}); MatrixND matCoeffOthers1 = MatrixFactory.getInstance().create( "matCoeffOthers1", new List[]{ metiers,coeffs}, new String[]{"Metiers","Coeff"}); MatrixND matCoeffOthers2 = MatrixFactory.getInstance().create( "matCoeffOthers2", new List[]{metiers,coeffs}, new String[]{"Metiers","Coeff"}); MatrixND matCoeffOthers3 = MatrixFactory.getInstance().create( "matCoeffOthers3", new List[]{metiers,coeffs}, new String[]{"Metiers","Coeff"}); matCoeffOthers0.importCSV(new FileReader(CoeffOthers0),new int []{0,0}); matCoeffOthers1.importCSV(new FileReader(CoeffOthers1),new int []{0,0}); matCoeffOthers2.importCSV(new FileReader(CoeffOthers2),new int []{0,0}); matCoeffOthers3.importCSV(new FileReader(CoeffOthers3),new int []{0,0}); //// import des fichiers de VPUE moyenne [1 par strategie, metier*mois pour l anchois] MatrixND matAverageVPUE0_A = MatrixFactory.getInstance().create( "matAverageFishingEffort0_A", new List[]{metiers,months}, new String[]{"Metiers","Months"}); MatrixND matAverageVPUE1_A = MatrixFactory.getInstance().create( "matAverageFishingEffort1_A", new List[]{ metiers,months}, new String[]{"Metiers","Months"}); MatrixND matAverageVPUE2_A = MatrixFactory.getInstance().create( "matAverageFishingEffort2_A", new List[]{metiers,months}, new String[]{"Metiers","Months"}); MatrixND matAverageVPUE3_A = MatrixFactory.getInstance().create( "matAverageFishingEffort3_A", new List[]{metiers,months}, new String[]{"Metiers","Months"}); matAverageVPUE0_A.importCSV(new FileReader(VPUE0_A),new int []{0,0}); matAverageVPUE1_A.importCSV(new FileReader(VPUE1_A),new int []{0,0}); matAverageVPUE2_A.importCSV(new FileReader(VPUE2_A),new int []{0,0}); matAverageVPUE3_A.importCSV(new FileReader(VPUE3_A),new int []{0,0}); //// import des fichiers de VPUE moyenne [1 par strategie, metier*mois pour other] MatrixND matAverageVPUE0_O = MatrixFactory.getInstance().create( "matAverageFishingEffort0_O", new List[]{metiers,months}, new String[]{"Metiers","Months"}); MatrixND matAverageVPUE1_O = MatrixFactory.getInstance().create( "matAverageFishingEffort1_O", new List[]{metiers,months}, new String[]{"Metiers","Months"}); MatrixND matAverageVPUE2_O = MatrixFactory.getInstance().create( "matAverageFishingEffort2_O", new List[]{metiers,months}, new String[]{"Metiers","Months"}); MatrixND matAverageVPUE3_O = MatrixFactory.getInstance().create( "matAverageFishingEffort3_O", new List[]{metiers,months}, new String[]{"Metiers","Months"}); matAverageVPUE0_O.importCSV(new FileReader(VPUE0_O),new int []{0,0}); matAverageVPUE1_O.importCSV(new FileReader(VPUE1_O),new int []{0,0}); matAverageVPUE2_O.importCSV(new FileReader(VPUE2_O),new int []{0,0}); matAverageVPUE3_O.importCSV(new FileReader(VPUE3_O),new int []{0,0}); //// import des distances parcourues MatrixND matDistances0 = MatrixFactory.getInstance().create( "matDistances0", new List[]{metiers,months}, new String[]{"Metiers","Month"}); MatrixND matDistances1 = MatrixFactory.getInstance().create( "matDistances1", new List[]{metiers,months}, new String[]{"Metiers","Month"}); MatrixND matDistances2 = MatrixFactory.getInstance().create( "matDistances2", new List[]{metiers,months}, new String[]{"Metiers","Month"}); MatrixND matDistances3 = MatrixFactory.getInstance().create( "matDistances3", new List[]{metiers,months}, new String[]{"Metiers","Month"}); matDistances0.importCSV(new FileReader(Distances0),new int []{0,0}); matDistances1.importCSV(new FileReader(Distances1),new int []{0,0}); matDistances2.importCSV(new FileReader(Distances2),new int []{0,0}); matDistances3.importCSV(new FileReader(Distances3),new int []{0,0}); //creation et import des matrices des coeff // RUM matrixCoeffRUM = MatrixFactory.getInstance().create( "matrixCoeffRUM", new List[]{new ArrayList(mesStrategies.values()), metiers, coeffRum}, new String[]{"Strategies","Metiers","Coeff"}); MatrixND matImportRum = MatrixFactory.getInstance().create(new int[]{14,2}); for(Strategy str : mesStrategies.values()){ for(Metier met : metiers){ for(String coeff : coeffRum){ if ("BolBasques".equals(str.getName())) { matImportRum = matCoeffRum0; }else if ("BolBretons".equals(str.getName())) { matImportRum = matCoeffRum1; }else if ("PelProfil1".equals(str.getName())) { matImportRum = matCoeffRum2; }else if ("PelProfil2".equals(str.getName())) { matImportRum = matCoeffRum3;} matrixCoeffRUM.setValue(str,met, coeff, matImportRum.getValue(met,coeff)); }// fin de for coeff }// fin de for met }// fin de for strategy //System.out.println("coeff RUM: " + matrixCoeffRUM); // captures non simulees matrixCoeffOthers = MatrixFactory.getInstance().create( "matrixCoeffOthers", new List[]{new ArrayList(mesStrategies.values()), metiers, coeffs}, new String[]{"Strategies","Metiers","Coeff"}); MatrixND matImport = MatrixFactory.getInstance().create(new int[]{14,2}); for(Strategy str : mesStrategies.values()){ for(Metier met : metiers){ for(String coeff : coeffs){ if ("BolBasques".equals(str.getName())) { matImport = matCoeffOthers0; }else if ("BolBretons".equals(str.getName())) { matImport = matCoeffOthers1; }else if ("PelProfil1".equals(str.getName())) { matImport = matCoeffOthers2; }else if ("PelProfil2".equals(str.getName())) { matImport = matCoeffOthers3;} matrixCoeffOthers.setValue(str, met, coeff, matImport.getValue(met,coeff)); }// fin de for coeff }// fin de for met }// fin de for strategy //System.out.println("matrixCoeffOthers : "+matrixCoeffOthers); matrixAverageVPUE_A = MatrixFactory.getInstance().create( "matrixAverageVPUEA", new List[]{new ArrayList(mesStrategies.values()), metiers, months}, new String[]{"Strategies","Metiers","Months"}); matImport = MatrixFactory.getInstance().create(new int[]{14,12}); for(Strategy str : mesStrategies.values()){//System.out.println("str : " +str.getName()); for(Metier met : metiers){ for(Month month : months){ if ("BolBasques".equals(str.getName())) { matImport = matAverageVPUE0_A; }else if ("BolBretons".equals(str.getName())) { matImport = matAverageVPUE1_A; }else if ("PelProfil1".equals(str.getName())) { matImport = matAverageVPUE2_A; }else if ("PelProfil2".equals(str.getName())) { matImport = matAverageVPUE3_A;} double coeffval = matImport.getValue(met,month); matrixAverageVPUE_A.setValue(str, met, month,coeffval); }// fin de for month }// fin de for met }// fin de for strategy //System.out.println("matrixAverageVPUE : "+matrixAverageVPUE_A); matrixAverageVPUE_O = MatrixFactory.getInstance().create( "matrixAverageVPUEO", new List[]{new ArrayList(mesStrategies.values()), metiers, months}, new String[]{"Strategies","Metiers","Months"}); matImport = MatrixFactory.getInstance().create(new int[]{14,12}); for(Strategy str : mesStrategies.values()){//System.out.println("str : " +str.getName()); for(Metier met : metiers){ for(Month month : months){ if ("BolBasques".equals(str.getName())) { matImport = matAverageVPUE0_O; }else if ("BolBretons".equals(str.getName())) { matImport = matAverageVPUE1_O; }else if ("PelProfil1".equals(str.getName())) { matImport = matAverageVPUE2_O; }else if ("PelProfil2".equals(str.getName())) { matImport = matAverageVPUE3_O;} double coeffval = matImport.getValue(met,month); matrixAverageVPUE_O.setValue(str, met, month,coeffval); }// fin de for month }// fin de for met }// fin de for strategy //System.out.println("matrixAverageVPUE : "+matrixAverageVPUE_O); //// Matrice des distances parcourues matrixDistances = MatrixFactory.getInstance().create( "matrixDistances", new List[]{metiers,new ArrayList(mesStrategies.values()),months}, new String[]{"Metiers","Strategies","Month"}); MatrixND matImportDist = MatrixFactory.getInstance().create(new int[]{14,12}); for(Strategy str : mesStrategies.values()){ for(Metier met : metiers){ for(Month mois : months){ if ("BolBasques".equals(str.getName())) { matImportDist = matDistances0; }else if ("BolBretons".equals(str.getName())) { matImportDist = matDistances1; }else if ("PelProfil1".equals(str.getName())) { matImportDist = matDistances2; }else if ("PelProfil2".equals(str.getName())) { matImportDist = matDistances3;} matrixDistances.setValue(met, str, mois, matImportDist.getValue(met,mois)); }// fin de for months }// fin de for met }// fin de for strategy // initialisation of a TACPresenceAbsence vector of size 12 (nb of months within a year) = 0 (memoire de l année -1) // 0 = TAC pas atteint // 1 = TAC atteint // initialisation a 0 //System.out.println("liste de mois pour creer le vecteur"+months); vectorTACPresenceAbsence = MatrixFactory.getInstance().create( "vectorTACPresenceAbsence", new List[]{ months}, new String[]{"Months"}); //vectorTACPresenceAbsence = MatrixFactory.createVector(12); //System.out.println("vectorTACPresenceAbsence :" +vectorTACPresenceAbsence); // initialisation de matMPAPresenceAbsence matrice mois x strategies x metiers l année en cours // 0= mpa totale sur le metier // 1= pas de mpa ou mpa partielle sur le metier matMPAPresenceAbsence = MatrixFactory.getInstance().create( "matMPAPresenceAbsence", new List[]{new ArrayList(mesStrategies.values()), metiers, months}, new String[]{"Strategies", "Metiers","Months"}); //System.out.println("matMPAPresenceAbsence :" +matMPAPresenceAbsence); }// fin de init protected Map<Date, MatrixND> allMatrixVar = new HashMap<Date, MatrixND>(); protected MatrixND getMatrixVar(Date askedDate) { MatrixND result = allMatrixVar.get(askedDate); // si on demande on matrice qui n existe pas encore : on la cree if (result == null) { MatrixND matrixVar = createMatrixVar(); allMatrixVar.put(askedDate, matrixVar); result = matrixVar; } return result; } protected MatrixND createMatrixVar (){ // Creation d'une nouvelle matrix qui n'existe pas encore ... MatrixND matrixVar = MatrixFactory.getInstance().create( "matrixVar", new List[]{new ArrayList(mesStrategies.values()), metiers, Arrays.asList(new String[]{EFFORT, LVALUE_O, LVALUE_A})}, new String[]{"Strategies","Metiers","Variables"}); return matrixVar ; } /** * ajoute a file le contenu de la matrice pour la date donnee */ protected void exportEffort(File file, Date date) throws Exception { if(date.getDate() > 0){ MatrixND mat = allMatrixVar.get(date.previous()); //mat = mat.getSubMatrix(2, EFFORT); //mat = mat.reduceDims(2); BufferedWriter out = new BufferedWriter(new FileWriter(file, true)); int d = date.previous().getDate(); /*for (MatrixIterator i = mat.iterator(); i.hasNext();) { i.next(); Object str = i.getSemanticsCoordinates()[0]; Object met = i.getSemanticsCoordinates()[1]; Object var = i.getSemanticsCoordinates()[2]; double value = i.getValue(); out.write(d + ";" + str + ";" + met + ";"+ var +";" + value); out.newLine(); }*/ List <Strategy> str = mat.getSemantics()[0]; List <Metier> met = mat.getSemantics()[1]; for(Strategy s : str){ for(Metier m : met){ double val1 = mat.getValue(s,m,0); double val2 = mat.getValue(s,m,1); double val3 = mat.getValue(s,m,2); out.write(d + ";" + s + ";" + m + ";" + val1 +";" + val2 + ";" + val3); out.newLine(); } } out.close(); } } /** * La condition qui doit etre vrai pour faire les actions * @param simulation La simulation pour lequel on utilise cette regle * @return vrai si on souhaite que les actions soit faites */ public boolean condition(SimulationContext context, Date date, Metier metier) throws Exception { boolean result = true; return result; } /** * Si la condition est vrai alors cette action est execute avant le pas * de temps de la simulation. * @param simulation La simulation pour lequel on utilise cette regle */ public void preAction(SimulationContext context, Date date, Metier metier) throws Exception { // la praction n est realisee qu une seule fois pour tous les metiers if (first == true){ TopiaContext tx = context.getDB(); String id = param_zoneMPA.getTopiaId(); param_zoneMPA = ((Zone)tx.findByTopiaId(id)); first = false ; // pour ne passer qu'une seule fois //initialisation SiMatrix siMatrix = SiMatrix.getSiMatrix(context); ResultStorage Result = context.getSimulationStorage().getResultStorage(); MatrixND currentMatrixVar = getMatrixVar(date); List<Strategy> strategies = currentMatrixVar.getSemantics(0); List<Metier> metiers = currentMatrixVar.getSemantics(1); // est-ce que le TAC est atteint? boolean testTAC = false; if(date.before(param_beginDateTAC)) { testTAC= false; } else if(date.after(param_endDateTAC)) { testTAC= false; } else if (date.getMonth().before(param_beginMonth)) { testTAC= false; } else if (date.getMonth().after(param_endMonth)) { testTAC= false; } else { Species sp = param_pop.getSpecies(); TargetSpecies ts = metier.getMetierSeasonInfo(date.getMonth()).getSpeciesTargetSpecies(sp); if (ts != null) { int ny = date.getYear() ; ResultStorage matResult = context.getSimulationStorage().getResultStorage(); double CatchFraTot = 0; //double CatchFraTot1 = 0; //double CatchFraTot2 = 0; for (Date dat = new Date(0); dat.before(date); dat = dat.next()) { if (dat.getYear() == ny ){ //System.out.println("date de la boucle : "+ dat); MatrixND mat = matResult.getMatrix(dat, param_pop, ResultName.MATRIX_CATCH_WEIGHT_PER_STRATEGY_MET_PER_ZONE_POP); if (mat == null) { //System.out.println("**** ERROR mat catch: null"); } int comp = 0; for(Strategy str : strategies){ comp += 1; if(!"Espagnols".equals(str.getName())){ //System.out.println("strategie de la boucle:"+str.getName()); // A MODIFIER SELON ORDRE des strategies francaises ici elles sont de 1 a 4 MatrixND Fra1 = mat.copy().getSubMatrix(0,comp); Fra1 = Fra1.sumOverDim(0); // sum strategy Fra1 = Fra1.sumOverDim(1); // sum metiers Fra1 = Fra1.sumOverDim(2); // sum groups Fra1 = Fra1.sumOverDim(3); // sum zones Fra1 = Fra1.reduce(); double CatchFra1 = Fra1.getValue(0); CatchFraTot += CatchFra1 ; } } //System.out.println("capt francaise tot : " + CatchFraTot); /*MatrixND Fra2 = mat.copy().getSubMatrix(0,3,1); Fra2 = Fra2.sumOverDim(0); // sum strategy Fra2 = Fra2.sumOverDim(1); // sum metiers Fra2 = Fra2.sumOverDim(2); // sum groups Fra2 = Fra2.sumOverDim(3); // sum zones Fra2 = Fra2.reduce(); double CatchFra2 = Fra2.getValue(0); CatchFraTot2 += CatchFra2 ; */ } } //CatchFraTot = CatchFraTot1 + CatchFraTot2 ; //System.out.println("capt francaise :" + CatchFraTot); //System.out.println("param tac in ton : "+param_tacInTons); if (CatchFraTot/1000 >= param_tacInTons){ testTAC = true ; //System.out.println("CAPTURE DEPASSEE"); } } } // fin de test TAC //System.out.println("TAC atteint?: " + testTAC); /** Algorithme : A- if TAC atteint a. E = 0 B- else TAC pas atteint a. if TAC atteint l annee precedente & on est en janvier E= EmoyJanvier(2000-2004) // rien faire b. else if TAC atteint l annee à cette date E=EmoyMois(2000-2004) // rien a faire c. else TAC pas atteint l annee precedente a cette date i. if date <11 1. on fait rien // effort = effort initial ii. else date >11 E est calcule par le RUM et 1. If MPA ne concerne pas le metier indiceUtilite = 1 2. Else if MPA concerne le metier indiceUtilite = 1 3. Else MPA interdit la pratique du metier indiceUtilite = 0 **/ //System.out.println("test TAC " + testTAC); if(testTAC){ // TAC atteint E=0 //System.out.println("Tac atteint, E=0"); for(Strategy strIndex : strategies){ //System.out.println("str :"+ strIndex.getName()); Strategy str = (Strategy)context.getDB().findByTopiaId(strIndex.getTopiaId()); StrategyMonthInfo smi = str.getStrategyMonthInfo(date.getMonth()); Collection<EffortDescription> strMet = str.getSetOfVessels().getPossibleMetiers() ; for (EffortDescription effort : strMet){ Metier met = effort.getPossibleMetiers() ; double percent = 0; // attribution de la nouvelle prop pour le mois if (!context.getMetierMonitor().getForbiddenMetier().contains(met)) { smi.setProportionMetier(met,percent); System.out.println("smi set " + smi.getProportionMetier(met)); } }// fin de boucle sur les metiers de la strategie }// fin de boucle sur la strategie }else{ // TAC pas encore atteint //System.out.println("Vector TAC :"+vectorTACPresenceAbsence); if (vectorTACPresenceAbsence.getValue(11)==1 & Month.JANUARY.equals(date.getMonth())){ // TAC atteint l'an d'avant & janvier -> E = Emoy /**On ne change rien E = effort moyen**/ //System.out.println("janvier, vectorTACPresenceAbsence : " + vectorTACPresenceAbsence); }else if(vectorTACPresenceAbsence.getValue(11)==1 & vectorTACPresenceAbsence.getValue(date.getMonth().getMonthNumber())== 1){ // TAC atteint l'an d'avant & deja atteint a cette date (on a pas d effort (t-12)) -> E=Emoy /**On ne change rien E = effort moyen**/ //System.out.println("mois : + "+date.getMonth()+" vectorTACPresenceAbsence : " + vectorTACPresenceAbsence); }else {//TAC pas encore atteint l'anne d'avant ou pas encore a cette date (=on a un effort(t-12)) -> RUM //System.out.println("TAC pas encore atteint l'anne d'avant ou pas encore a cette date (=on a un effort(t-12)) -> RUM!"); if(date.getDate() <12){ /**On fait rien E = E initial**/ //System.out.println("date if a 12 on change rien c est effort.init qui s applique"); }else{ // date > 11 //System.out.println("date >12"); // condition MPA //System.out.println("MPA ?"); boolean result; if(date.before(param_beginDateMPA)) { result = false; } else if(date.after(param_endDateMPA)) { result = false; } else if (date.getMonth().before(param_beginMonthMPA)) { result = false; } else if (date.getMonth().after(param_endMonthMPA)) { result = false; }else { // est ce que la MPA concerne le métier ??? //System.out.println("on est dans les dates de MPA"); MetierMonitor metierMon = context.getMetierMonitor(); for(Strategy strIndex : strategies){ Strategy str = (Strategy)context.getDB().findByTopiaId(strIndex.getTopiaId()); StrategyMonthInfo smi = str.getStrategyMonthInfo(date.getMonth()); Collection<EffortDescription> strMet = str.getSetOfVessels().getPossibleMetiers() ; for (EffortDescription effort : strMet){ Metier met = effort.getPossibleMetiers() ; //System.out.println("boucle sur les metiers pour test MPA?:"+met.getName()); List<Cell> cellMetiers = met.getMetierSeasonInfo(date.getMonth()).getCells(); //System.out.println("cellMetiers "+cellMetiers); List<Cell> cells = param_zoneMPA.getCell(); //System.out.println("cells "+cells); result = !Collections.disjoint(cellMetiers, cells); if (!result){ // result = false : la MPA ne concerne pas le mtier -> RUM matMPAPresenceAbsence.setValue(strIndex,met,date.getMonth(),0); //System.out.println("ma MPA ne s applique pas a ce metier"); }else{ // result = true //System.out.println("condition "+met.getName()+result); //System.out.println("la MPA concerne le mtier : "+ met.getName()); // MPA partielle -> RUM ou totale -> E=0 ??? MetierSeasonInfo infoMetier = met.getMetierSeasonInfo(date.getMonth()); int tailleZoneMetierInitiale = cellMetiers.size(); cellMetiers.removeAll(cells); int tailleZoneMetierNew = cellMetiers.size(); //System.out.println("taille de la zone restante "+tailleZoneMetierNew); if (cellMetiers.size() == 0) { // MPA totale //System.out.println("MPAtotale = metier interdit"); MatrixND noActivity = metierMon.getOrCreateNoActivity(date, ResultName.MATRIX_NO_ACTIVITY, siMatrix.getStrategies(date), siMatrix.getMetiers(date)); metierMon.addforbiddenMetier(met); matMPAPresenceAbsence.setValue(strIndex,met,date.getMonth(),1); smi.setProportionMetier(met, 0); //System.out.println("mat presence absence MPA date : "+ matMPAPresenceAbsence.getValue(strIndex,met,date.getMonth())); //System.out.println("mat presence absence MPA date.prev : "+ matMPAPresenceAbsence.getValue(strIndex,met,date.previous().getMonth())); }else{ // MPA partielle // on rtier //System.out.println("intersection non nulle"); ZoneDAO dao = IsisFishDAOHelper.getZoneDAO(context.getDB()); //System.out.println("MPA partielle utilittier calculee"); // Create new empty zone for cantonnement String name = "ZoneCantonnement-" + metier.getName()+ "-" + date.getDate(); Zone zoneCantonnement = dao.findByName(name); int cpt=0; while (zoneCantonnement != null) { cpt++; zoneCantonnement = dao.findByName(name + "-" + cpt); } zoneCantonnement = dao.create(); if (cpt > 0) { name += "-" + cpt; } zoneCantonnement.setName(name); // Remove prohibited zone and add not prohibited cell to zoneCantonnement Collection<Zone> zoneMetiers = infoMetier.getZone(); for (Iterator<Zone> i=zoneMetiers.iterator(); i.hasNext();) { Zone zone = i.next(); // copy list cell to not modify original zone List<Cell> tmpCells = new ArrayList<Cell>(zone.getCell()); int originalSize = tmpCells.size(); tmpCells.removeAll(param_zoneMPA.getCell()); int tmpSize = tmpCells.size(); //System.out.println("taille new zoen"+tmpCells.size()); zoneCantonnement.addAllCell(tmpCells); //System.out.println("taille de zone cantonnement"+zoneCantonnement.getCell().size()); i.remove(); } //System.out.println("taille de zone cantonnement final"+zoneCantonnement.getCell().size()); ArrayList<Zone> newZone = new ArrayList<Zone>(); newZone.add(zoneCantonnement); infoMetier.setZone(newZone); matMPAPresenceAbsence.setValue(strIndex,met,date.getMonth(),0); //System.out.println("MPA partielle mat presence absence MPA date : "+ matMPAPresenceAbsence.getValue(strIndex,met,date.getMonth())); //System.out.println("MPA partielle mat presence absence MPA date.prev : "+ matMPAPresenceAbsence.getValue(strIndex,met,date.previous().getMonth())); }// MPA partielle }// result = true }// for met } //for str } // est ce que la MPA concerne le metier ? // 1) reccupere les landings values en anchois des metiers anchois le mois precedent MatrixND valueMat = Result.getMatrix(date.previous(), ResultName.MATRIX_GROSS_VALUE_OF_LANDINGS_PER_STRATEGY_MET); MatrixND valuePerMet = valueMat.getSubMatrix(0, new ArrayList(mesStrategies.values()).toArray()); for(Strategy strIndex : strategies){ for(Metier metIndex : metiers){ getMatrixVar(date.previous()).setValue(strIndex,metIndex,LVALUE_A,valuePerMet.getValue(strIndex,metIndex)); } } // Calcul des valeurs non simulees au pas de temps precedant MatrixND EffortNominalPerStrMet_pm = null; //reccupere de l effort nominal par strategy met du pas de temps precedant EffortNominalPerStrMet_pm = Result.getMatrix( date.previous(), ResultName.MATRIX_EFFORT_NOMINAL_PER_STRATEGY_MET); //System.out.println("EffortNominalPerStrMet_pm "+EffortNominalPerStrMet_pm); int comp = 0 ; for(Strategy strIndex : strategies){ comp += 1; //System.out.println("boucle strategie "+strIndex.getName()+" - "+comp); // interdit de faire des set sur les strategies de la semantique de la matrice, il faut recuperer les strategies de la date courante Strategy str = (Strategy)context.getDB().findByTopiaId(strIndex.getTopiaId()); StrategyMonthInfo smi = str.getStrategyMonthInfo(date.getMonth()); Collection<EffortDescription> strMet = str.getSetOfVessels().getPossibleMetiers() ; double effortTotStr = 0 ; if (date.getDate() != 0){ effortTotStr = EffortNominalPerStrMet_pm.getSubMatrix(0,str,1).sumOverDim(1).reduce().getValue(0); } //System.out.println("effort total strategie"+ str.getName() + effortTotStr); //2) calcul les valeurs non simulees du mois précédant et des proportions d effort for (EffortDescription effort : strMet){ Metier met = effort.getPossibleMetiers() ; //System.out.println("Boucle metier 1, metier possible: "+met.getName()); double eff = EffortNominalPerStrMet_pm.getValue(str,met); if(effortTotStr != 0){ getMatrixVar(date.previous()).setValue(str,met,EFFORT,eff / effortTotStr); } else { getMatrixVar(date.previous()).setValue(str,met,EFFORT,0); } //System.out.println("effort str"+str.getName()+met.getName()+" : "+eff); //System.out.println("effortTotStr = "+ effortTotStr); //System.out.println("propMet = "+ getMatrixVar(date.previous()).getValue(str,met,EFFORT)); double valOtherMetOther = 0; //yv double valAnchovyMetOther = 0; //yv double valOtherMetAnchovy = 0;//yv if ("Autre".equals(met.getName())){ if (eff != 0) { valOtherMetOther = matrixCoeffOthers.getValue(str,met,ALPHA_O) + matrixCoeffOthers.getValue(str,met,BETA_O)*eff; valAnchovyMetOther = matrixCoeffOthers.getValue(str,met,ALPHA_A) + matrixCoeffOthers.getValue(str,met,BETA_A)*eff; } getMatrixVar(date.previous()).setValue(str,met,LVALUE_O,valOtherMetOther); getMatrixVar(date.previous()).setValue(str,met,LVALUE_A,valAnchovyMetOther); //System.out.println("LVALUE_O, metOther :"+getMatrixVar(date.previous()).getValue(str,met,LVALUE_O)); //System.out.println("LVALUE_A, metOther :"+getMatrixVar(date.previous()).getValue(str,met,LVALUE_A)); }else { if (eff != 0) { valOtherMetAnchovy = matrixCoeffOthers.getValue(str,met,ALPHA_O) + matrixCoeffOthers.getValue(str,met,BETA_O)*eff; } getMatrixVar(date.previous()).setValue(str,met,LVALUE_O,valOtherMetAnchovy); //System.out.println("LVALUE_O, metAnchovy :"+getMatrixVar(date.previous()).getValue(str,met,LVALUE_O)); } // fin du else met == Autre } // fin de boucle sur les metiers // 3) calcul des pourcentages d effort // a) %Effort pour la premiere année : reccuperation des pourcentages d effort du pas de temps dans la database // map temporaire de stoquage des valeurs de sum cum calculees pour les met de la strategie. Map<Metier, Double> tmp = new HashMap<Metier, Double>(); double tot = 0; List<Double> fuelprice ; fuelprice = (List<Double>)context.getValue("fuelPrice"); if (fuelprice == null){ fuelprice= new ArrayList<Double>(); fuelprice.add(0,param_fuelprice); } // boucle sur les met de la str for (EffortDescription effort : strMet){ Metier met = effort.getPossibleMetiers(); if (matMPAPresenceAbsence.getValue(str,met,date.getMonth()) == 0){ //System.out.println("pas de MPA sur le metier" + met.getName()); // pas de MPA sur le métier Date previousDate = date.previous(); Date previousYear = date.previousYear(); MatrixND matrixVarPreviousMonth = getMatrixVar(previousDate); MatrixND matrixVarPreviousYear = getMatrixVar(previousYear) ; double FuelPrice; if(fuelprice.size() == 1){ FuelPrice = fuelprice.get(0); }else { FuelPrice = fuelprice.get(date.getYear()); } double peff_pm = matrixVarPreviousMonth.getValue(str,met,EFFORT); double peff_py = matrixVarPreviousYear.getValue(str,met,EFFORT); // pour savoir si un des metiers de la strategie a ete interdit au mois precedant /*MatrixND interdit = matMPAPresenceAbsence.copy().getSubMatrix(0,str); MatrixND interdit_pm = interdit.getSubMatrix(2,date.previous().getMonth()); MatrixND interdit_m = interdit.getSubMatrix(2,date.getMonth()); double nbInterdit_pm = interdit_pm.sumOverDim(1).reduce().getValue(0); double nbInterdit_m = interdit_m.sumOverDim(1).reduce().getValue(0); System.out.println("nbInterdit pm:" + nbInterdit_pm); System.out.println("nbInterdit m:" + nbInterdit_m);*/ // calcul des vpue t-1 double Vpue_O = 0; double Vpue_A = 0; /**exemple de cas de fermeture reouverture pour verifier la condition t t+1 t+2 t+3 t+4 met1 0 1 1 0 0 met1 0 0 0 0 0 met2 0 0 0 0 0 met2 0 1 1 1 0 met3 0 0 0 0 0 met3 0 0 1 0 0 nbinterdit 0 1 1 0 0 nb interdit 0 1 2 1 0 sim sim sim moy sim sim sim sim moy moy mais attention cas non couvert : met1 0 0 0 0 0 met2 0 1 1 0 0 met3 0 0 0 1 0 nb interdit 0 1 1 1 0 sim sim sim moy moy */ int reouv = 0; for (EffortDescription effBoucle : strMet){ Metier metBoucle = effBoucle.getPossibleMetiers(); //System.out.println("boucle pour la reouverture : "+metBoucle.getName()); if (matMPAPresenceAbsence.getValue(str, metBoucle,date.getMonth()) < matMPAPresenceAbsence.getValue(str, metBoucle,date.previous().getMonth())){ //System.out.println("réouverture"); reouv += 1; }//else //System.out.println("pas de reouverture pour ce metier"); } //System.out.println("reouverture pour la strategie ? : "+reouv); //if(nbInterdit_m < nbInterdit_pm){// reouverture de zone : si au moins un metier est reouvert on ne sait pas comment faire-> moyen if(reouv > 0){ //System.out.println("reouv > 0"); Vpue_O = matrixAverageVPUE_O.getValue(strIndex,met,previousDate.getMonth()); Vpue_A = matrixAverageVPUE_A.getValue(strIndex,met,previousDate.getMonth()); }else{ // si on a le meme nb de metier que le mois precedant ou qu'un/plusieurs metier(s) vient d etre fermé on utilise les vpue calculées double val_O = matrixVarPreviousMonth.getValue(str,met,LVALUE_O); double val_A = matrixVarPreviousMonth.getValue(str,met,LVALUE_A); double eff_pm = EffortNominalPerStrMet_pm.getValue(str,met); if(eff_pm != 0){ Vpue_O = val_O / eff_pm; //System.out.println("vpue o :"+Vpue_O); Vpue_A = val_A / eff_pm; //System.out.println("vpue a:"+ Vpue_A); } } double utilite = matrixCoeffRUM.getValue(str,met,INTERCEPT) + peff_pm * matrixCoeffRUM.getValue(str,met,EFFORT_PM)*100 //pas utilis 0 + peff_py * matrixCoeffRUM.getValue(str,met,EFFORT_PY)*100 + Vpue_O * matrixCoeffRUM.getValue(str,met,VPUE_O) + Vpue_A * matrixCoeffRUM.getValue(str,met,VPUE_A) + FuelPrice * matrixDistances.getValue(met,str,date.getMonth())* matrixCoeffRUM.getValue(str,met,COST); //System.out.println("tout pour le calcul peff_pm : " + peff_pm + "peff_py : "+peff_py); //System.out.println("tout pour le calcul coeffs : intercept " + matrixCoeffRUM.getValue(str,met,INTERCEPT) + "pm : "+matrixCoeffRUM.getValue(str,met,EFFORT_PM) + "py : "+matrixCoeffRUM.getValue(str,met,EFFORT_PY) + "VPUEO : "+matrixCoeffRUM.getValue(str,met,VPUE_O) + "VPUEA : "+matrixCoeffRUM.getValue(str,met,VPUE_A)); //System.out.println("sumCum :"+utilite); tot += Math.exp(utilite); tmp.put(met,Math.exp(utilite)); }else { // metier interdit double expUtilite = 0; tmp.put(met,expUtilite); } }// fin de boucle sur les metiers pour le calcul utilite // nouvelle boucle sur les metiers de la strategie for (EffortDescription effort : strMet){ Metier met = effort.getPossibleMetiers() ; double percent = 0; if(tot != 0){ percent = tmp.get(met)/tot; } ////System.out.println("tmp.get(met):"+tmp.get(met)+" tot : "+tot); // attribution de la nouvelle prop pour le mois if (!context.getMetierMonitor().getForbiddenMetier().contains(met)) { smi.setProportionMetier(met,percent); //System.out.println("smi set " + met.getName()+ smi.getProportionMetier(met)); } }// for met }// fin de boucle sur les strategies }// date > 11 }//TAC pas encore atteint l'anne d'avant ou pas encore a cette date (=on a un effort(t-12)) -> RUM }// else TAC pas encore atteint double val = 0; if(testTAC) val = 1; vectorTACPresenceAbsence.setValue(date.getMonth().getMonthNumber(),val); }//first = false } /** * Si la condition est vrai alors cette action est execute apres le pas * de temps de la simulation. * @param simulation La simulation pour lequel on utilise cette regle */ public void postAction(SimulationContext context, Date date, Metier metier) throws Exception { first = true;// pour pouvoir passer dans la preaction au prochain pas de temps } }
Le 02/02/2010 11:24, Sigrid LEHUTA a écrit :
Hello, Salut, on a rencontré un probleme récement à propos de l'odre des métiers et des stratégies dans différentes bases. Du coup j airais quelques questions. Voila la situation : En fait l une de nos regles de gestion necessite de charger des coefficients pour chaque métier et strategie à partir de fichiers csv. On avait donc préalablement fait afficher une liste des métiers de la base dans les logs pour savoir dans quel ordre ils étaient rangés, dans quel ordre ils apparaiseent quand on boucle dessus et ranger nos coefficients dans le même ordre dans le csv. - du coup premiere question : d'où vient cet ordre ? par quoi est il déterminé ? Ensuite en voulant utiliser la règle de gestion sur une autre base on s est aperçus que l ordre avait changé. Pourtant cette base avait ete créée a partir de la précédente (par une copie). - du coup on se demande comment ca se fait que l ordre des métiers ait été modifié ?
Finalement pour éviter les problèmes il faudrait que nous chargions nos tableaux de coefficients en s affranchissant de cet ordre. Auiriez vous une idee d un moyen rapide et efficace pour le faire (j ai peur de faire 1000 lignes de code moche, quand 5 jolies suffiraient ;-) ) ? (j ai mis la regle en pj et je suis dispo pour en discuter quand vous voulez) En effet, 1000 lignes, c'est un peux dur, mais j'ai peut être trouvé quelque chose.
mesStrategies = new HashMap<String, Strategy>(); for(Strategy str : allStrategies) { mesStrategies.put(str.getName(), str); } mesStrategies.remove("Espagnols"); Ensuite, tu l'utilise de cette façon : for(Strategy str : mesStrategies.values()){ Si le soucis, se trouve là, c'est qu'une HashMap ne te garanties aucun ordre. http://download.java.net/jdk7/docs/api/java/util/HashMap.html : This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time. Le mieux dans ce cas, est d'utiliser une SortedMap(interface) et son implémentation(TreeMap) du package java.util qui te garantie un ordre,
Au début, tu déclares une map de stratégies de cette façon : par défaut trié suivant l'ordre des clés, les noms de stratégie (alphabétiquement et dépendant de la casse).
Merci d'avance de vos réponses. N'hésites pas si ce n'est pas ça. Sigrid -- Éric <chatellier@codelutin.com> Tel: 02 40 50 29 28 http://www.codelutin.com
Merci pour ta réponse. ca n'est pas tout à fait ça, mais ca confirme ce que je pensais faire. En fait il s agit des metiers on cree des matrices <Metier, coeff> MatrixND matCoeffRum0 = MatrixFactory.getInstance().create( "matCoeffRum0", new List[]{ metiers,coeffRum}, new String[]{"Metiers","Coeff"}); que l on rempli avec des tableaux importés depuis des csv. le pb c est que l ordre des metiers dans les tableaux csv est different de celui dans la liste metiers (siMatrix.getMetiers(date)). Du coup je voulais, creer les matrices en utilisant non pas la liste metiers mais une liste des metiers ordonnés comme dans les csv (list<Metier> metiersNous). C'est bien ce que tu proposais ? Une SortedMap est plus pratique ? et apres on creerait la matrice de cette facon : MatrixND matCoeffRum0 = MatrixFactory.getInstance().create( "matCoeffRum0", new List[]{ metiersNous,coeffRum}, new String[]{"Metiers","Coeff"}); Reste a creer la liste/Map metiersNous, j ai essayé comme ça : protected List<Metier> metiers; protected List<Metier> metiersNous; protected List<String> metiersNomsNous; metiersNomsNous = new ArraysList <String>(){"Espagnols", "BolincheProfil2lan", "BolincheProfil2nord","Autre","PelProfil1Gironde", "PelProfil1Landes", "PelProfil1Nord", "PelProfil1Rochebonne", "PelProfil2Gironde", "PelProfil2Landes", "PelProfil2Nord", "PelProfil2Rochebonne", "BolincheProfil1gir", "BolincheProfil1lan"}; for(int i = 0; i<metiersNomsNous.size(); i++){ for (Metier met : metiers){ if(met.getName().equals(metiersNomsNous.getValue(i))){ metierNous.add(met); } } } Mais je ne dois pas bien declarer ma liste parce qu il rale .... :-( Peux tu m expliquer ? MERCI Eric Chatellier a écrit :
Le 02/02/2010 11:24, Sigrid LEHUTA a écrit :
Hello,
Salut,
on a rencontré un probleme récement à propos de l'odre des métiers et des stratégies dans différentes bases. Du coup j airais quelques questions. Voila la situation : En fait l une de nos regles de gestion necessite de charger des coefficients pour chaque métier et strategie à partir de fichiers csv. On avait donc préalablement fait afficher une liste des métiers de la base dans les logs pour savoir dans quel ordre ils étaient rangés, dans quel ordre ils apparaiseent quand on boucle dessus et ranger nos coefficients dans le même ordre dans le csv. - du coup premiere question : d'où vient cet ordre ? par quoi est il déterminé ? Ensuite en voulant utiliser la règle de gestion sur une autre base on s est aperçus que l ordre avait changé. Pourtant cette base avait ete créée a partir de la précédente (par une copie). - du coup on se demande comment ca se fait que l ordre des métiers ait été modifié ?
Finalement pour éviter les problèmes il faudrait que nous chargions nos tableaux de coefficients en s affranchissant de cet ordre. Auiriez vous une idee d un moyen rapide et efficace pour le faire (j ai peur de faire 1000 lignes de code moche, quand 5 jolies suffiraient ;-) ) ? (j ai mis la regle en pj et je suis dispo pour en discuter quand vous voulez)
En effet, 1000 lignes, c'est un peux dur, mais j'ai peut être trouvé quelque chose.
Au début, tu déclares une map de stratégies de cette façon :
mesStrategies = new HashMap<String, Strategy>(); for(Strategy str : allStrategies) { mesStrategies.put(str.getName(), str); } mesStrategies.remove("Espagnols");
Ensuite, tu l'utilise de cette façon :
for(Strategy str : mesStrategies.values()){
Si le soucis, se trouve là, c'est qu'une HashMap ne te garanties aucun ordre.
http://download.java.net/jdk7/docs/api/java/util/HashMap.html : This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time.
Le mieux dans ce cas, est d'utiliser une SortedMap(interface) et son implémentation(TreeMap) du package java.util qui te garantie un ordre, par défaut trié suivant l'ordre des clés, les noms de stratégie (alphabétiquement et dépendant de la casse).
Merci d'avance de vos réponses.
N'hésites pas si ce n'est pas ça.
Sigrid
-- Sigrid LEHUTA ~ ><> ~ Doctorante Département Ecologie et Modèles pour l'Halieutique IFREMER, rue de l'ile d'Yeu BP 21105 44311 Nantes Cedex 03 Tél : +33 (0)2 40 37 41 23 (interne : 8123)
Le 02/02/2010 12:32, Sigrid LEHUTA a écrit :
Merci pour ta réponse. ca n'est pas tout à fait ça, mais ca confirme ce que je pensais faire. En fait il s agit des metiers on cree des matrices <Metier, coeff> MatrixND matCoeffRum0 = MatrixFactory.getInstance().create( "matCoeffRum0", new List[]{ metiers,coeffRum}, new String[]{"Metiers","Coeff"});
que l on rempli avec des tableaux importés depuis des csv. le pb c est que l ordre des metiers dans les tableaux csv est different de celui dans la liste metiers (siMatrix.getMetiers(date)). En effet, je viens de vérifier ce code, cette méthode retourne une liste ordonnée mais sa construction dépend de l'ordre des statégies dans les paramètres et d'une collection non ordonnée : SetOfVessels.getPossibleMetiers()
Du coup je voulais, creer les matrices en utilisant non pas la liste metiers mais une liste des metiers ordonnés comme dans les csv (list<Metier> metiersNous). C'est bien ce que tu proposais ? Une SortedMap est plus pratique ?
et apres on creerait la matrice de cette facon : MatrixND matCoeffRum0 = MatrixFactory.getInstance().create( "matCoeffRum0", new List[]{ metiersNous,coeffRum}, new String[]{"Metiers","Coeff"});
Reste a creer la liste/Map metiersNous, j ai essayé comme ça : protected List<Metier> metiers; protected List<Metier> metiersNous; protected List<String> metiersNomsNous;
metiersNomsNous = new ArraysList <String>(){"Espagnols", "BolincheProfil2lan", "BolincheProfil2nord","Autre","PelProfil1Gironde", "PelProfil1Landes", "PelProfil1Nord", "PelProfil1Rochebonne", "PelProfil2Gironde", "PelProfil2Landes", "PelProfil2Nord", "PelProfil2Rochebonne", "BolincheProfil1gir", "BolincheProfil1lan"}; for(int i = 0; i<metiersNomsNous.size(); i++){ for (Metier met : metiers){ if(met.getName().equals(metiersNomsNous.getValue(i))){ metierNous.add(met); } } }
Mais je ne dois pas bien declarer ma liste parce qu il rale .... :-(
Peux tu m expliquer ? Il y a un mix list/tableau là :) new String[] { init } ne fonctionne que pour les tableaux. Pour les listes il faut ajouter les éléments un par un.
Essaye cette synthaxe (j'ai pas testé) : protected List<Metier> metiers; protected List<Metier> metiersNous; String[] metiersNomsNous = new String[]{"Espagnols", "BolincheProfil2lan", "BolincheProfil2nord","Autre","PelProfil1Gironde", "PelProfil1Landes", "PelProfil1Nord", "PelProfil1Rochebonne", "PelProfil2Gironde", "PelProfil2Landes", "PelProfil2Nord", "PelProfil2Rochebonne", "BolincheProfil1gir", "BolincheProfil1lan"}; for(String metiersNomCurrent : metiersNomsNous){ for (Metier met : metiers){ if(met.getName().equals(metiersNomCurrent)){ metierNous.add(met); } } } Ce code fonctionne aussi, une SortedMap n'est pas forcement nécessaire.
MERCI -- Éric <chatellier@codelutin.com> Tel: 02 40 50 29 28 http://www.codelutin.com
Merci ca compile ! par contre ca ne tourne pas... cette ligne pose probleme : metiersNous.add(met); null pointer exception la premiere fois qu il la rencontre. est ce que ca ne suffit pas de declarer protected List<Metier> metiersNous; ? Merci Eric Chatellier a écrit :
Le 02/02/2010 12:32, Sigrid LEHUTA a écrit :
Merci pour ta réponse. ca n'est pas tout à fait ça, mais ca confirme ce que je pensais faire. En fait il s agit des metiers on cree des matrices <Metier, coeff> MatrixND matCoeffRum0 = MatrixFactory.getInstance().create( "matCoeffRum0", new List[]{ metiers,coeffRum}, new String[]{"Metiers","Coeff"});
que l on rempli avec des tableaux importés depuis des csv. le pb c est que l ordre des metiers dans les tableaux csv est different de celui dans la liste metiers (siMatrix.getMetiers(date)).
En effet, je viens de vérifier ce code, cette méthode retourne une liste ordonnée mais sa construction dépend de l'ordre des statégies dans les paramètres et d'une collection non ordonnée : SetOfVessels.getPossibleMetiers()
Du coup je voulais, creer les matrices en utilisant non pas la liste metiers mais une liste des metiers ordonnés comme dans les csv (list<Metier> metiersNous). C'est bien ce que tu proposais ? Une SortedMap est plus pratique ?
et apres on creerait la matrice de cette facon : MatrixND matCoeffRum0 = MatrixFactory.getInstance().create( "matCoeffRum0", new List[]{ metiersNous,coeffRum}, new String[]{"Metiers","Coeff"});
Reste a creer la liste/Map metiersNous, j ai essayé comme ça : protected List<Metier> metiers; protected List<Metier> metiersNous; protected List<String> metiersNomsNous;
metiersNomsNous = new ArraysList <String>(){"Espagnols", "BolincheProfil2lan", "BolincheProfil2nord","Autre","PelProfil1Gironde", "PelProfil1Landes", "PelProfil1Nord", "PelProfil1Rochebonne", "PelProfil2Gironde", "PelProfil2Landes", "PelProfil2Nord", "PelProfil2Rochebonne", "BolincheProfil1gir", "BolincheProfil1lan"}; for(int i = 0; i<metiersNomsNous.size(); i++){ for (Metier met : metiers){ if(met.getName().equals(metiersNomsNous.getValue(i))){ metierNous.add(met); } } }
Mais je ne dois pas bien declarer ma liste parce qu il rale .... :-(
Peux tu m expliquer ?
Il y a un mix list/tableau là :) new String[] { init } ne fonctionne que pour les tableaux. Pour les listes il faut ajouter les éléments un par un.
Essaye cette synthaxe (j'ai pas testé) :
protected List<Metier> metiers; protected List<Metier> metiersNous;
String[] metiersNomsNous = new String[]{"Espagnols", "BolincheProfil2lan", "BolincheProfil2nord","Autre","PelProfil1Gironde", "PelProfil1Landes", "PelProfil1Nord", "PelProfil1Rochebonne", "PelProfil2Gironde", "PelProfil2Landes", "PelProfil2Nord", "PelProfil2Rochebonne", "BolincheProfil1gir", "BolincheProfil1lan"}; for(String metiersNomCurrent : metiersNomsNous){ for (Metier met : metiers){ if(met.getName().equals(metiersNomCurrent)){ metierNous.add(met); } } }
Ce code fonctionne aussi, une SortedMap n'est pas forcement nécessaire.
MERCI
-- Sigrid LEHUTA ~ ><> ~ Doctorante Département Ecologie et Modèles pour l'Halieutique IFREMER, rue de l'ile d'Yeu BP 21105 44311 Nantes Cedex 03 Tél : +33 (0)2 40 37 41 23 (interne : 8123)
j ai ajouté : metiersNous = new ArrayList<Metier>(); Ca a l air de marcher, mais je sais pas pourquoi ;-) Sigrid LEHUTA a écrit :
Merci ca compile ! par contre ca ne tourne pas... cette ligne pose probleme :
metiersNous.add(met);
null pointer exception la premiere fois qu il la rencontre. est ce que ca ne suffit pas de declarer protected List<Metier> metiersNous; ?
Merci
Eric Chatellier a écrit :
Le 02/02/2010 12:32, Sigrid LEHUTA a écrit :
Merci pour ta réponse. ca n'est pas tout à fait ça, mais ca confirme ce que je pensais faire. En fait il s agit des metiers on cree des matrices <Metier, coeff> MatrixND matCoeffRum0 = MatrixFactory.getInstance().create( "matCoeffRum0", new List[]{ metiers,coeffRum}, new String[]{"Metiers","Coeff"});
que l on rempli avec des tableaux importés depuis des csv. le pb c est que l ordre des metiers dans les tableaux csv est different de celui dans la liste metiers (siMatrix.getMetiers(date)).
En effet, je viens de vérifier ce code, cette méthode retourne une liste ordonnée mais sa construction dépend de l'ordre des statégies dans les paramètres et d'une collection non ordonnée : SetOfVessels.getPossibleMetiers()
Du coup je voulais, creer les matrices en utilisant non pas la liste metiers mais une liste des metiers ordonnés comme dans les csv (list<Metier> metiersNous). C'est bien ce que tu proposais ? Une SortedMap est plus pratique ?
et apres on creerait la matrice de cette facon : MatrixND matCoeffRum0 = MatrixFactory.getInstance().create( "matCoeffRum0", new List[]{ metiersNous,coeffRum}, new String[]{"Metiers","Coeff"});
Reste a creer la liste/Map metiersNous, j ai essayé comme ça : protected List<Metier> metiers; protected List<Metier> metiersNous; protected List<String> metiersNomsNous;
metiersNomsNous = new ArraysList <String>(){"Espagnols", "BolincheProfil2lan", "BolincheProfil2nord","Autre","PelProfil1Gironde", "PelProfil1Landes", "PelProfil1Nord", "PelProfil1Rochebonne", "PelProfil2Gironde", "PelProfil2Landes", "PelProfil2Nord", "PelProfil2Rochebonne", "BolincheProfil1gir", "BolincheProfil1lan"}; for(int i = 0; i<metiersNomsNous.size(); i++){ for (Metier met : metiers){ if(met.getName().equals(metiersNomsNous.getValue(i))){ metierNous.add(met); } } }
Mais je ne dois pas bien declarer ma liste parce qu il rale .... :-(
Peux tu m expliquer ?
Il y a un mix list/tableau là :) new String[] { init } ne fonctionne que pour les tableaux. Pour les listes il faut ajouter les éléments un par un.
Essaye cette synthaxe (j'ai pas testé) :
protected List<Metier> metiers; protected List<Metier> metiersNous;
String[] metiersNomsNous = new String[]{"Espagnols", "BolincheProfil2lan", "BolincheProfil2nord","Autre","PelProfil1Gironde", "PelProfil1Landes", "PelProfil1Nord", "PelProfil1Rochebonne", "PelProfil2Gironde", "PelProfil2Landes", "PelProfil2Nord", "PelProfil2Rochebonne", "BolincheProfil1gir", "BolincheProfil1lan"}; for(String metiersNomCurrent : metiersNomsNous){ for (Metier met : metiers){ if(met.getName().equals(metiersNomCurrent)){ metierNous.add(met); } } }
Ce code fonctionne aussi, une SortedMap n'est pas forcement nécessaire.
MERCI
-- Sigrid LEHUTA ~ ><> ~ Doctorante Département Ecologie et Modèles pour l'Halieutique IFREMER, rue de l'ile d'Yeu BP 21105 44311 Nantes Cedex 03 Tél : +33 (0)2 40 37 41 23 (interne : 8123)
participants (2)
-
Eric Chatellier -
Sigrid LEHUTA