[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Swarm-Support] Multiple Agents in One Cell
From: |
Crile Doscher |
Subject: |
Re: [Swarm-Support] Multiple Agents in One Cell |
Date: |
Thu, 25 Aug 2005 14:21:32 -0400 |
Hi Ken,
I guess I was a little too selective in my cutting and pasting - there's
a sliver of code missing that initialises x and y after making a conversion
from NZMG coordinates to the swarm grid coordinates.
//if its within the space, convert the coords to swarm
//and input the data
if ((nzmgX >= xOriginM && nzmgX <= xEndM) &&
(nzmgY <= yOriginM && nzmgY >=yEndM)) {
x = [self convertNZMGX: nzmgX];
y = [self convertNZMGY: nzmgY];
Aside from that, this is part of the code that was working before I tried
inserting the lists. Your efforts are appreciated!
C
----- Original Message -----
From: "Ken Cline" <address@hidden>
To: "Swarm Support" <address@hidden>
Sent: Thursday, August 25, 2005 1:20 PM
Subject: Re: [Swarm-Support] Multiple Agents in One Cell
printf ("Scanning through file for data points\n");
for (incy=0; incy <numRows; incy++) {
for (incx=0; incx < numCols; incx++) {
// scan the datapoint - datapoint is the elevation value
// from the ascii file
float datapoint;
int datapoint2;
datapoint = [self getDataPoint];
// printf("datapoint = %f\n", datapoint);
// datapoint2 = (int) datapoint;
// printf("datapoint2 = %d\n", datapoint2);
// if its within the space, convert the coords to swarm
// and input the data
if (fileID == 0)
[ [cellSurface getCellAtX: x Y: y] setElevLevel: dataPoint];
data2 = [[cellSurface getCellAtX: x Y: y] getElevLevel];
// more diagnostics here
// printf("Elevation here (data2) = %f\n", data2);
// This currently returning "NaN"
// Testing out list creation here instead of in
// Cell: -createEnd
// list = [List create: [self getZone]];
// implmenting this here hasn't helped
}
// else if not within space, do nothing but scan the
// next datapoint
// move ahead one cell
// printf ("Still in the inputData method...");
nzmgX = nzmgX + cellSize;
// printf("x = %f, y = %f\n", nzmgX, nzmgY);
}
Your problem might be that the for-loop indexes are 'incx' and 'incy'
yet you are using (un-initialized) local variables named 'x' and 'y'
to access the cell.
Also, you only set the elevation value if fileID == 0. Is that
intentional?
Hope that helps.
Ken
--- Crile Doscher <address@hidden> wrote:
Thanks for that, Steve. That's an excellent point about using two
separate
space objects. That might be a relatively easy way around this. Below
I'll
try to post some of the code that *I think* is relevant - I'll admit to
being a bit unsure about what will be most helpful to post. Is there a
better way to post this? A tarball perhaps? Nonetheless, a brief summary
of what's below:
Selection from Cell.m: -createEnd and -createCollection - a la Opinion,
the
list is created here at the end of cell creation. Plus -set
and -getElevLevel, elevlevel being the elevation value, and -insertItem,
borrowed from MultiGrid2d to insert an agent into a cell's list.
Selections from CellSurface.m: -fillWithCells (adds data to cells)
and -findSteepestSlope (determines the best cell for the primary agent to
move to - where the current failure seems to occur)
Selection from DataFile.m: -inputData (reads in elevation values from an
ascii raster grid file)
Selected code from Cell.m:
//Cell.m a swarmobject that fills in each point in the cellSurface lattice
//cell objects hold variables for GIS data layers. They can change these
//variables as well as communicate with neighboring cells in the lattice.
//cells can also implement cellular automata-like functions.
//Cell.m is based on Paul Box's Biox model
//changes made by Crile Doscher, September 04, for Drop
#import "Cell.h"
#import "ModelSwarm.h"
@implementation Cell
- createEnd
{
[self createCollection]; //This creates the list
return [super createEnd];
}
- (id) createCollection
{
//Borrowed from MulitGrid2d
list = [List create: [self getZone]];
return list;
}
-step {
// here put things that all cells do at each time step. Especially,
// place here functions that involve doing things and sending
// messages to neighbor cells
return self;
}
/////////////////////////////////////////////////////////////////////////
//here is where we put methods for setting and retrieving variables
//specific to our model. Replace these with your own
-setElevLevel: (float) e { //ElevLevel is the elevation value in each cell
elevLevel = e;
//printf("Cell.m: elevLevel = %f\n", elevLevel);
return self;
}
-(float) getElevLevel {
return elevLevel;
}
///////////////////////////////////////////////////////////////////////////
- (BOOL) insertItem: obj //19 August 05 - CD added to get agents into
lists
{
[list addFirst: obj];
return YES;
}
@end
>From CellSurface.m - this method creates the cells
-fillWithCells {
int incx, incy;
Cell * cell;
printf ("Initializing the lattice...\n\n ");
cellList = [List create: [self getZone]];
//first create empty cell objects and place them in the lattice
for (incy = 0; incy < ysize; incy++)
for (incx = 0; incx < xsize; incx++) {
// allocate memory for a temporary cell
cell = [Cell createBegin: [self getZone]];
// tell the cell where it is
[cell setModel: modelSwarm andCellSurface: self];
[cell setX: incx Y: incy];
cell = [cell createEnd];
//place the cell at its point in the lattice
[self putObject: cell atX: incx Y: incy];
[cellList addLast: cell];
}
printf("cellSurface, created %d x %d cells.\n", ysize, xsize);
return self;
}
Also from CellSurface.m - this method determines which cell is the best
one
to move to - roughly based on HeatBugs movement
// New method to find the steepest slope adapted from Heatbugs.
// Search the 9 cell neighbourhood for the steepest slope.
- (ElevValue)findSteepestSlopeAtX: (int *) px Y: (int *) py
{
float maxSlope;
float elevHere;
int x, y;
id <List>slopeList;
id cell, bestCell;
int offset;
printf("Inside findSteepestSlopeAtX now\n");
elevHere = [[self getCellAtX: *px Y: *py] getElevLevel];
printf("CellSurface.m: x = %d, y = %d\n", *px, *py);
printf("CellSurface.m: elevHere = %f\n\n", elevHere);
maxSlope = 0; //not sure if this is the best place to do this...
// Now scan through the world, finding the slopes to the 8 cell
// neighbours, determing the best, or the best equal
slopeList = [List create: [self getZone]];
for (y = *py -1; y <= *py + 1; y++) {
for (x = *px - 1; x <= *px + 1; x++) {
float elevThere;
float slopeValue;
elevThere = [[self getCellAtX: x Y: y] getElevLevel];
// elevThere = (int) elevThere;
// elevThere = [self getValueAtX: (x+xsize)%xsize Y:
(y+ysize)%ysize];
printf ("@ (%d, %d) = %f ", x, y, elevThere);
if (x == *px || y == *py) {
// if the cell we're in is N,S,E or W, don't divide by 1.414
slopeValue = elevHere - elevThere;
printf("CellSurface.m:slopeValue = %f (loop1)\n", slopeValue);
} else {
slopeValue = (elevHere - elevThere)/1.414;
// if the cell is on the diagonal, divide by 1.414
printf("CellSurface.m:slopeValue = %f (loop2)\n", slopeValue);
}
if (slopeValue > maxSlope) {
cell = [[[ElevCell create: [self getZone]] setX:x] setY:y];
[slopeList deleteAll];
[slopeList addLast: cell];
maxSlope = slopeValue;
}
printf("CellSuface.m:maxSlope = %f\n", maxSlope);
if (slopeValue == maxSlope) {
cell = [[[ElevCell create: [self getZone]] setX: x] setY: y];
[slopeList addLast: cell];
} // close else loop
} // close x loop
} // close y loop
Code below deleted for brevity...
>From DataFile.m - this method imports elevation values from the
>ascii raster grid file
-inputData: (int) f {
int incx, incy, x, y;
int data1, result; //for debugging
// float data2;
float nzmgX, nzmgY; //nzmg = New Zealand Map Grid - local coordinate
system
// id list; //needed to create list in this method 24/8/05
fileID = f;
printf ("Importing data from fileID:%d %s..\n", fileID, fileName);
// first put nodatavalues in all the cells. Can be overwritten in
// the next steps if a cell contains information
printf("Putting nodata values in all the cells. fileID = %d\n", fileID);
// printf("cellSurface = %s\n",[cellSurface getInstanceName]);
for (incy = 0; incy < ysize; incy++){
for (incx = 0; incx < xsize; incx++) {
if (fileID == 0)
[[cellSurface getCellAtX: incx Y: incy]
setElevLevel: noDataValue]; //defined in cell.hm
data1 = [[cellSurface getCellAtX: incx Y: incy] getElevLevel];
// next three lines her for diagnostics
printf("Elevation here (data1) = %d\n", data1); //This returns
2147483648 consistently
printf("noDataValue = %d\n", noDataValue);
}
}
printf ("Scanning through file for data points\n");
for (incy=0; incy <numRows; incy++) {
for (incx=0; incx < numCols; incx++) {
// scan the datapoint - datapoint is the elevation value
// from the ascii file
float datapoint;
int datapoint2;
datapoint = [self getDataPoint];
// printf("datapoint = %f\n", datapoint);
// datapoint2 = (int) datapoint;
// printf("datapoint2 = %d\n", datapoint2);
// if its within the space, convert the coords to swarm
// and input the data
if (fileID == 0)
[ [cellSurface getCellAtX: x Y: y] setElevLevel: dataPoint];
data2 = [[cellSurface getCellAtX: x Y: y] getElevLevel];
// more diagnostics here
// printf("Elevation here (data2) = %f\n", data2);
// This currently returning "NaN"
// Testing out list creation here instead of in
// Cell: -createEnd
// list = [List create: [self getZone]];
// implmenting this here hasn't helped
}
// else if not within space, do nothing but scan the
// next datapoint
// move ahead one cell
// printf ("Still in the inputData method...");
nzmgX = nzmgX + cellSize;
// printf("x = %f, y = %f\n", nzmgX, nzmgY);
}
}
// end else (data overlaps main data set)
printf ("successfully scanned data file\n\n");
return self;
}
----- Original Message -----
From: "Steve Railsback" <address@hidden>
To: "Swarm Support" <address@hidden>
Sent: Thursday, August 25, 2005 11:24 AM
Subject: Re: [Swarm-Support] Multiple Agents in One Cell
> Crile Doscher wrote:
>> Hi there SwarmList,
> ...
>
>> So, have I been sloppy in creating my lists? My gut feeling is that
>> my
>> cells should be able to hold both elevations and lists and I simply
>> haven't implemented this well. Could the order in which the list is
>> added and elevation values read in be causing a problem? Any thoughts?
>
> Crile: I think you will have to post your cell code and the methods that
> call it for anyone to help.
>
> Also: Remember that you can use two separate space objects. If your
> Discrete2D holding elevations works already, you could just leave it
> alone
> and create a separate MultiGrid2d to keep the agents. The agents would
> then look in the elevation space to get their elevation.
>
> Steve R.
> --
> Lang Railsback & Assoc.
> 250 California Ave.
> Arcata, California 95521
> (707) 822-0453
_________________________________________________________
Ken Cline W: (443) 287-2636
address@hidden
_______________________________________________
Support mailing list
address@hidden
http://www.swarm.org/mailman/listinfo/support