@ScheduledMethod(start = 1, interval = 1) public void step() { // get the grid location of this Zombie GridPoint pt = grid.getLocation(this); // use the GridCellNgh class to create GridCells for // the surrounding neighborhood . GridCellNgh<Human> nghCreator = new GridCellNgh<Human>(grid, pt, Human.class, 1, 1); List<GridCell<Human>> gridCells = nghCreator.getNeighborhood(true); SimUtilities.shuffle(gridCells, RandomHelper.getUniform()); GridPoint pointWithMostHumans = null; int maxCount = -1; for (GridCell<Human> cell : gridCells) { if (cell.size() > maxCount) { pointWithMostHumans = cell.getPoint(); maxCount = cell.size(); } } moveTowards(pointWithMostHumans); infect(); }
/** * Returns a filtered list of {@link GridCell} instances from the specified collection which holds * no objects. * * @param neighborhood an arbitrary list of <code>GridCell</code> objects; <i>cannot be <code>null * </code></i> * @return a filtered list of empty <code>GridCell</code> objects, more specifically for which * <code>size()</code> returns <code>0</code> ; if there is no empty cell in the specified * list, an empty list is returned */ public static <T> List<GridCell<T>> getFreeGridCells(final List<GridCell<T>> neighborhood) { if (null == neighborhood) { throw new IllegalArgumentException("Parameter neighborhood cannot be null."); } final ArrayList<GridCell<T>> ret = new ArrayList<GridCell<T>>(); for (final GridCell<T> act : neighborhood) { if (0 == act.size()) { ret.add(act); } } return ret; }
@ScheduledMethod(start = 1, interval = 1) public void step() { // create colNetwork in hosting context Context<Object> context = ContextUtils.getContext(this); Network<Object> colNet = (Network<Object>) context.getProjection("collaboration_network"); Network<Object> userNet = (Network<Object>) context.getProjection("user_network"); Network<Object> articleNet = (Network<Object>) context.getProjection("article_network"); if (!isDone) { /* * Neighbourhood Connection Algorithm */ // get the grid location of this User GridPoint pt = grid.getLocation(this); // use the GridCellNgh class to create GridCells for // the surrounding neighbourhood if (pt != null) { // TODO Why NULL? GridCellNgh<Article> nghCreator = new GridCellNgh<Article>( grid, pt, Article.class, neighbourDimensions, neighbourDimensions); List<GridCell<Article>> gridCells = nghCreator.getNeighborhood(false); SimUtilities.shuffle(gridCells, RandomHelper.getUniform()); // if an agent exist in the surrounding environment, add an edge with it. for (GridCell<Article> cell : gridCells) { if (cell.size() > 0) { List<Article> cellUsers = new ArrayList<Article>((Collection<Article>) cell.items()); articleToEdit = cellUsers.get((RandomHelper.nextIntFromTo(0, cellUsers.size() - 1))); if (context != null && colNet != null && cellUsers != null && articleToEdit != null) { if (!isActiveUser) { // Good Samaritan - one and only one connection if (colNet.getDegree(articleToEdit) <= 0 // if neighbour is unconnected && colNet.getDegree(this) <= 0) { // if our agent is unconnected) colNet.addEdge(this, articleToEdit); this.isDone = true; // this good samaritan is no longer counted in operating agents } } else if (!hasGeneralInterest) { // Project Leader zealot (active user), colNet.addEdge(this, articleToEdit); // connects neighbours in every step for (Object coopUser : colNet.getAdjacent(articleToEdit)) { if (coopUser != null && !userNet.containsEdge(userNet.getEdge(this, coopUser))) { userNet.addEdge(this, coopUser); } } for (Object relatedArticle : colNet.getAdjacent(this)) { if (relatedArticle != null && !articleNet.containsEdge(userNet.getEdge(articleToEdit, relatedArticle))) { articleNet.addEdge(articleToEdit, relatedArticle); } } } // For active agent connection algorithm we need to update good article array if found if (colNet.getDegree(articleToEdit) > (goodArticleMultiplier * colNet.getDegree() / colNet.size()) && colNet.getDegree(articleToEdit) > goodArticleConnectionCount && !articleToEdit.isGood) { articleToEdit.isGood = true; goodArticles.add(articleToEdit); } } break; } } } /* * Active Agent Connection Algorithm */ if (isActiveUser && hasGeneralInterest && goodArticles.size() > 0) { // if in administrator career path articleToEdit = goodArticles.get(RandomHelper.nextIntFromTo(0, goodArticles.size() - 1)); colNet.addEdge(this, articleToEdit); // TODO reduce goodArticles by one? for (Object coopUser : colNet.getAdjacent(articleToEdit)) { if (coopUser != null && !userNet.containsEdge(userNet.getEdge(this, coopUser))) { userNet.addEdge(this, coopUser); } } for (Object relatedArticle : colNet.getAdjacent(this)) { if (relatedArticle != null && !articleNet.containsEdge(userNet.getEdge(articleToEdit, relatedArticle))) { articleNet.addEdge(articleToEdit, relatedArticle); } } goodArticles.remove(0); } this.endRun(); } }