Esempio n. 1
0
  /**
   * The constructor for TL controllers
   *
   * @param The model being used.
   */
  public SL1TLC(Infrastructure infra) throws InfraException {
    super(infra);
    Node[] nodes =
        infra.getAllNodes(); // Moet Edge zijn eigenlijk, alleen testSimModel knalt er dan op
    int num_nodes = nodes.length;

    count = new Vector();

    int numSigns = infra.getAllInboundLanes().size();
    q_table = new float[numSigns + 1][][][];
    int num_specialnodes = infra.getNumSpecialNodes();
    for (int i = 0; i < nodes.length; i++) {
      Node n = nodes[i];
      Drivelane[] dls = n.getInboundLanes();
      for (int j = 0; j < dls.length; j++) {
        Drivelane d = dls[j];
        Sign s = d.getSign();
        int id = s.getId();
        int num_pos_on_dl = d.getCompleteLength();
        q_table[id] = new float[num_pos_on_dl][][];
        for (int k = 0; k < num_pos_on_dl; k++) {
          q_table[id][k] = new float[num_specialnodes][];
          for (int l = 0; l < q_table[id][k].length; l++) {
            q_table[id][k][l] = new float[2];
            q_table[id][k][l][0] = 0.0f;
            q_table[id][k][l][1] = 0.0f;
          }
        }
      }
    }
    System.out.println("Startet med Alpha = " + alpha);

    random_number = new Random();
  }
Esempio n. 2
0
  /**
   * Calculates how every traffic light should be switched Per node, per sign the waiting roadusers
   * are passed and per each roaduser the gain is calculated.
   *
   * @param The TLDecision is a tuple consisting of a traffic light and a reward (Q) value, for it
   *     to be green
   * @see gld.algo.tlc.TLDecision
   */
  public TLDecision[][] decideTLs() {
    int num_dec;
    int num_tld = tld.length;

    // Determine wheter it should be random or not
    boolean do_this_random = false;
    if (random_number.nextFloat() < random_chance) do_this_random = true;

    for (int i = 0; i < num_tld; i++) {
      num_dec = tld[i].length;
      for (int j = 0; j < num_dec; j++) {
        Sign currenttl = tld[i][j].getTL();
        float gain = 0;

        Drivelane currentlane = currenttl.getLane();
        int waitingsize = currentlane.getNumRoadusersWaiting();
        ListIterator queue = currentlane.getQueue().listIterator();

        if (!do_this_random) {
          for (; waitingsize > 0; waitingsize--) {
            Roaduser ru = (Roaduser) queue.next();
            int pos = ru.getPosition();
            Node destination = ru.getDestNode();
            gain +=
                q_table[currenttl.getId()][pos][destination.getId()][1]
                    - q_table[currenttl.getId()][pos][destination.getId()][0]; // red - green
          }
          float q = gain;
        } else gain = random_number.nextFloat();

        tld[i][j].setGain(gain);
      }
    }
    return tld;
  }
Esempio n. 3
0
 protected Sign getSign(Dictionary laneDictionary, int id) {
   Drivelane tmp = (Drivelane) (laneDictionary.get(new Integer(id)));
   if (tmp == null) {
     return null;
   } else {
     return tmp.getSign();
   }
 }
Esempio n. 4
0
  /* Returns whether or not the tails of the lanes not being accesible by the given array of Signs are free */
  public boolean areOtherTailsFree(Sign[] mayUse) {
    boolean[] pos = new boolean[4];
    Road[] roads = getAllRoads();
    Drivelane lane;
    int thisRoad;
    boolean[] targets;

    for (int i = 0; i < 4; i++) pos[i] = true;

    int num_mayuse = mayUse.length;

    for (int i = 0; i < num_mayuse; i++) {
      lane = mayUse[i].getLane();
      try {
        thisRoad = isConnectedAt(lane.getRoad());
      } catch (InfraException e) {
        thisRoad = 0;
        System.out.println("Something went wrong in areOtherTailsFree()");
      }
      targets = lane.getTargets();

      if (targets[0]) {
        pos[(thisRoad + 1) % 4] = false;
      } else if (targets[1]) {
        pos[(thisRoad + 2) % 4] = false;
      } else if (targets[2]) {
        pos[(thisRoad + 3) % 4] = false;
      }
    }

    int num_check = 0;
    for (int i = 0; i < 4; i++) {
      if (pos[i] && roads[i] != null) {
        Drivelane[] check = new Drivelane[0];
        try {
          check = roads[i].getOutboundLanes(this);
        } catch (Exception e) {
          check = new Drivelane[0];
          System.out.println("Something went wrong in areOtherTailsFree() 2");
        }

        num_check = check.length;
        for (int j = 0; j < num_check; j++) {
          if (!check[j].isTailFree()) {
            return false;
          }
        }
      }
    }
    return true;
  }
