Another solution to the shuffle is to use a class that wraps a
MersenneTwisterFast and extends Random. Like so:
class MTFWrapper extends Random
{
MersenneTwisterFast rng;
public MTFWrapper(MersenneTwisterFast r) { rng = r; }
public synchronized void setSeed(long seed) { rng.setSeed(seed); }
public synchronized int nextInt() { return rng.nextInt(); }
public synchronized int nextInt(int n) { return rng.nextInt(n); }
public synchronized long nextLong() { return rng.nextLong(); }
public synchronized boolean nextBoolean() { return rng.nextBoolean(); }
public synchronized float nextFloat() { return rng.nextFloat(); }
public synchronized double nextDouble() { return rng.nextDouble(); }
public synchronized void nextBytes(byte[] bytes) {
rng.nextBytes(bytes); }
public synchronized double nextGaussian() { return rng.nextGaussian();
}
}
Then you can shuffle any collection you want:
Collections.shuffle(agentList, new MTFWrapper(state.random));
Another method still is to write your own shuffle function:
public static void shuffle(List list, MersenneTwisterFast mtf)
{
int numObjs = list.size();
Object obj;
int rand;
for(int x=numObjs-1; x >= 1 ; x--)
{
rand = mtf.nextInt(x+1);
obj = list.get(x);
list.set(x, list.get(rand));
list.set(rand, obj);
}
}
Note: I'm nearly certain Sean wrote this code.
Good luck,
Joey
On Tue, Oct 27, 2015 at 7:29 PM, Joey Harrison <[log in to unmask]>
wrote:
> Another solution to the shuffle is to use a class that wraps a
> MersenneTwisterFast and extends Random. Like so:
>
> class MTFWrapper extends Random
> {
> MersenneTwisterFast rng;
>
> public MTFWrapper(MersenneTwisterFast r) { rng = r; }
> public synchronized void setSeed(long seed) { rng.setSeed(seed); }
> public synchronized int nextInt() { return rng.nextInt(); }
> public synchronized int nextInt(int n) { return rng.nextInt(n); }
> public synchronized long nextLong() { return rng.nextLong(); }
> public synchronized boolean nextBoolean() { return rng.nextBoolean(); }
> public synchronized float nextFloat() { return rng.nextFloat(); }
> public synchronized double nextDouble() { return rng.nextDouble(); }
> public synchronized void nextBytes(byte[] bytes) {
> rng.nextBytes(bytes); }
> public synchronized double nextGaussian() { return
> rng.nextGaussian(); }
> }
>
> Then you can shuffle any collection you want:
> Collections.shuffle(agentList, new MTFWrapper(state.random));
>
> Another method still is to write your own shuffle function:
>
> public static void shuffle(List list, MersenneTwisterFast mtf)
> {
> int numObjs = list.size();
> Object obj;
> int rand;
>
> for(int x=numObjs-1; x >= 1 ; x--)
> {
> rand = mtf.nextInt(x+1);
> obj = list.get(x);
> list.set(x, list.get(rand));
> list.set(rand, obj);
> }
> }
>
> Note: I'm nearly certain Sean wrote this code.
>
> Good luck,
> Joey
>
> On Sun, Oct 25, 2015 at 12:12 AM, Russell Thomas <
> [log in to unmask]> wrote:
>
>> I have accomplished this by having an łagents" Bag variable in the main
>> class (SimState), and then every time I create a new object, I add it to
>> the łagents" bag. Then I iterate over all agents simply by looping using
>> get() method. If your agents ever die, then you also need to remove them
>> from the łagents˛ bag. This, of course, requires passing the SimState
>> object to what ever object is iterating over all agents. But, in my case,
>> these objects involved UI, data collection, debug, and other
>> administrative functions, and not objects within the model Iąm simulating.
>>
>> With this method, you never need to be concerned with where they might
>> reside in any other data structure, including ObjectGrid or SparseGrid.
>>
>> Russ
>>
>> On 10/24/15, 9:56 PM, "MASON Multiagent Simulation Toolkit on behalf of
>> Sean Luke" <[log in to unmask] on behalf of
>> [log in to unmask]> wrote:
>>
>> >Iterating over all the objects in an ObjectGrid2D means iterating over
>> >every single
>> >cell in the array. If you don't have a lot of objects relative to the
>> >cells, this can
>> >be very slow, and it would make more sense to use a SparseGrid2D instead.
>> >
>> >You could use a double for-loop to go through all the objects. But
>> >elements() isn't too slow, and it's O(1).
>> >
>> >Sean
>> >
>> >On Oct 24, 2015, at 10:37 AM, Axel Kowald <[log in to unmask]> wrote:
>> >
>> >> Hello Together,
>> >>
>> >> I just wonder what the best way is to iterate over all the agent on my
>> >> ObjectGrid2D ?
>> >> Currently I'm extracting a Bag with all agents by using the elements()
>> >> method. It works, but I'm not sure how fast/slow it is. Would it be
>> >> worth to maintain my own Bag and do the bookkeeping by
>> >> inserting/removing agents when needed?
>> >>
>> >> thanx,
>> >> Axel
>>
>
>
|