j'ai commencé à te mettre les elements dont tu avais besoin. 1. un script de type rule boucle à chaque pas de temps sur les metiers. Pour que ta regle ne s'applique qu'une fois à chaque pas de temps verifiant ta condition, il faut ajouter un booleen initialisé à Faux puis mis à TRUE une fois le recrutement affecté realise (dejaFait en haut de la regle puis à l'interieur de preaction et postaction) 2. j'ai mis les objets dont tu avais besoin dans preaction + un debut de script à debugger - Il me manque une fonction java qui permet de tester si un objet est dans la liste. Pour l'instant je l'ai appele DANS. Qqn sait-il si cette fonction existe et quel est son petit nom (je ne l'ai pas vu dans l'API)? List<Zone> zoneRecru = popMon.getRecruitmentZone(); Zone zone = (Zone) sems[1]; if (zone.DANS(zoneRecru)) {} autre question, Jessica, est-ce vraiment le mois de debut et de fin de la repro dont tu as besoin? j'aurais plutot dis recrutement. a+ stephanie Jessica Andre a écrit :
Bonjour,
Je suis en train de créer un Règle pour la répartition de mon recrutement mais j'ai un peu de mal avec ma syntaxe... Y-a que du rouge sur mon écran de vérification :( Le test de condition de la règle est fait et la je suis dans l'action avant du script, et j'essaye d'appeler (sans succès..) la matrice contenant les N de chaque classe pour pouvoir remplacer le N de la classe0 et de la classe 15 avec le nombre de recrus voulu. Quelle est la syntaxe correcte? J'ai attache mon début de règle au cas ou...
Merci d'avance
Jess
-----Original Message----- From: isis-fish-users-bounces@list.isis-fish.org [mailto:isis-fish-users-bounces@list.isis-fish.org] On Behalf Of Stephanie MAHEVAS Sent: Tuesday, 10 May 2011 6:09 PM To: isis-fish-users@list.isis-fish.org Subject: Re: [Isis-fish-users] Repartition du recrutement dans une population male/femelle
Bonjour Jessica, Si tu utilises l'equation de repro effectivement le recrutement se fait automatiquement dans la classe 0, en fonction de p.recru et du delta de mois entre ponte et recru. Il faut donc que tu ecrives une rule (script java à selectionner ensuite avant chaque simu dans l'interface de lancement) recrutement en et que tu mettes for (Zone zone : zoneRepro){ result.setValue(zone,0);}return 0; dans l'equation de repro. Dans ce script tu mets directement dans action avant de la regle ton recruit/8 dans la classe 0 dans la zone de recutement et dansla classe 15 dans la zone de recrutement et ce pour chaque mois du recutement (test de condition de la regle). Tu n'as alors plus besoin de delta de mois ni de p.recru je t'attache une vieille regle de recrutement dont tu pourras t'inspirer en reprenant la structure d'une regle plus actuelle pour la syntaxe et de l'API biensur ;-) a+ stephanie
Jessica Andre a écrit :
Bonjour,
J'ai une population structurée en longueur avec les 15 premiers groupes représentant les males et les 15 autres les femelles. La reproduction s'effectue sur 4 mois. Comme je n'ai pas d'équation stock-recrutement, je fourni le nombre de recrus chaque année directement dans l'équation de reproduction :
-------------------------------------------------------------------------------------------------
int recruit = 0;
int currentYear = context.getSimulationControl().getDate().getYear();
// recruitement of males (Age 0=recruit) has both male and female recruits.
// They are then split in the transition tables (0.5 goes to female recruits=Age15)
if (currentYear==0) recruit=28242;//Year1=1998
else if (currentYear==1) recruit=30735;//Year1=1999
else if (currentYear==2) recruit=128069;//Year2=2000
else if (currentYear==3) recruit=133271;//Year3=2001
else if (currentYear==4) recruit=66466;//Year4=2002
else if (currentYear==5) recruit=136641;//Year5=2003
else if (currentYear==6) recruit=97484;//Year6=2004
else if (currentYear==7) recruit=118732;//Year7=2005
else if (currentYear==8) recruit=51677;//Year8=2006
else if (currentYear==9) recruit=57565;//Year9=2007
else recruit=40947;//Year10=2008
for (Zone zone : zoneRepro){
result.setValue(zone, recruit/4);//4 corresponds to the 4 months of reproduction
}
return 0;
--------------------------------------------------------------------------------------------------------
En conséquence, mes recrus s'effectuent bien sur 4 mois avec ¼ du recrutement annuel par mois de reproduction, mais elles sont toute dans le groupe Age0 qui correspond aux recrus males seulement. Je veux que la moitie de ces recrus aillent dans le groupe Age15 qui correspondent aux recrus femelles. Je ne vois pas comment le faire depuis l'équation alors j'ai tenté de le faire depuis la matrice de transition dans l'onglet saison, en mettant durant la saison de reproduction une transition de 0.5 de l'Age0 a l'Age0 et 0.5 de l'Age 0 a l'Age15. Ca me séparent bien les recrus mais pas comme il faut (recrutement des femelles est décalé d'un mois, le nombre de recrus n'est pas reparti selon mes attentes)
Alors je me re-pose la question : comment est-ce-que je réparti correctement mes recrus entre males et femelles ?
Merci d' avance !
Jess
***************************************************************************************
*Dr Jessica André*
Junior Research Fellow
Wild Fisheries Program-Fisheries Aquaculture & Coasts (FAC)
Institute for Marine and Antarctic Studies (IMAS)
University of Tasmania, Private Bag 49
Hobart, TAS 7001, Australia
Ph: (03) 6227 7284 /Int: +61 3 6227 7284
Fax: (03) 6227 8035 /Int: +61 3 6227 8035
Email: Jessica.Andre@utas.edu.au
Web: http://fcms.its.utas.edu.au/scieng/mrl/pagedetails.asp?lPersonId=3177
`·.,, ><(((º> `·.,, ><(((º> `·.,, ><(((º>
------------------------------------------------------------------------
_______________________________________________ Isis-fish-users mailing list Isis-fish-users@list.isis-fish.org http://list.isis-fish.org/cgi-bin/mailman/listinfo/isis-fish-users
------------------------------------------------------------------------
_______________________________________________ Isis-fish-users mailing list Isis-fish-users@list.isis-fish.org http://list.isis-fish.org/cgi-bin/mailman/listinfo/isis-fish-users
-- ...................................................................... Stephanie MAHEVAS (Stephanie.Mahevas@ifremer.fr) IFREMER/EMH (Ecologie et Modèles pour l'Halieutique) Tel: (33) 2 40 37 41 81 Fax: (33) 2 40 37 40 75 o \ o / _ o __| \ / |__ o _ \ o / o /|\ | /\ ___\o \o | o/ o/__ /\ | /|\ / \ / \ | \ /) | ( \ /o\ / ) | (\ / | / \ / \ ...................................................................... /* * Copyright (C) 2011 jandre * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ package rules; import static org.nuiton.i18n.I18n._; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import scripts.ResultName; import scripts.SiMatrix; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.io.Writer; import org.nuiton.math.matrix.*; import fr.ifremer.isisfish.util.Doc; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.types.Date; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.rule.AbstractRule; import fr.ifremer.isisfish.datastore.SimulationStorage; import fr.ifremer.isisfish.datastore.ResultStorage; import fr.ifremer.isisfish.IsisFishDAOHelper; import fr.ifremer.isisfish.simulator.MetierMonitor; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.types.Date; import fr.ifremer.isisfish.types.Month; import fr.ifremer.isisfish.entities.*; import fr.ifremer.isisfish.rule.AbstractRule; /** * Recruit_distribution_BMW.java * * Created: 11 mai 2011 * * @author jandre <user.name@vcs.hostName> * @version $Revision: 1545 $ * Last update: $Date: 11 mai 2011 $ * by : $Author: jandre $ */ public class Recruit_distribution_BMW extends AbstractRule { /** to use log facility, just put in your code: log.info("..."); */ private static Log log = LogFactory.getLog(Recruit_distribution_BMW.class); @Doc("Recruitment 1998") public double param_recruit1998 = 28242; @Doc("Recruitment 1999") public double param_recruit1999 = 30735; @Doc("Recruitment 2000") public double param_recruit2000 = 128069; @Doc("Recruitment 2001") public double param_recruit2001 = 133271; @Doc("Recruitment 2002") public double param_recruit2002 = 66466; @Doc("Recruitment 2003") public double param_recruit2003 = 136641; @Doc("Recruitment 2004") public double param_recruit2004 = 97484; @Doc("Recruitment 2005") public double param_recruit2005 = 118732; @Doc("Recruitment 2006") public double param_recruit2006 = 51677; @Doc("Recruitment 2007") public double param_recruit2007 = 57565; @Doc("Recruitment 2008") public double param_recruit2008 = 40947; @Doc("Month for begining of reproduction") public Month param_beginrepro = Month.FEBRUARY; @Doc("Month for end of reproduction") public Month param_endrepro = Month.MAY; public Population param_Population = null; boolean dejaFait = false; #pour ne pas le faire pour chaque metier //************************************************************************************************* public String [] necessaryResult = { // put here all necessary result for this rule // example: // ResultName.MATRIX_BIOMASS, // ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET, }; 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() throws Exception { // TODO return _("Allow to distribute the recruits between males (age0-Age14) and females (Age15-Age29. Recruits" + "for the year are distributed 50% towrads Age0 and 50% towards Age15. Because reproduction takes place over 4 months,"+ "each reproduction month receive 1/4 of recruits"); } //************************************************************************************************* /** * Appele au demarrage de la simulation, cette methode permet d'initialiser * des valeurs * @param simulation La simulation pour lequel on utilise cette regle */ public void init(SimulationContext context) throws Exception { } //************************************************************************************************* /** * 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 { log.info("Finds out if the rule applies (i.e. if we are in the reproductive months"); boolean result = true; if (date.getMonth().before(param_beginrepro)) { return false; } else if (date.getMonth().after(param_endrepro)) { return false; } return result; } //************************************************************************************************* /** * Si la condition est vrai alors cette action est executee 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 { System.out.println("deja fait ? "+ dejaFait); if (dejaFait == false){ log.info("Pre-simulation: applies the rule to the month of reproduction"); int currentYear = context.getSimulationControl().getDate().getYear(); PopulationMonitor popMon = context.getPopulationMonitor(); MatrixND eff = popMon.getN(param_Population); #zone de recrutement de la population - peut etre une liste de zones de presence List<Zone> zoneRecru = popMon.getRecruitmentZone(); for (MatrixIterator i = eff.iterator(); i.hasNext();){ i.next(); Object[] sems = i.getSemanticsCoordinates(); PopulationGroup group = (PopulationGroup) sems[0]; Zone zone = (Zone) sems[1]; System.out.println("zone :"+ zone+ " group:"+group.getId()); if ((zone.DANS(zoneRecru) & ((group.getId() == 0 || (group.getId() == 15))) ){ if (currentYear==0){ i.setValue(param_recruit1998/8); }// Year0 =1998 else if (currentYear==1){}// Year1 =1999 else if (currentYear==2){}// Year2 =2000 else if (currentYear==3){}// Year3 =2001 else if (currentYear==4){}// Year4 =2002 else if (currentYear==5){}// Year5 =2003 else if (currentYear==6){}// Year6 =2004 else if (currentYear==7){}// Year7 =2005 else if (currentYear==8){}// Year8 =2006 else if (currentYear==9){}// Year9 =2007 else {}// Year10 =2008 } } dejaFait = true ; #pour ne pas le refaire au metier suivant } } //************************************************************************************************* /** * Si la condition est vrai alors cette action est executee 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 { dejaFait = false; } }