3D Agent Problem
- To: mathgroup at smc.vnet.net
- Subject: [mg98979] 3D Agent Problem
- From: Earl.J.Mitchell at gmail.com
- Date: Thu, 23 Apr 2009 06:42:17 -0400 (EDT)
Hi, I am trying to set up a 3D environment having 'agents' and 'stuff' whose coordinates are random real numbers. The program should then move the agents towards the closest stuff in increments of, say, .1 units. I was able to create a program that did what I need for one iteration, but am having problems making it iterative... below is the code. I'm inexperienced and learning quickly but would really appreciate any guidance on iterating this system. ***************** Making a World of Agents and Stuff MakeNewWorld[Agents_] := Partition[Flatten[ Riffle[Table[RandomReal[{-10, 10}, {Agents, 3}]], Table[RandomInteger[9, 3], {Agents}]]], 6, 6] MakeNewStuff[Resources_] := Table[RandomReal[{-10, 10}, {Resources, 3}]] agentpos1 = MakeNewWorld[10][[All, 1 ;; 3]]; stuffpos1 = MakeNewStuff[5]; ListPointPlot3D[{agentpos1, stuffpos1 }, PlotStyle -> PointSize[Large]] ***** 3D plot of agent positions and stuff positions ******* The Problem of Movement Agents search for nearest stuff and move along the vector between their current position and that of the stuff. Ax = agentpos1[[All, 1]]; Bx = stuffpos1[[All, 1]]; Ay = agentpos1[[All, 2]]; By = stuffpos1[[All, 2]]; Az = agentpos1[[All, 3]]; Bz = stuffpos1[[All, 3]]; dx = Part[Ax, #] - Bx &; dy = Part[Ay, #] - By &; dz = Part[Az, #] - Bz &; TOTdx = dx /@ {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; TOTdy = dy /@ {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; TOTdz = dz /@ {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; squared = #^2 &; distance = (squared /@ TOTdx + squared /@ TOTdy + squared /@ TOTdz)^.5; mindistance = Min /@ distance; stufffinder = Flatten[Position[distance, #]] &; stuffpositions = Flatten[stufffinder ] /@ mindistance; newstuff = stuffpositions[[All, 2]]; coords = Part[stuffpos1, #] &; stuffcoords = coords /@ newstuff; WalkFunct2 = If[Part[Flatten[agentpos1], #] < Part[Flatten[stuffcoords], #], Part[Flatten[agentpos1], #] + .5, Part[Flatten[agentpos1], #] - .5] &; newagentcoords = WalkFunct2 /@ {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30}; agentpos2 = Partition[newagentcoords, 3, 3, {1, 3}]; ListPointPlot3D[{agentpos2, stuffpos1 }, PlotStyle -> PointSize[Large]]
- Follow-Ups:
- Re: 3D Agent Problem
- From: Daniel Lichtblau <danl@wolfram.com>
- Re: 3D Agent Problem