Esempio n. 5
0
  /* Needs Testing! */
  public Drivelane[] getLanesLeadingFrom(Drivelane lane, int ruType) throws InfraException {
    Road road = lane.getRoad();
    // Road[] which will contain the Roads of this Node in a sorted fashion:
    // [0] == the drivelanes on this Road will have to turn left to get to 'road', ..
    Road[] srt_rarr = new Road[3];

    if (allRoads[0] == road) {
      srt_rarr[0] = allRoads[1]; // Must turn left
      srt_rarr[1] = allRoads[2]; // Must go straight on
      srt_rarr[2] = allRoads[3]; // Must turn right
    } else if (allRoads[1] == road) {
      srt_rarr[0] = allRoads[2];
      srt_rarr[1] = allRoads[3];
      srt_rarr[2] = allRoads[0];
    } else if (allRoads[2] == road) {
      srt_rarr[0] = allRoads[3];
      srt_rarr[1] = allRoads[0];
      srt_rarr[2] = allRoads[1];
    } else {
      srt_rarr[0] = allRoads[0];
      srt_rarr[1] = allRoads[1];
      srt_rarr[2] = allRoads[2];
    }

    // System.out.println("Junction getLanesLeadingFrom "+nodeId);
    Vector v = new Vector();
    Drivelane[] lanes;
    int num_lanes;
    int cnt_lanes = 0;
    boolean[] targets = lane.getTargets();

    for (int i = 0; i < 3; i++) {
      if (srt_rarr[i] != null && targets[i] == true) {
        // System.out.println("Road at target:"+i+" isnt null, getting Outboundlanes");
        lanes = srt_rarr[i].getOutboundLanes(this);
        num_lanes = lanes.length;
        // System.out.println("Num lanes :"+num_lanes);
        for (int j = 0; j < num_lanes; j++) {
          Drivelane l = lanes[j];
          // System.out.println("Lane"+j+" being checked now. Has type:"+l.getType());
          if (l.mayUse(ruType)) {
            v.addElement(l);
            cnt_lanes++;
          }
        }
      }
    }
    return (Drivelane[]) v.toArray(new Drivelane[cnt_lanes]);
  }
Esempio n. 6
0
	/**
	* Calculates how every traffic light should be switched
	* Per node, per sign the waiting roadusers are passed and per each roaduser the gain is calculated.
	* @param The TLDecision is a tuple consisting of a traffic light and a reward (Q) value, for it to be green
	* @see gld.algo.tlc.TLDecision
	*/	
	public TLDecision[][] decideTLs()
	{
	    int num_dec, currenttlID, waitingsize, pos, destID;
	    float gain =0, passenger_factor;
	    Sign currenttl;
	    Drivelane currentlane;
	    ListIterator queue;
	    Roaduser ru;
	    
		//Determine wheter it should be random or not
		boolean randomrun = false;
		if (random_number.nextFloat() < random_chance) randomrun = true;
		
	    for (int i=0;i<num_nodes;i++) {
	    	num_dec = tld[i].length;
	    	for(int j=0;j<num_dec;j++) {
	    		currenttl = tld[i][j].getTL();
	    		currenttlID = currenttl.getId();
	    		currentlane = currenttl.getLane();
	    		
	    		waitingsize = currentlane.getNumRoadusersWaiting();
	    		queue = currentlane.getCompleteQueue().listIterator();
	    		gain = 0;
	    		
	    		for(; waitingsize>0; waitingsize--) {
	    			ru = (Roaduser) queue.next();
	    			pos = ru.getPosition();
	    			destID = ru.getDestNode().getId();
	    			passenger_factor = ru.getNumPassengers();
			    			
	    			gain += passenger_factor * (q_table[currenttlID][pos][destID][red_index] - q_table[currenttlID][pos][destID][green_index]);  //red - green
	    		}
	    		
				if(trackNode!=-1 && i==trackNode) {
					Drivelane currentlane2 = tld[i][j].getTL().getLane();
					boolean[] targets = currentlane2.getTargets();
					System.out.println("node: "+i+" light: "+j+" gain: "+gain+" "+targets[0]+" "+targets[1]+" "+targets[2]+" "+currentlane2.getNumRoadusersWaiting());
				}
				
                if(randomrun)
                	gain = random_number.nextFloat();
                	
				tld[i][j].setGain(gain);
			}
		}
		return tld;
	}
