Commit 7b723ca7 authored by Julian Zobel's avatar Julian Zobel
Browse files

-- Renamed the Attraction Point Interface from AttractionPoint to IAttractionPoint

-- Removed the single use DefaultHostCounter and implemented as static functionality as it resemles the simulated situation.
parent 01e48533
......@@ -40,7 +40,7 @@ import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.GPSCalculation;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
/**
* Generates attraction points out of real data from osm
......@@ -53,7 +53,7 @@ public class OnlineJSONAttractionGenerator implements IAttractionGenerator {
private PositionVector worldDimensions;
private List<AttractionPoint> attractionPoints;
private List<IAttractionPoint> attractionPoints;
private int maxNumberOfAttractionPoints;
......@@ -69,7 +69,7 @@ public class OnlineJSONAttractionGenerator implements IAttractionGenerator {
public OnlineJSONAttractionGenerator() {
this.worldDimensions = Binder.getComponentOrNull(Topology.class)
.getWorldDimensions();
attractionPoints = new LinkedList<AttractionPoint>();
attractionPoints = new LinkedList<IAttractionPoint>();
latLeft = GPSCalculation.getLatLower();
latRight = GPSCalculation.getLatUpper();
......@@ -95,7 +95,7 @@ public class OnlineJSONAttractionGenerator implements IAttractionGenerator {
}
@Override
public List<AttractionPoint> getAttractionPoints() {
public List<IAttractionPoint> getAttractionPoints() {
if(attractionPoints.size() == 0) {
placementJsonFile = placementJsonPath +
"pois" +
......@@ -181,7 +181,7 @@ public class OnlineJSONAttractionGenerator implements IAttractionGenerator {
}
if(maxNumberOfAttractionPoints == 0) maxNumberOfAttractionPoints = Integer.MAX_VALUE;
List<AttractionPoint> result = new LinkedList<AttractionPoint>();
List<IAttractionPoint> result = new LinkedList<IAttractionPoint>();
for (int i = 0; (i < attractionPoints.size() && i < maxNumberOfAttractionPoints); i++) {
result.add(attractionPoints.get(i));
}
......
......@@ -28,13 +28,13 @@ import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
* Implementation of the interface {@link AttractionGenerator}.
*
* Generates the given number of {@link AttractionPoint}s and sets the
* Generates the given number of {@link IAttractionPoint}s and sets the
* position randomly within the world dimensions.
*
* v1.1: statically available attraction points [JZ]
......@@ -79,7 +79,7 @@ public class RandomAttractionGenerator implements IAttractionGenerator {
}
@Override
public List<AttractionPoint> getAttractionPoints() {
public List<IAttractionPoint> getAttractionPoints() {
if (!numberOfAPsSet) {
throw new ConfigurationException(
"Number of Attraction Points is not set in RandomAttractionGenerator!");
......@@ -92,7 +92,7 @@ public class RandomAttractionGenerator implements IAttractionGenerator {
}
private void createAttractionPoints() {
List<AttractionPoint> result = new LinkedList<AttractionPoint>();
List<IAttractionPoint> result = new LinkedList<IAttractionPoint>();
// make a break counter to prevent more than 10 iterations and an infinity loop in general.
int c = 0;
......@@ -114,7 +114,7 @@ public class RandomAttractionGenerator implements IAttractionGenerator {
continue create;
}
for (AttractionPoint ap : result) {
for (IAttractionPoint ap : result) {
// if this point is closer than the given minimum distance to another point, or the radii of the points would overlap,
// or if the radius would exceed the simulation area
// then discard this attraction point and create a new one
......@@ -130,7 +130,7 @@ public class RandomAttractionGenerator implements IAttractionGenerator {
radius = minimumRadius;
}
AttractionPoint aPoint = new AttractionPointImpl("AP-"+i, posVec);
IAttractionPoint aPoint = new AttractionPointImpl("AP-"+i, posVec);
aPoint.setRadius(radius);
c = 0;
result.add(aPoint);
......@@ -138,7 +138,7 @@ public class RandomAttractionGenerator implements IAttractionGenerator {
attractionPoints.clear();
for (AttractionPoint ap : result) {
for (IAttractionPoint ap : result) {
addAttractionPoint(ap);
}
}
......
......@@ -31,7 +31,7 @@ import de.tudarmstadt.maki.simonstrator.api.EventHandler;
import de.tudarmstadt.maki.simonstrator.api.Monitor;
import de.tudarmstadt.maki.simonstrator.api.Monitor.Level;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
......@@ -97,7 +97,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
}
@Override
public List<AttractionPoint> getAttractionPoints() {
public List<IAttractionPoint> getAttractionPoints() {
return attractionPoints;
}
......@@ -110,7 +110,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
}
private void scheduleDynamicEvent(AttractionPoint attractionPoint) {
private void scheduleDynamicEvent(IAttractionPoint attractionPoint) {
long r = (long) (rand.nextDouble() * (maxDynamicIntervall - minDynamicIntervall)) + minDynamicIntervall;
......@@ -150,7 +150,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
int deltaAP = numberOfAttractionPoints - attractionPoints.size();
for(int i = 0; i < deltaAP; i++) {
AttractionPoint newAP = createAttractionPoint();
IAttractionPoint newAP = createAttractionPoint();
scheduleDynamicEvent(newAP);
addAttractionPoint(newAP);
}
......@@ -162,7 +162,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
*
* @return
*/
private AttractionPoint createAttractionPoint() {
private IAttractionPoint createAttractionPoint() {
// make a break counter to prevent more than 100 iterations and an infinity loop in general.
int c = 100;
......@@ -181,7 +181,7 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
}
// if within world dimensions, continue checking against other attraction points
for (AttractionPoint ap : attractionPoints) {
for (IAttractionPoint ap : attractionPoints) {
// if this point is closer than the given minimum distance to another point, or the radii of the points would overlap,
// or if the radius would exceed the simulation area
// then discard this attraction point and create a new one
......@@ -195,12 +195,12 @@ public class RandomDynamicAttractionGenerator implements IAttractionGenerator {
radius = 0;
}
AttractionPoint aPoint = new AttractionPointImpl("AP-" + rand.nextInt(), posVec);
IAttractionPoint aPoint = new AttractionPointImpl("AP-" + rand.nextInt(), posVec);
aPoint.setRadius(radius);
return aPoint;
}
AttractionPoint ap = new AttractionPointImpl("AP-ERROR", new PositionVector(worldDimension.getX() / 2, worldDimension.getY() / 2));
IAttractionPoint ap = new AttractionPointImpl("AP-ERROR", new PositionVector(worldDimension.getX() / 2, worldDimension.getY() / 2));
ap.setRadius(0);
ap.setWeight(0);
......
......@@ -24,13 +24,13 @@ import java.util.List;
import de.tud.kom.p2psim.api.topology.Topology;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
* Implementation of the interface {@link AttractionGenerator}.
*
* Generates the given number of {@link AttractionPoint}s and sets the
* Generates the given number of {@link IAttractionPoint}s and sets the
* position randomly within the world dimensions.
*
* @author Julian Zobel
......@@ -57,7 +57,7 @@ public class TwoPointFixedAttractionGenerator implements IAttractionGenerator {
}
@Override
public List<AttractionPoint> getAttractionPoints() {
public List<IAttractionPoint> getAttractionPoints() {
if(attractionPoints.isEmpty())
createAttractionPoints();
......@@ -67,13 +67,13 @@ public class TwoPointFixedAttractionGenerator implements IAttractionGenerator {
private void createAttractionPoints() {
PositionVector p1 = new PositionVector(x1, y1);
AttractionPoint ap1 = new AttractionPointImpl("AP1", p1);
IAttractionPoint ap1 = new AttractionPointImpl("AP1", p1);
ap1.setRadius(100);
attractionPoints.add(ap1);
PositionVector p2 = new PositionVector(x2, y2);
AttractionPoint ap2 = new AttractionPointImpl("AP2", p2);
IAttractionPoint ap2 = new AttractionPointImpl("AP2", p2);
ap2.setRadius(100);
attractionPoints.add(ap2);
}
......
/*
* Copyright (c) 2005-2010 KOM – Multimedia Communications Lab
*
* This file is part of PeerfactSim.KOM.
*
* PeerfactSim.KOM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* PeerfactSim.KOM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PeerfactSim.KOM. If not, see <http://www.gnu.org/licenses/>.
*
*/
package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.hostcount;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Set;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.ModularMovementModel;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
/**
* This class checks each {@link AttractionPoint} defined in the simulation and counts the number of hosts within their radius.
*
* @author Marcel Verst
* @version 1.0, 22.11.2018
*
* @author Julian Zobel
* @version 1.1, 27.01.2020
*/
public class DefaultHostCounter extends AbstractHostCounter {
@Override
public void initialize(ModularMovementModel movementModel) {
this.movementModel = movementModel;
attractionPointHosts = new LinkedHashMap<>();
for(AttractionPoint ap : IAttractionGenerator.attractionPoints) {
attractionPointHosts.put(ap, new LinkedHashSet<>());
}
}
@Override
public void updateHostCount() {
Set<SimLocationActuator> moveableHosts = movementModel.getAllLocationActuators();
for(SimLocationActuator host : moveableHosts) {
for(AttractionPoint ap : attractionPointHosts.keySet()) {
if(isHostInAttractionPointArea(host, ap)) {
if(!registeredAtAttractionPoint(host, ap)) {
addHostToAttractionPoint(host, ap);
}
}
else {
if(registeredAtAttractionPoint(host, ap)) {
removeHostFromAttractionPoint(host, ap);
}
}
}
}
}
/*
* =====================================================================================================
* === HELPER FUNCTIONS
* =====================================================================================================
*/
/**
* Checks, if a specific host is NOT yet registered to a specific poi.
* Returns true, if host is NOT yet registered to a poi, false if already registered.
*
* @param SimLocationActuator The host to be checked.
* @param AttractionPoint The poi in which the host is expected.
* @return boolean
*/
private boolean registeredAtAttractionPoint(SimLocationActuator host, AttractionPoint poi) {
if(attractionPointHosts.get(poi).contains(host)) {
return true;
}
else return false;
}
}
......@@ -20,93 +20,71 @@
package de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.hostcount;
import java.util.Map;
import java.util.Set;
import java.util.LinkedHashSet;
import java.util.Set;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.ModularMovementModel;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Host;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
/**
* This abstract {@link IAttractionPointHostCounter} class provides methods for the basic functionality to count hosts in {@link AttractionPoint} areas.
*
* @author Marcel Verst
* @version 1.0, 22.11.2018
*
*
* @author Julian Zobel
* @version 1.1, 27.01.2020
*
*/
public abstract class AbstractHostCounter implements IAttractionPointHostCounter {
protected ModularMovementModel movementModel;
protected Map<AttractionPoint, Set<SimLocationActuator>> attractionPointHosts;
public class HostAtAttractionPointCounter {
/**
* Adds a specific host to a specific attraction point.
*
* @param SimLocationActuator The host to be added.
* @param AttractionPoint The attraction point to which the host is added
*/
protected void addHostToAttractionPoint(SimLocationActuator host, AttractionPoint poi) {
Set<SimLocationActuator> hosts = attractionPointHosts.get(poi);
hosts.add(host);
attractionPointHosts.put(poi, hosts);
}
/**
* Removes a specific host from its currently assigned poi.
*
* @param SimLocationActuator The host to be removed.
* @param AttractionPoint The attraction point from which the host is removed
*/
protected void removeHostFromAttractionPoint(SimLocationActuator host, AttractionPoint poi) {
Set<SimLocationActuator> hosts = attractionPointHosts.get(poi);
hosts.remove(host);
attractionPointHosts.put(poi, hosts);
}
/**
* Compares the locations of a given {@link Host} and a given {@link AttractionPoint} and checks if the host lies within the radius of the {@link AttractionPoint}.
* Returns true, if the hosts location is within the radius of the {@link AttractionPoint}, false otherwise.
* Compares the locations of a given {@link Host} and a given {@link IAttractionPoint} and checks if the host lies within the radius of the {@link IAttractionPoint}.
* Returns true, if the hosts location is within the radius of the {@link IAttractionPoint}, false otherwise.
*
* @param SimLocationActuator The host to be checked.
* @param AttractionPoint
* @param IAttractionPoint
* @return Boolean
*/
public boolean isHostInAttractionPointArea(SimLocationActuator host, AttractionPoint attractionPoint) {
public static boolean isHostInAttractionPointArea(SimLocationActuator host, IAttractionPoint attractionPoint) {
PositionVector hostLocation = host.getRealPosition();
if(attractionPoint.distanceTo(hostLocation) <= attractionPoint.getRadius()) {
if(!attractionPoint.hasRadius())
return false;
if(attractionPoint.distanceTo(hostLocation) <= attractionPoint.getRadius())
return true;
}
return false;
}
/**
* Returns the number of hosts within a specific {@link AttractionPoint}
* Returns the number of hosts within a specific {@link IAttractionPoint}
*
* @param AttractionPoint The {@link AttractionPoint} to be checked.
* @param IAttractionPoint The {@link IAttractionPoint} to be checked.
* @return Integer
*/
@Override
public int getHostCountOfAttractionPoint(AttractionPoint attractionPoint) {
if(attractionPointHosts.get(attractionPoint) == null) {
return 0;
}
return attractionPointHosts.get(attractionPoint).size();
public static int getHostCountOfAttractionPoint(IAttractionPoint attractionPoint, Set<SimLocationActuator> hostsToConsider) {
return getHostsOfAttractionPoint(attractionPoint, hostsToConsider).size();
}
/**
* Returns a set of all hosts currently located within a specific {@link AttractionPoint} area.
* Returns a set of all hosts currently located within a specific {@link IAttractionPoint} area.
*
* @param AttractionPoint The {@link AttractionPoint} to be checked.
* @param IAttractionPoint The {@link IAttractionPoint} to be checked.
* @return Set<SimLocationActuator>
*/
@Override
public Set<SimLocationActuator> getHostsOfAttractionPoint(AttractionPoint attractionPoint) {
return attractionPointHosts.get(attractionPoint);
public static Set<SimLocationActuator> getHostsOfAttractionPoint(IAttractionPoint attractionPoint, Set<SimLocationActuator> hostsToConsider) {
Set<SimLocationActuator> hosts = new LinkedHashSet<SimLocationActuator>();
for(SimLocationActuator h : hostsToConsider) {
if(isHostInAttractionPointArea(h, attractionPoint)) {
hosts.add(h);
}
}
return hosts;
}
}
......@@ -30,7 +30,7 @@ import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.SocialGroupMovementModel;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.BasicAttractionPoint;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.hostcount.IAttractionPointHostCounter;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.hostcount.HostAtAttractionPointCounter;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.SocialMovementGroup;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.MovementGroupContainer;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
......@@ -40,7 +40,7 @@ import de.tudarmstadt.maki.simonstrator.api.EventHandler;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.Time;
import de.tudarmstadt.maki.simonstrator.api.common.graph.INodeID;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
......@@ -69,7 +69,6 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
protected long groupFormationSetupDelay;
private long groupFormationDelay;
protected IAttractionPointHostCounter hostCounter;
@XMLConfigurableConstructor({"enableGroups", "maxNumberOfGroups", "minGroupSize", "maxGroupSize", "probabilityToJoin", "groupFormationSetupDelay", "groupFormationDelay","groupRejoinWaitTime"})
public AbstractGroupForming(boolean enableGroups, int maxNumberOfGroups, int minGroupSize, int maxGroupSize, double probabilityToJoin, long groupFormationSetupDelay, long groupFormationDelay, long groupRejoinWaitTime) {
......@@ -127,9 +126,6 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
this.movementModel = movementModel;
groupCon = MovementGroupContainer.getInstance();
// Initialize instances of other classes
this.hostCounter = movementModel.getAttractionPointHostCounter();
stayDuration = new LinkedHashMap<INodeID, Tuple<Long,Long>>();
......@@ -189,7 +185,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
movementModel.getAttractionAssignmentStrategy().addComponent(group.getLeader());
AttractionPoint nextDestination = movementModel.getAttractionAssignmentStrategy().getAssignment(group.getLeader());
IAttractionPoint nextDestination = movementModel.getAttractionAssignmentStrategy().getAssignment(group.getLeader());
// Add Offset to group destination
PositionVector destination = movementModel.addGaussianOffsetToPosition(new PositionVector(nextDestination),
......@@ -233,7 +229,7 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
}
if(group.getGroupSize() > 0 || group.getLeader() != null) {
AttractionPoint currentAP = group.getLeader().getCurrentTargetAttractionPoint();
IAttractionPoint currentAP = group.getLeader().getCurrentTargetAttractionPoint();
for (SimLocationActuator host : group.getMembers()) {
movementModel.updatedAttractionAssignment(host, currentAP);
......@@ -259,12 +255,12 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
* @return AttractionPoint
*
*/
protected AttractionPoint getAttractionPointWithOldestHost() {
AttractionPoint result = null;
protected IAttractionPoint getAttractionPointWithOldestHost() {
IAttractionPoint result = null;
long maxDuration = 0;
for(AttractionPoint ap : IAttractionGenerator.attractionPoints) {
for(SimLocationActuator host : hostCounter.getHostsOfAttractionPoint(ap)) {
for(IAttractionPoint ap : IAttractionGenerator.attractionPoints) {
for(SimLocationActuator host : HostAtAttractionPointCounter.getHostsOfAttractionPoint(ap, movementModel.getAllLocationActuators())) {
INodeID id = host.getHost().getId();
long duration = stayDuration.get(id).getA();
......@@ -278,11 +274,11 @@ public abstract class AbstractGroupForming implements IGroupFormingBehavior {
return result;
}
protected AttractionPoint getAttractionPointWithMostHosts() {
AttractionPoint apCandidate = null;
protected IAttractionPoint getAttractionPointWithMostHosts() {
IAttractionPoint apCandidate = null;
int size = 0;
for(AttractionPoint ap : IAttractionGenerator.attractionPoints) {
int numberOfHostsInAP = hostCounter.getHostCountOfAttractionPoint(ap);
for(IAttractionPoint ap : IAttractionGenerator.attractionPoints) {
int numberOfHostsInAP = HostAtAttractionPointCounter.getHostCountOfAttractionPoint(ap, movementModel.getAllLocationActuators());
if(numberOfHostsInAP > size) {
apCandidate = ap;
size = numberOfHostsInAP;
......
......@@ -28,6 +28,7 @@ import java.util.Set;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.api.topology.movement.local.LocalMovementStrategy;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.hostcount.HostAtAttractionPointCounter;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.groups.SocialMovementGroup;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.transition.IAttractionAssigmentStrategy;
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
......@@ -37,7 +38,7 @@ import de.tudarmstadt.maki.simonstrator.api.Event;
import de.tudarmstadt.maki.simonstrator.api.EventHandler;
import de.tudarmstadt.maki.simonstrator.api.Time;
import de.tudarmstadt.maki.simonstrator.api.common.graph.INodeID;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
......@@ -100,21 +101,21 @@ public class DefaultGroupForming extends AbstractGroupForming {
@Override
protected void assembleGroup() {
// Get attractionPoint with highest amount of hosts
hostCounter.updateHostCount();
AttractionPoint apCandidate = IAttractionGenerator.attractionPoints.get(rand.nextInt(IAttractionGenerator.attractionPoints.size()));
IAttractionPoint apCandidate = IAttractionGenerator.attractionPoints.get(rand.nextInt(IAttractionGenerator.attractionPoints.size()));
if(apCandidate == null) {
return;
}
int numberOfHostsInAttractionPoint = hostCounter.getHostCountOfAttractionPoint(apCandidate);
Set<SimLocationActuator> hostsAtAttractionPoint = HostAtAttractionPointCounter.getHostsOfAttractionPoint(apCandidate, movementModel.getAllLocationActuators());
int numberOfHostsInAttractionPoint = hostsAtAttractionPoint.size();
int groupSize = this.rndGroupSize(numberOfHostsInAttractionPoint);
Set<SimLocationActuator> groupCandidates = new LinkedHashSet<>();
// shuffle the hosts at the attraction point (more randomness ftw!)
LinkedList<SimLocationActuator> randomShuffledHostsAtAttractionPoint = new LinkedList<>(hostCounter.getHostsOfAttractionPoint(apCandidate));
LinkedList<SimLocationActuator> randomShuffledHostsAtAttractionPoint = new LinkedList<>(hostsAtAttractionPoint);
Collections.shuffle(randomShuffledHostsAtAttractionPoint, rand);
for (SimLocationActuator m : randomShuffledHostsAtAttractionPoint) {
......
......@@ -29,10 +29,10 @@ import java.util.Random;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
/**
* Abstract base class for Transition Strategies ({@link IAttractionAssigmentStrategy}s) using {@link AttractionPoint}s.
* Abstract base class for Transition Strategies ({@link IAttractionAssigmentStrategy}s) using {@link IAttractionPoint}s.
*
* @author Julian Zobel
* @version 1.0, 23.01.2019
......@@ -41,9 +41,9 @@ public abstract class AbstractAttractionBasedAssignmentStrategy implements IAttr
protected Random rnd = Randoms.getRandom(AbstractAttractionBasedAssignmentStrategy.class);
protected Map<SimLocationActuator, AttractionPoint> assignments = new LinkedHashMap<>();
protected Map<SimLocationActuator, IAttractionPoint> assignments = new LinkedHashMap<>();
protected Map<SimLocationActuator, AttractionPoint> lastAssignments = new LinkedHashMap<>();
protected Map<SimLocationActuator, IAttractionPoint> lastAssignments = new LinkedHashMap<>();
private List<AttractionAssignmentListener> listeners = new LinkedList<>();
......@@ -61,7 +61,7 @@ public abstract class AbstractAttractionBasedAssignmentStrategy implements IAttr
}
@Override
public AttractionPoint getAssignment(SimLocationActuator comp) {
public IAttractionPoint getAssignment(SimLocationActuator comp) {
return assignments.get(comp);
}
......@@ -84,13 +84,13 @@ public abstract class AbstractAttractionBasedAssignmentStrategy implements IAttr
* @param attractionPoint
*/
protected void notifyListenersOfAssignmentUpdate(SimLocationActuator comp,
AttractionPoint attractionPoint) {
IAttractionPoint attractionPoint) {
listeners.forEach(listener -> listener.updatedAttractionAssignment(comp, attractionPoint));
}
@Override
public void updateTargetAttractionPoint(SimLocationActuator comp,
AttractionPoint attractionPoint) {
IAttractionPoint attractionPoint) {
if(assignments.containsKey(comp)) {
this.lastAssignments.put(comp, this.assignments.remove(comp));
}
......@@ -98,7 +98,7 @@ public abstract class AbstractAttractionBasedAssignmentStrategy implements IAttr
notifyListenersOfAssignmentUpdate(comp, attractionPoint);
}
private long getRandomUniformDistributionPauseTime(AttractionPoint attractionPoint) {
private long getRandomUniformDistributionPauseTime(IAttractionPoint attractionPoint) {
// if attraction point has own pause time use it, otherwise use default values
if(attractionPoint != null && attractionPoint.hasPauseTime()) {
......@@ -109,7 +109,7 @@ public abstract class AbstractAttractionBasedAssignmentStrategy implements IAttr
}
}
public long getPauseTime(AttractionPoint attractionPoint) {
public long getPauseTime(IAttractionPoint attractionPoint) {
return getRandomUniformDistributionPauseTime(attractionPoint);
}
......@@ -119,11 +119,11 @@ public abstract class AbstractAttractionBasedAssignmentStrategy implements IAttr
* @param host
* @return
*/
protected AttractionPoint getNewAttractionPointAssignment(SimLocationActuator host) {
protected IAttractionPoint getNewAttractionPointAssignment(SimLocationActuator host) {
double score = rnd.nextDouble();
List<AttractionPoint> candidates = new LinkedList<>();
for (AttractionPoint ap : IAttractionGenerator.attractionPoints) {
List<IAttractionPoint> candidates = new LinkedList<>();
for (IAttractionPoint ap : IAttractionGenerator.attractionPoints) {
// skip null values (should never occur!)
if(ap == null) {
continue;
......@@ -155,14 +155,14 @@ public abstract class AbstractAttractionBasedAssignmentStrategy implements IAttr
candidates.addAll(IAttractionGenerator.attractionPoints);
}
AttractionPoint assignment = candidates.get(rnd.nextInt(candidates.size()));
IAttractionPoint assignment = candidates.get(rnd.nextInt(candidates.size()));
return assignment;
}
@Override
public boolean hostInAttractionPointArea(SimLocationActuator host) {
for(AttractionPoint ap : IAttractionGenerator.attractionPoints) {
for(IAttractionPoint ap : IAttractionGenerator.attractionPoints) {
if(ap.distanceTo(host.getRealPosition()) <= ap.getRadius()) {
return true;
}
......
......@@ -28,15 +28,15 @@ import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractio
import de.tudarmstadt.maki.simonstrator.api.Event;
import de.tudarmstadt.maki.simonstrator.api.EventHandler;
import de.tudarmstadt.maki.simonstrator.api.Time;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
* With this transition strategy, nodes are roaming around {@link AttractionPoint}s, without transitions between them. As the {@link ModularMovementModel}
* With this transition strategy, nodes are roaming around {@link IAttractionPoint}s, without transitions between them. As the {@link ModularMovementModel}
* uses a Gauss function to add jitter and offsets to the movement, some nodes may also roam outside of the circle's radius (this is intended to make it more realistic)
*
* @author Julian Zobel
* @version 1.0, 24.01.2019
* @version 10.02.2020
*/
public class AttractionPointRoamingStrategy extends AbstractAttractionBasedAssignmentStrategy implements EventHandler {
......@@ -55,12 +55,12 @@ public class AttractionPointRoamingStrategy extends AbstractAttractionBasedAssig
@Override
public void addComponent(SimLocationActuator comp) {
this.roamingStates.put(comp, null);
AttractionPoint nextAP = getNewAttractionPointAssignment(comp);
IAttractionPoint nextAP = getNewAttractionPointAssignment(comp);
updateTargetAttractionPoint(comp, nextAP);
}
@Override
public void reachedAttractionPoint(SimLocationActuator comp, AttractionPoint attractionPoint) {
public void reachedAttractionPoint(SimLocationActuator comp, IAttractionPoint attractionPoint) {
if(roamingStates.get(comp) == roamingTransitionState.PAUSE) {
return;
......@@ -85,7 +85,7 @@ public class AttractionPointRoamingStrategy extends AbstractAttractionBasedAssig
private void roamAroundAttractionPoint(SimLocationActuator comp) {
if(roamingStates.get(comp) == roamingTransitionState.PAUSE) {
AttractionPoint currentAttractionPoint = this.assignments.get(comp);
IAttractionPoint currentAttractionPoint = this.assignments.get(comp);
this.roamingStates.put(comp, roamingTransitionState.ROAMING);
notifyListenersOfAssignmentUpdate(comp, currentAttractionPoint);
......@@ -96,7 +96,7 @@ public class AttractionPointRoamingStrategy extends AbstractAttractionBasedAssig
public void eventOccurred(Object content, int type) {
SimLocationActuator comp = (SimLocationActuator) content;
AttractionPoint currentAttractionPoint = this.assignments.get(comp);
IAttractionPoint currentAttractionPoint = this.assignments.get(comp);
// if the attraction point was removed in the meantime, go directly to transit state
if(currentAttractionPoint == null || !IAttractionGenerator.attractionPoints.contains(currentAttractionPoint)) {
......
......@@ -29,10 +29,10 @@ import de.tud.kom.p2psim.api.common.SimHostComponent;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.ModularMovementModel;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractionGenerator;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
/**
* A {@link TransitionStrategy} for a case in which nodes are affiliated to an {@link AttractionPoint} only
* A {@link TransitionStrategy} for a case in which nodes are affiliated to an {@link IAttractionPoint} only
* in the beginning. No further transition will take place.
*
* @author Martin Hellwig
......@@ -50,9 +50,9 @@ public class FixedAssignmentStrategy extends AbstractAttractionBasedAssignmentSt
private Map<SimHost, SimLocationActuator> mappingHostMS = new LinkedHashMap<SimHost, SimLocationActuator>();
private Map<String, AttractionPoint> mappingGroupIdAP = new LinkedHashMap<String, AttractionPoint>();
private Map<String, IAttractionPoint> mappingGroupIdAP = new LinkedHashMap<String, IAttractionPoint>();
private Map<AttractionPoint, String> mappingAPGroupId = new LinkedHashMap<AttractionPoint, String>();
private Map<IAttractionPoint, String> mappingAPGroupId = new LinkedHashMap<IAttractionPoint, String>();
@Override
......@@ -62,14 +62,14 @@ public class FixedAssignmentStrategy extends AbstractAttractionBasedAssignmentSt
// No assignments been done before.
if (assignments.isEmpty()) {
AttractionPoint aPoint = IAttractionGenerator.attractionPoints.iterator().next();
IAttractionPoint aPoint = IAttractionGenerator.attractionPoints.iterator().next();
assignments.put(ms, aPoint);
mappingGroupId(ms, aPoint);
}
// GroupId is not mapped.
else if (!mappingGroupIdAP.containsKey(mappingMSHost.get(ms)
.getProperties().getGroupID())) {
for (AttractionPoint actAP : IAttractionGenerator.attractionPoints) {
for (IAttractionPoint actAP : IAttractionGenerator.attractionPoints) {
if (!mappingAPGroupId.containsKey(actAP)) {
assignments.put(ms, actAP);
mappingGroupId(ms, actAP);
......@@ -80,7 +80,7 @@ public class FixedAssignmentStrategy extends AbstractAttractionBasedAssignmentSt
// GroupId is already mapped.
else if (mappingGroupIdAP.containsKey(mappingMSHost.get(ms)
.getProperties().getGroupID())) {
AttractionPoint aPoint = mappingGroupIdAP.get(mappingMSHost.get(ms)
IAttractionPoint aPoint = mappingGroupIdAP.get(mappingMSHost.get(ms)
.getProperties().getGroupID());
assignments.put(ms, aPoint);
} else {
......@@ -92,13 +92,13 @@ public class FixedAssignmentStrategy extends AbstractAttractionBasedAssignmentSt
}
@Override
public void reachedAttractionPoint(SimLocationActuator ms, AttractionPoint attractionPoint) {
public void reachedAttractionPoint(SimLocationActuator ms, IAttractionPoint attractionPoint) {
// don't care, as no further assignment takes place.
}
@Override
public void updateTargetAttractionPoint(SimLocationActuator comp,
AttractionPoint attractionPoint) {
IAttractionPoint attractionPoint) {
assignments.put(comp, attractionPoint);
notifyListenersOfAssignmentUpdate(comp, attractionPoint);
}
......@@ -113,7 +113,7 @@ public class FixedAssignmentStrategy extends AbstractAttractionBasedAssignmentSt
mappingMSHost.put(ms, host);
}
private void mappingGroupId(SimLocationActuator ms, AttractionPoint AP) {
private void mappingGroupId(SimLocationActuator ms, IAttractionPoint AP) {
SimHostComponent comp = (SimHostComponent) ms;
SimHost host = comp.getHost();
......@@ -127,13 +127,13 @@ public class FixedAssignmentStrategy extends AbstractAttractionBasedAssignmentSt
/**
* Used by the MobilityModel (M1) of the {@link ModularMovementModel} to get
* the groupId of the affiliated nodes to that {@link AttractionPoint}. Once
* the groupId of the affiliated nodes to that {@link IAttractionPoint}. Once
* the groupId is known nodes can be set <b>offline</b> or <b>online</b>.
*
* @param attractionPoint
* @return
*/
public String getGroupIdOfAttractionPoint(AttractionPoint attractionPoint) {
public String getGroupIdOfAttractionPoint(IAttractionPoint attractionPoint) {
return mappingAPGroupId.get(attractionPoint);
}
}
......@@ -21,7 +21,7 @@
package de.tud.kom.p2psim.impl.topology.movement.modularosm.transition;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
/**
* This is the interface for the Transition Strategy.<br>
......@@ -42,14 +42,14 @@ public interface IAttractionAssigmentStrategy {
* @param comp
* @return
*/
public AttractionPoint getAssignment(SimLocationActuator host);
public IAttractionPoint getAssignment(SimLocationActuator host);
public void addAttractionAssignmentListener(AttractionAssignmentListener listener);
public void removeAttractionAssignmentListener(AttractionAssignmentListener listener);
/**
* Add the object and assign the MS to an {@link AttractionPoint}.
* Add the object and assign the MS to an {@link IAttractionPoint}.
*
* @param ms
*/
......@@ -61,7 +61,7 @@ public interface IAttractionAssigmentStrategy {
*
* @param ms
*/
public void reachedAttractionPoint(SimLocationActuator host, AttractionPoint attractionPoint);
public void reachedAttractionPoint(SimLocationActuator host, IAttractionPoint attractionPoint);
/**
* Updates the target attraction point of a component
......@@ -69,7 +69,7 @@ public interface IAttractionAssigmentStrategy {
* @param attractionPoint
*/
public void updateTargetAttractionPoint(SimLocationActuator comp,
AttractionPoint attractionPoint);
IAttractionPoint attractionPoint);
public interface AttractionAssignmentListener {
......@@ -81,11 +81,11 @@ public interface IAttractionAssigmentStrategy {
* @param newAssignment
*/
public void updatedAttractionAssignment(SimLocationActuator host,
AttractionPoint newAssignment);
IAttractionPoint newAssignment);
}
public boolean hostInAttractionPointArea(SimLocationActuator host);
public long getPauseTime(AttractionPoint attractionPoint);
public long getPauseTime(IAttractionPoint attractionPoint);
}
......@@ -28,11 +28,11 @@ import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractio
import de.tudarmstadt.maki.simonstrator.api.Event;
import de.tudarmstadt.maki.simonstrator.api.EventHandler;
import de.tudarmstadt.maki.simonstrator.api.Time;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
* With this transition strategy, nodes are roaming around {@link AttractionPoint}s that have a radius. As the {@link ModularMovementModel}
* With this transition strategy, nodes are roaming around {@link IAttractionPoint}s that have a radius. As the {@link ModularMovementModel}
* uses a Gauss function to add jitter and offsets to the movement, some nodes may also roam outside of the circle's radius (this is intended to make it more realistic)
*
* @author Julian Zobel
......@@ -60,12 +60,12 @@ public class InAreaRoamingTransitionStrategy extends AbstractAttractionBasedAssi
@Override
public void addComponent(SimLocationActuator comp) {
this.roamingStates.put(comp, roamingTransitionState.TRANSITION);
AttractionPoint nextAP = getNewAttractionPointAssignment(comp);
IAttractionPoint nextAP = getNewAttractionPointAssignment(comp);
updateTargetAttractionPoint(comp, nextAP);
}
@Override
public void reachedAttractionPoint(SimLocationActuator comp, AttractionPoint attractionPoint) {
public void reachedAttractionPoint(SimLocationActuator comp, IAttractionPoint attractionPoint) {
if(roamingStates.get(comp) == roamingTransitionState.PAUSE) {
return;
......@@ -84,7 +84,7 @@ public class InAreaRoamingTransitionStrategy extends AbstractAttractionBasedAssi
}
@Override
public long getPauseTime(AttractionPoint attractionPoint) {
public long getPauseTime(IAttractionPoint attractionPoint) {
if(useGaussianDistributedPauseTime) {
return gaussianDistributionPauseTime(defaultPauseTimeMax - defaultPauseTimeMin, 0.5*(defaultPauseTimeMax - defaultPauseTimeMin));
}
......@@ -108,7 +108,7 @@ public class InAreaRoamingTransitionStrategy extends AbstractAttractionBasedAssi
private void roamAroundAttractionPoint(SimLocationActuator comp) {
if(roamingStates.get(comp) != roamingTransitionState.TRANSITION) {
AttractionPoint currentAttractionPoint = this.assignments.get(comp);
IAttractionPoint currentAttractionPoint = this.assignments.get(comp);
if(currentAttractionPoint == null) {
System.err.println("AP roaming failed: no AP");
......@@ -135,7 +135,7 @@ public class InAreaRoamingTransitionStrategy extends AbstractAttractionBasedAssi
else if(type == EVENT_ROAMING_PAUSE_ENDED) {
SimLocationActuator comp = (SimLocationActuator) content;
AttractionPoint currentAttractionPoint = this.assignments.get(comp);
IAttractionPoint currentAttractionPoint = this.assignments.get(comp);
// if the attraction point was removed in the meantime, go directly to transit state
if(currentAttractionPoint == null || !IAttractionGenerator.attractionPoints.contains(currentAttractionPoint)) {
......
package de.tud.kom.p2psim.impl.topology.movement.modularosm.transition;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import java.util.*;
/**
* This {@link IAttractionAssigmentStrategy} works with manual assignments. Initially components will be assigned
* one of the attraction points, but at any further point, the set list of attraction points doesn't really matter.
* New target can be assigned by using the {@link #updateTargetAttractionPoint(SimLocationActuator, AttractionPoint)} method,
* New target can be assigned by using the {@link #updateTargetAttractionPoint(SimLocationActuator, IAttractionPoint)} method,
* otherwise the components will stop moving upon reaching their target.
*
* @author Clemens Krug
......@@ -19,13 +19,13 @@ public class ManualAssignmentStrategy extends AbstractAttractionBasedAssignmentS
super(0, 0);
}
private LinkedHashSet<AttractionPoint> aPoints = new LinkedHashSet<>();
private LinkedHashSet<IAttractionPoint> aPoints = new LinkedHashSet<>();
private Map<SimLocationActuator, AttractionPoint> assignments = new HashMap<>();
private Map<SimLocationActuator, IAttractionPoint> assignments = new HashMap<>();
private List<AttractionAssignmentListener> listeners = new LinkedList<>();
public void setAttractionPoints(Collection<AttractionPoint> attractionPoints) {
public void setAttractionPoints(Collection<IAttractionPoint> attractionPoints) {
aPoints.addAll(attractionPoints);
}
......@@ -33,19 +33,19 @@ public class ManualAssignmentStrategy extends AbstractAttractionBasedAssignmentS
public void addComponent(SimLocationActuator ms) {
if(!assignments.containsKey(ms))
{
AttractionPoint aPoint = aPoints.iterator().next();
IAttractionPoint aPoint = aPoints.iterator().next();
assignments.put(ms, aPoint);
}
listeners.forEach(listener -> listener.updatedAttractionAssignment(ms, assignments.get(ms)));
}
@Override
public void reachedAttractionPoint(SimLocationActuator ms, AttractionPoint attractionPoint) {
public void reachedAttractionPoint(SimLocationActuator ms, IAttractionPoint attractionPoint) {
//Nothing to do.
}
@Override
public void updateTargetAttractionPoint(SimLocationActuator comp, AttractionPoint attractionPoint) {
public void updateTargetAttractionPoint(SimLocationActuator comp, IAttractionPoint attractionPoint) {
assignments.put(comp, attractionPoint);
listeners.forEach(listener -> listener.updatedAttractionAssignment(comp, attractionPoint));
}
......
......@@ -9,12 +9,12 @@ import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.IAttractio
import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.Monitor;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.Location;
/**
* This {@link IAttractionAssigmentStrategy} makes clients move around randomly in a specified area. You can specify the target
* area center via the {@link #updateTargetAttractionPoint(SimLocationActuator, AttractionPoint)} method. The client will then start
* area center via the {@link #updateTargetAttractionPoint(SimLocationActuator, IAttractionPoint)} method. The client will then start
* to roam the area randomly till a new target area is assigned.
*
* @author Clemens Krug
......@@ -34,7 +34,7 @@ public class RandomInAreaTransitionStrategy extends AbstractAttractionBasedAssig
/**
* These are the current spots inside the target area where the client is currently heading.
*/
private Map<SimLocationActuator, AttractionPoint> currentTarget = new HashMap<>();
private Map<SimLocationActuator, IAttractionPoint> currentTarget = new HashMap<>();
private Map<SimLocationActuator, Integer> currentSearchRadius = new HashMap<>();
/**
......@@ -47,7 +47,7 @@ public class RandomInAreaTransitionStrategy extends AbstractAttractionBasedAssig
if(!assignments.containsKey(ms))
{
AttractionPoint aPoint = IAttractionGenerator.attractionPoints.iterator().next();
IAttractionPoint aPoint = IAttractionGenerator.attractionPoints.iterator().next();
assignments.put(ms, aPoint);
currentTarget.put(ms, nextRandomPosition(aPoint, defaultRadius));
currentSearchRadius.put(ms, defaultRadius);
......@@ -56,13 +56,13 @@ public class RandomInAreaTransitionStrategy extends AbstractAttractionBasedAssig
}
@Override
public void reachedAttractionPoint(SimLocationActuator ms, AttractionPoint attractionPoint) {
public void reachedAttractionPoint(SimLocationActuator ms, IAttractionPoint attractionPoint) {
currentTarget.put(ms, nextRandomPosition(assignments.get(ms), currentSearchRadius.get(ms)));
notifyListenersOfAssignmentUpdate(ms, currentTarget.get(ms));
}
@Override
public void updateTargetAttractionPoint(SimLocationActuator comp, AttractionPoint attractionPoint) {
public void updateTargetAttractionPoint(SimLocationActuator comp, IAttractionPoint attractionPoint) {
assignments.put(comp, attractionPoint);
currentTarget.put(comp, nextRandomPosition(attractionPoint, currentSearchRadius.get(comp)));
notifyListenersOfAssignmentUpdate(comp, attractionPoint);
......
......@@ -41,13 +41,13 @@ import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.Event;
import de.tudarmstadt.maki.simonstrator.api.EventHandler;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
* This is a {@link TransitionStrategy} for the Social Case. It will be try to
* build groups based on the {@link SocialView} information. For this, it tries
* to assignment the given objects to the given {@link AttractionPoint}s. For
* to assignment the given objects to the given {@link IAttractionPoint}s. For
* the {@link SocialView}, it is required a {@link #socialId}, to find the right
* {@link SocialView}.
*
......@@ -56,18 +56,18 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
* The Strategy has the parameter of {@link #socialFactor},
* {@link #minPauseTime} and {@link #maxPauseTime}. The socialFactor should be a
* value between 0 and 1. It gives the probability for a social based transition
* or the transition to a random {@link AttractionPoint}. If the social based
* or the transition to a random {@link IAttractionPoint}. If the social based
* transition is selected, then will be used a scoring to find the right
* {@link AttractionPoint}. For that, it will be used only the AttractionPoints,
* {@link IAttractionPoint}. For that, it will be used only the AttractionPoints,
* of the hosts, which are in the same SocialCluster or are SocialNeighbors. For
* this AttractionPoints it will be find the highest scoring, which is to found
* in score. .
*
* <br>
*
* After the finding of the next {@link AttractionPoint}, it will be scheduled
* After the finding of the next {@link IAttractionPoint}, it will be scheduled
* an Event, with a delay between min- and maxPauseTime. After this delay, it
* will be tried to assign a new {@link AttractionPoint} like the described
* will be tried to assign a new {@link IAttractionPoint} like the described
* above.
*
* @author Christoph Muenker
......@@ -88,7 +88,7 @@ public class SocialTransitionStrategy extends AbstractAttractionBasedAssignmentS
private Set<SimLocationActuator> arrivedAtAttractionPoint = new LinkedHashSet<>();
private Map<SimLocationActuator, Set<AttractionPoint>> favoritePlaces = new HashMap<SimLocationActuator, Set<AttractionPoint>>();
private Map<SimLocationActuator, Set<IAttractionPoint>> favoritePlaces = new HashMap<SimLocationActuator, Set<IAttractionPoint>>();
private Map<SimLocationActuator, SimHost> mapMsHost = new HashMap<SimLocationActuator, SimHost>();
......@@ -146,8 +146,8 @@ public class SocialTransitionStrategy extends AbstractAttractionBasedAssignmentS
// position.
// TODO: needed? We do Transition as next, and this will delete the
// assignment..
AttractionPoint nearest = IAttractionGenerator.attractionPoints.iterator().next();
for (AttractionPoint aPoint : IAttractionGenerator.attractionPoints) {
IAttractionPoint nearest = IAttractionGenerator.attractionPoints.iterator().next();
for (IAttractionPoint aPoint : IAttractionGenerator.attractionPoints) {
if (nearest.distanceTo(ms.getRealPosition()) > aPoint
.distanceTo(ms.getRealPosition())) {
nearest = aPoint;
......@@ -162,14 +162,14 @@ public class SocialTransitionStrategy extends AbstractAttractionBasedAssignmentS
@Override
public void updateTargetAttractionPoint(SimLocationActuator comp,
AttractionPoint attractionPoint) {
IAttractionPoint attractionPoint) {
arrivedAtAttractionPoint.remove(comp);
assignments.put(comp, attractionPoint);
notifyListenersOfAssignmentUpdate(comp, attractionPoint);
}
@Override
public void reachedAttractionPoint(SimLocationActuator ms, AttractionPoint attractionPoint) {
public void reachedAttractionPoint(SimLocationActuator ms, IAttractionPoint attractionPoint) {
if (!arrivedAtAttractionPoint.contains(ms)) {
Event.scheduleWithDelay(getPauseTime(attractionPoint), this, ms, 0);
arrivedAtAttractionPoint.add(ms);
......@@ -177,18 +177,18 @@ public class SocialTransitionStrategy extends AbstractAttractionBasedAssignmentS
}
public void doTransition(SimLocationActuator ms) {
List<AttractionPoint> apFavorites = getFavoritePlaces(ms);
List<AttractionPoint> apFriends = getFriendsPlaces(ms);
List<AttractionPoint> apClusters = getClusterPlaces(ms);
List<AttractionPoint> apRandom = getRandomPlaces(ms,
List<IAttractionPoint> apFavorites = getFavoritePlaces(ms);
List<IAttractionPoint> apFriends = getFriendsPlaces(ms);
List<IAttractionPoint> apClusters = getClusterPlaces(ms);
List<IAttractionPoint> apRandom = getRandomPlaces(ms,
(int) Math.max(IAttractionGenerator.attractionPoints.size() * 0.2, 5));
AttractionPoint ap = null;
IAttractionPoint ap = null;
if (rnd.nextDouble() < socialFactor) {
ap = findHighestScore(ms, apFavorites, apFriends, apClusters,
apRandom);
} else {
List<AttractionPoint> aps = new ArrayList<AttractionPoint>();
List<IAttractionPoint> aps = new ArrayList<IAttractionPoint>();
aps.addAll(apRandom);
aps.addAll(apFavorites);
ap = aps.get(rnd.nextInt(apRandom.size()));
......@@ -198,18 +198,18 @@ public class SocialTransitionStrategy extends AbstractAttractionBasedAssignmentS
notifyListenersOfAssignmentUpdate(ms, ap);
}
private AttractionPoint findHighestScore(SimLocationActuator ms,
List<AttractionPoint> apFavorites, List<AttractionPoint> apFriends,
List<AttractionPoint> apClusters, List<AttractionPoint> apRandom) {
Set<AttractionPoint> aps = new LinkedHashSet<AttractionPoint>();
private IAttractionPoint findHighestScore(SimLocationActuator ms,
List<IAttractionPoint> apFavorites, List<IAttractionPoint> apFriends,
List<IAttractionPoint> apClusters, List<IAttractionPoint> apRandom) {
Set<IAttractionPoint> aps = new LinkedHashSet<IAttractionPoint>();
aps.addAll(apFavorites);
aps.addAll(apFriends);
aps.addAll(apClusters);
aps.addAll(apRandom);
double maxScore = 0;
AttractionPoint maxAp = null;
for (AttractionPoint ap : aps) {
IAttractionPoint maxAp = null;
for (IAttractionPoint ap : aps) {
double score = score(ms, ap, apFavorites, apFriends, apClusters,
apRandom);
// System.out.println(score);
......@@ -239,9 +239,9 @@ public class SocialTransitionStrategy extends AbstractAttractionBasedAssignmentS
* @param apRandom
* @return
*/
private double score(SimLocationActuator ms, AttractionPoint ap,
List<AttractionPoint> apFavorites, List<AttractionPoint> apFriends,
List<AttractionPoint> apClusters, List<AttractionPoint> apRandom) {
private double score(SimLocationActuator ms, IAttractionPoint ap,
List<IAttractionPoint> apFavorites, List<IAttractionPoint> apFriends,
List<IAttractionPoint> apClusters, List<IAttractionPoint> apRandom) {
double distance = ms.getRealPosition().distanceTo(ap);
double distanceScore = 1 - (distance / worldDimension.getLength());
......@@ -276,9 +276,9 @@ public class SocialTransitionStrategy extends AbstractAttractionBasedAssignmentS
}
// counts the number of the AttractionPoint in the list
private int occurence(AttractionPoint ap, List<AttractionPoint> aps) {
private int occurence(IAttractionPoint ap, List<IAttractionPoint> aps) {
int i = 0;
for (AttractionPoint a : aps) {
for (IAttractionPoint a : aps) {
if (a.equals(ap)) {
i++;
}
......@@ -286,9 +286,9 @@ public class SocialTransitionStrategy extends AbstractAttractionBasedAssignmentS
return i;
}
private int assignedToAp(AttractionPoint ap) {
private int assignedToAp(IAttractionPoint ap) {
int i = 1;
for (Entry<SimLocationActuator, AttractionPoint> entry : assignments
for (Entry<SimLocationActuator, IAttractionPoint> entry : assignments
.entrySet()) {
if (entry.getValue().equals(ap)) {
i++;
......@@ -297,15 +297,15 @@ public class SocialTransitionStrategy extends AbstractAttractionBasedAssignmentS
return i;
}
private List<AttractionPoint> getRandomPlaces(SimLocationActuator ms,
private List<IAttractionPoint> getRandomPlaces(SimLocationActuator ms,
int number) {
List<AttractionPoint> result = new Vector<AttractionPoint>(IAttractionGenerator.attractionPoints);
List<IAttractionPoint> result = new Vector<IAttractionPoint>(IAttractionGenerator.attractionPoints);
Collections.shuffle(result, rnd);
return result.subList(0, Math.min(result.size(), number));
}
private List<AttractionPoint> getClusterPlaces(SimLocationActuator ms) {
List<AttractionPoint> result = new Vector<AttractionPoint>();
private List<IAttractionPoint> getClusterPlaces(SimLocationActuator ms) {
List<IAttractionPoint> result = new Vector<IAttractionPoint>();
SimHost msHost = mapMsHost.get(ms);
for (SimHost host : socialView.getCluster(msHost)) {
......@@ -318,8 +318,8 @@ public class SocialTransitionStrategy extends AbstractAttractionBasedAssignmentS
return result;
}
private List<AttractionPoint> getFriendsPlaces(SimLocationActuator ms) {
List<AttractionPoint> result = new Vector<AttractionPoint>();
private List<IAttractionPoint> getFriendsPlaces(SimLocationActuator ms) {
List<IAttractionPoint> result = new Vector<IAttractionPoint>();
SimHost msHost = mapMsHost.get(ms);
for (SimHost host : socialView.getNeighbors(msHost)) {
......@@ -332,13 +332,13 @@ public class SocialTransitionStrategy extends AbstractAttractionBasedAssignmentS
return result;
}
private List<AttractionPoint> getFavoritePlaces(SimLocationActuator ms) {
return new Vector<AttractionPoint>(favoritePlaces.get(ms));
private List<IAttractionPoint> getFavoritePlaces(SimLocationActuator ms) {
return new Vector<IAttractionPoint>(favoritePlaces.get(ms));
}
private void assignFavoritePlaces(SimLocationActuator ms) {
Set<AttractionPoint> msFavoritePlaces = new LinkedHashSet<AttractionPoint>();
LinkedList<AttractionPoint> temp = new LinkedList<AttractionPoint>(
Set<IAttractionPoint> msFavoritePlaces = new LinkedHashSet<IAttractionPoint>();
LinkedList<IAttractionPoint> temp = new LinkedList<IAttractionPoint>(
IAttractionGenerator.attractionPoints);
Collections.shuffle(temp, rnd);
for (int i = 0; i < numberOfFavoritePlaces; i++) {
......
......@@ -23,7 +23,7 @@ package de.tud.kom.p2psim.impl.topology.movement.modularosm.transition;
import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tudarmstadt.maki.simonstrator.api.Event;
import de.tudarmstadt.maki.simonstrator.api.EventHandler;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.AttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.component.sensor.location.IAttractionPoint;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
/**
......@@ -48,7 +48,7 @@ public class WeightedTransitionStrategy extends AbstractAttractionBasedAssignmen
@Override
public void addComponent(SimLocationActuator ms) {
AttractionPoint nextAP = getNewAttractionPointAssignment(ms);
IAttractionPoint nextAP = getNewAttractionPointAssignment(ms);
updateTargetAttractionPoint(ms, nextAP);
}
......@@ -63,7 +63,7 @@ public class WeightedTransitionStrategy extends AbstractAttractionBasedAssignmen
}
@Override
public void reachedAttractionPoint(SimLocationActuator ms, AttractionPoint attractionPoint) {
public void reachedAttractionPoint(SimLocationActuator ms, IAttractionPoint attractionPoint) {
// JZ: Added this to prevent multiple calls while pausing (otherwise most nodes will not wait more the minimum pause time)
if (!this.assignments.containsKey(ms)) {
return;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment