Subject: Re: RE : Can instance variable be a sortedcollection?
From: Pierre Bommel (bommel@cirad.fr)
Date: Tue May 09 2006 - 15:45:17 CEST
Hello Miao,
Just a word to say that if you follow the solution of Christophe, it is
safer to use an IdentityDictionary rather than a simple Dictionary.
> initRecords
> self records: IdentityDictionary new.
> self targets do: [:aTarget | self records at: aTarget put: 0].
If you want to get your records sorted by time access, you can also add
the following method :
sortedRecords
| sortedTimes sortedRecords |
sortedTimes := self records asSortedCollection:[:i :j | i < j].
sortedRecords := OrderedCollection new.
sortedTimes do: [: time | sortedRecords add: (records keyAtValue:
time)].
^sortedRecords
Pierre
Le 9 mai 06, à 00:23, Christophe Le Page a écrit :
>
> Hello Miao,
>
> Instance variables can be any kind of objects, so no problem for
> having an instance variable being a kind of collection.
>
> If the targets don't have to be visited in a specific sequence (T1
> before T2 before T3 ...), then you'd probably better to use a
> Dictionary where keys would be targets and values the time-step where
> an agent will have visited each of them (0 for not yet visited). This
> way you will record the sequence and even the delays between visits to
> targets (this way you will be able to compute statistics about target
> reaching efficiency).
>
> For each agent, is "targets" already an instance variable?
> It should probably be a kind of Set.
> Assuming "targets" is known, you can prepare "records" like this:
>
> initRecords
> self records: Dictionary new.
> self targets do: [:aTarget | self records at: aTarget put: 0].
>
> In the main method of your Agent, you need to pass the time-step “t”
> as an argument.
> Then you could have something like:
>
> step: t
> …
> self move. “to be defined”
> ((self targets includes: self patch) and: [(self records at: self
> patch) isZero])
> ifTrue: [self records at: self patch put: t]
>
> An accessing method to get the unvisited targets
> unvisitedTargets
> ^self targets select: [:aTarget | (self records at: aTarget) isZero]
>
> Hope this will help you!
> Best,
> Clp
>
> > -----Message d'origine-----
> > De : owner-cormas@cirad.cirad.fr
> [mailto:owner-cormas@cirad.cirad.fr] De
> > la part de Miao Wang
> > Envoyé : mardi 9 mai 2006 06:42
> > À : cormas@cirad.fr
> > Objet : Can instance variable be a sortedcollection?
> >
> > Hi!
> >
> > I want to let my agents to visit several targets. I want to set a
> > instance variable of agent to make a record of whether a agent has
> been to
> > the targes.
> >
> > For example there are 5 targets(T1,T2,...T5) for each agent to go.
> Then
> > the instance variable named 'Record' should be a
> > sortedcollection(R1,R2,...R5), the initial value of R are all 0,
> then if
> > the agent has been to target T1, then R1=1, if he has been to target
> T2,
> > then R2=1, In this way the agent can have a memory and not to go
> to a
> > target more than one time.( Target in my model is a kind of
> attribute of
> > spatial entity-Cell, I don't want to change it's target attribute)
> >
> > Can instance variable be a sortedcollection? if it is possible, how
> can I
> > connected sortedcollection T(T1,T2,...Tn) with sortedcollection
> > R(R1,R2,...Rn)?
> >
> > It would be very appriciated if anyone can help me. Great thanks!!
> >
> > Forgive me for lacking knowledge of smalltalk!
> >
> >
> > Mira
> >
> > Miao Wang at Geomatics
> > School of Civil Engineering and Geosciences
> > G.19, Cassie Building,
> > University of Newcastle Upon Tyne, NE1 7RU
> > England
> > Email: miao.wang1@ncl.ac.uk
> >
> >
>
>
Pierre Bommel - CIRAD - UR Green
Universidade de Brasília - Centro de Desenvolvimento Sustentável
SHIS QI 26, Conjunto 15, Casa 18
71670-150
Brasília DF
tel: (00 55 61) 3367 3405
http://www.cirad.fr/ur/green