Esempio n. 7
0
  public Drivelane[] getLanesLeadingTo(Drivelane lane, int ruType) throws InfraException {
    Road road = lane.getRoad();
    // Road[] which will contain the Roads of this Node in a sorted fashion:
    // [0] == the drivelanes on this Road will have to turn left to get to 'road', ..
    Road[] srt_rarr = new Road[3];

    if (allRoads[0] == road) {
      srt_rarr[0] = allRoads[3]; // Must turn left
      srt_rarr[1] = allRoads[2]; // Must go straight on
      srt_rarr[2] = allRoads[1]; // Must turn right
    } else if (allRoads[1] == road) {
      srt_rarr[0] = allRoads[0];
      srt_rarr[1] = allRoads[3];
      srt_rarr[2] = allRoads[2];
    } else if (allRoads[2] == road) {
      srt_rarr[0] = allRoads[1];
      srt_rarr[1] = allRoads[0];
      srt_rarr[2] = allRoads[3];
    } else {
      srt_rarr[0] = allRoads[2];
      srt_rarr[1] = allRoads[1];
      srt_rarr[2] = allRoads[0];
    }

    Vector v = new Vector();
    Drivelane[] lanes;
    int num_lanes;
    int cnt_lanes = 0;
    boolean[] targets;

    for (int i = 0; i < 3; i++) {
      if (srt_rarr[i] != null) {
        lanes = srt_rarr[i].getInboundLanes(this);
        num_lanes = lanes.length;
        for (int j = 0; j < num_lanes; j++) {
          Drivelane l = lanes[j];
          targets = l.getTargets();
          if (targets[i] == true && l.mayUse(ruType)) {
            v.addElement(l);
            cnt_lanes++;
          }
        }
      }
    }

    return (Drivelane[]) v.toArray(new Drivelane[cnt_lanes]);
  }
Esempio n. 8
0
	public void updateRoaduserMove(Roaduser ru, Drivelane prevlane, Sign prevsign, int prevpos, Drivelane dlanenow, Sign signnow, int posnow, PosMov[] posMovs, Drivelane desired)
	{
		// Roaduser has just left the building
		if(dlanenow == null || signnow == null) {
			return;
		}
		
		//This ordening is important for the execution of the algorithm!
		int Ktl = dlanenow.getNumRoadusersWaiting();
		if(prevsign.getType()==Sign.TRAFFICLIGHT && (signnow.getType()==Sign.TRAFFICLIGHT || signnow.getType()==Sign.NO_SIGN)) {
			boolean light = prevsign.mayDrive();
			Node dest = ru.getDestNode();
			recalcP(prevsign, prevpos, dest, light, signnow, posnow, Ktl);			
			recalcVa(prevsign, prevpos, dest);
			recalcV(prevsign, prevpos, dest, light, Ktl);			
			recalcQa(prevsign, prevpos, dest, light, signnow, posnow, posMovs);
			recalcQ(prevsign, prevpos, dest, light, signnow, posnow, posMovs, Ktl);
		}
	}
Esempio n. 9
0
	public void setInfrastructure( Infrastructure infra )
	{	super.setInfrastructure(infra);
	
		Node[] nodes = infra.getAllNodes();
		num_nodes = nodes.length;
	
		try{
			int numSigns = infra.getAllInboundLanes().size();
		
			q_table 	= new float [numSigns][][][];
			qa_table	= new float [numSigns][][][];
			v_table 	= new float [numSigns][][];
			va_table	= new float [numSigns][][];
			count		= new Vector[numSigns][][];
			p_table 	= new Vector[numSigns][][];
			pKtl_table	= new Vector[numSigns][][];
			
			int num_specialnodes = infra.getNumSpecialNodes();

			for (int i=0; i<num_nodes; i++) {
				Node n = nodes[i];
				Drivelane[] dls = dls = n.getInboundLanes();
				int num_dls = num_dls = dls.length;
				// huh?
				Drivelane [] lanes = new Drivelane[numSigns];
				infra.getAllInboundLanes().copyInto(lanes);
				
				for (int j=0; j<num_dls; j++) {
					Drivelane d = dls[j];
					Sign s = d.getSign();
					int id = d.getId();
					int num_pos_on_dl = d.getCompleteLength();

					q_table[id]		= new float [num_pos_on_dl][][];
					qa_table[id]	= new float [num_pos_on_dl][][];
					v_table[id]		= new float [num_pos_on_dl][];
					va_table[id]	= new float [num_pos_on_dl][];
					count[id]		= new Vector[num_pos_on_dl][];
					p_table[id]		= new Vector[num_pos_on_dl][];
					pKtl_table[id]	= new Vector[num_pos_on_dl][];
					
					for (int k=0; k<num_pos_on_dl; k++) {
						q_table[id][k]	= new float[num_specialnodes][2];
						qa_table[id][k]	= new float[num_specialnodes][2];
						v_table[id][k]	= new float[num_specialnodes];
						va_table[id][k]	= new float[num_specialnodes];
						count[id][k]	= new Vector[num_specialnodes];
						p_table[id][k]	= new Vector[num_specialnodes];
						pKtl_table[id][k] =  new Vector[num_specialnodes];
						
						for (int l=0; l<num_specialnodes;l++) {
							q_table[id][k][l][0]	= 0.0f;
							q_table[id][k][l][1]	= 0.0f;
							qa_table[id][k][l][0]	= 0.0f;
							qa_table[id][k][l][1]	= 0.0f;
							v_table[id][k][l]		= 0.0f;
							va_table[id][k][l]		= 0.0f;
							count[id][k][l]			= new Vector();
							p_table[id][k][l]		= new Vector();
							pKtl_table[id][k][l]	= new Vector();
						}
					}
				}
			} 
			random_number = new Random();
		}
		catch(Exception e) { System.out.println("Error."); }
	}