What's the reasoning behind having the current cell maneuver around the grid that way as opposed to a strict left-to-right, top-to-bottom approach? If there isn't a modeling requirement for a more complicated approach I'd suggest something simple that can easily be tested using TDD patterns.

On Wed, Apr 4, 2018 at 11:30 AM, Stewart Aitken wrote:
Hello,

If possible can you point out what changes are required.

Included in this message are a small movie of the horizontal rectangle and the vertical rectangle of the same overall grid size.
It can be seen that the issue is not the ObjectGrid2D but rather the neighbourhood method.

I have been through the code thoroughly and cannot find the error.

The default neighbour priority order looks like [ x-1, y, ], [ x, y-1 ]. [x+1, y ], [ x, y+1 ] from the central cell.

It appears to be related to the von Neumann neighbours method used in the replicate part of Agents2. I have changed the distance to 1
rather than the 8 shown previously so the next cell location should be simple to identify.
The horizontal rectangle appears correct whilst the vertical rectangle has two issues.

If the start cell is on the bottom row other than in the L/H/Corner the next cell is located at x = x-1, y = 0 rather than the correct location.

Secondly the bottom row is not recognised by the returning child and thus there are empty cells that could be occupied.

This works completely as expected.

Horizontal
Start X = 5 : Start Y =  4
nextX = 4 : NextY =  : 4 : counter =  : 1  Cells remaining :28
nextX = 3 : NextY =  : 4 : counter =  : 2  Cells remaining :27
nextX = 2 : NextY =  : 4 : counter =  : 3  Cells remaining :26
nextX = 1 : NextY =  : 4 : counter =  : 4  Cells remaining :25
nextX = 0 : NextY =  : 4 : counter =  : 5  Cells remaining :24
nextX = 0 : NextY =  : 3 : counter =  : 6  Cells remaining :23
nextX = 0 : NextY =  : 2 : counter =  : 7  Cells remaining :22
nextX = 0 : NextY =  : 1 : counter =  : 8  Cells remaining :21
nextX = 0 : NextY =  : 0 : counter =  : 9  Cells remaining :20
nextX = 1 : NextY =  : 0 : counter =  : 10  Cells remaining :19
nextX = 2 : NextY =  : 0 : counter =  : 11  Cells remaining :18
nextX = 3 : NextY =  : 0 : counter =  : 12  Cells remaining :17
nextX = 4 : NextY =  : 0 : counter =  : 13  Cells remaining :16
nextX = 5 : NextY =  : 0 : counter =  : 14  Cells remaining :15
nextX = 5 : NextY =  : 1 : counter =  : 15  Cells remaining :14
nextX = 4 : NextY =  : 1 : counter =  : 16  Cells remaining :13
nextX = 3 : NextY =  : 1 : counter =  : 17  Cells remaining :12
nextX = 2 : NextY =  : 1 : counter =  : 18  Cells remaining :11
nextX = 1 : NextY =  : 1 : counter =  : 19  Cells remaining :10
nextX = 1 : NextY =  : 2 : counter =  : 20  Cells remaining :9
nextX = 2 : NextY =  : 2 : counter =  : 21  Cells remaining :8
nextX = 3 : NextY =  : 2 : counter =  : 22  Cells remaining :7
nextX = 4 : NextY =  : 2 : counter =  : 23  Cells remaining :6
nextX = 5 : NextY =  : 2 : counter =  : 24  Cells remaining :5
nextX = 5 : NextY =  : 3 : counter =  : 25  Cells remaining :4
nextX = 4 : NextY =  : 3 : counter =  : 26  Cells remaining :3
nextX = 3 : NextY =  : 3 : counter =  : 27  Cells remaining :2
nextX = 2 : NextY =  : 3 : counter =  : 28  Cells remaining :1
nextX = 1 : NextY =  : 3 : counter =  : 29  Cells remaining :0

The only change to the code is to swap the gridWidth and gridHeight.
The first child is incorrect for the von Neumann neighbourhood with a distance of 1.
in the film you can see the finish is correct as the last child is surrounded with occupied cells.

Vertical
Start X = 4 : Start Y =  5
nextX = 3 : NextY =  : 0 : counter =  : 1  Cells remaining :28
nextX = 2 : NextY =  : 0 : counter =  : 2  Cells remaining :27
nextX = 1 : NextY =  : 0 : counter =  : 3  Cells remaining :26
nextX = 0 : NextY =  : 0 : counter =  : 4  Cells remaining :25
nextX = 0 : NextY =  : 1 : counter =  : 5  Cells remaining :24
nextX = 1 : NextY =  : 1 : counter =  : 6  Cells remaining :23
nextX = 2 : NextY =  : 1 : counter =  : 7  Cells remaining :22
nextX = 3 : NextY =  : 1 : counter =  : 8  Cells remaining :21
nextX = 4 : NextY =  : 1 : counter =  : 9  Cells remaining :20
nextX = 4 : NextY =  : 0 : counter =  : 10  Cells remaining :19

This is the same as the above with a new start location of the bottom
left hand corner and the first child is correct.
However the run completes when there is an empty space in the bottom row.
It is as if the bottom row is not recognised.

Vertical2
Start X = 0 : Start Y =  5
nextX = 0 : NextY =  : 4 : counter =  : 1  Cells remaining :28
nextX = 0 : NextY =  : 3 : counter =  : 2  Cells remaining :27
nextX = 0 : NextY =  : 2 : counter =  : 3  Cells remaining :26
nextX = 0 : NextY =  : 1 : counter =  : 4  Cells remaining :25
nextX = 0 : NextY =  : 0 : counter =  : 5  Cells remaining :24
nextX = 1 : NextY =  : 0 : counter =  : 6  Cells remaining :23
nextX = 2 : NextY =  : 0 : counter =  : 7  Cells remaining :22
nextX = 3 : NextY =  : 0 : counter =  : 8  Cells remaining :21
nextX = 4 : NextY =  : 0 : counter =  : 9  Cells remaining :20
nextX = 4 : NextY =  : 1 : counter =  : 10  Cells remaining :19
nextX = 3 : NextY =  : 1 : counter =  : 11  Cells remaining :18
nextX = 2 : NextY =  : 1 : counter =  : 12  Cells remaining :17
nextX = 1 : NextY =  : 1 : counter =  : 13  Cells remaining :16
nextX = 1 : NextY =  : 2 : counter =  : 14  Cells remaining :15
nextX = 2 : NextY =  : 2 : counter =  : 15  Cells remaining :14
nextX = 3 : NextY =  : 2 : counter =  : 16  Cells remaining :13
nextX = 4 : NextY =  : 2 : counter =  : 17  Cells remaining :12
nextX = 4 : NextY =  : 3 : counter =  : 18  Cells remaining :11
nextX = 3 : NextY =  : 3 : counter =  : 19  Cells remaining :10
nextX = 2 : NextY =  : 3 : counter =  : 20  Cells remaining :9
nextX = 1 : NextY =  : 3 : counter =  : 21  Cells remaining :8
nextX = 1 : NextY =  : 4 : counter =  : 22  Cells remaining :7
nextX = 2 : NextY =  : 4 : counter =  : 23  Cells remaining :6
nextX = 3 : NextY =  : 4 : counter =  : 24  Cells remaining :5
nextX = 4 : NextY =  : 4 : counter =  : 25  Cells remaining :4