public void runOptimisticUnchoke(){
		RUBTConstants.main_log.info("*** RUNNING OPTIMISTIC UNCHOKE ***");
		if (this.activePeers.size() >= RUBTConstants.MAX_UNCHOKED_PEERS)
		{
			RUBTConstants.main_log.info("too little active peers: " + this.activePeers.size());
			return;
		}
		//Lookup selected peer in active list to unchoke
		ArrayList<Peer> chokedPeers =  new ArrayList<Peer>();
		if(RUBTToolKit.isSeed(this.client_info.getClient_bitfield())){
			// when only uploading our end needs unchocked
			for(Peer peer: this.connectedPeers){
				if(peer.getLocalStatus() == RUBTConstants.PeerStatus.CHOKED){
					chokedPeers.add(peer);
				}
			}
			//Otherwise, repeat same process with upload rates
		}else{
			// when still downloading their end needs unchocked
			for(Peer peer: this.connectedPeers){
				if(peer.getRemoteStatus() == RUBTConstants.PeerStatus.CHOKED){
					chokedPeers.add(peer);
				}
			}
		}
		//Generate a random peer to unchoke within choked list
		//seed your random
		Random rand = new Random(System.currentTimeMillis());
		final Peer luckyPeer = chokedPeers.get(rand.nextInt(chokedPeers.size()));
		RUBTConstants.main_log.info("Peer choosed by optimistic unchocke is " + luckyPeer.toString());
		this.workers.execute(new Runnable() {
			@Override
			public void run() {
				try {
					if(RUBTToolKit.isSeed(Manager.this.client_info.getClient_bitfield()))
					{
						//open our end
						luckyPeer.setLocalStatus(RUBTConstants.PeerStatus.UNCHOKED);
						luckyPeer.sendMessageToPeer(new UnchokeMessage());
						luckyPeer.peer_log.info("Peer is unchoked in optimistic unchoke!");
					}
					else
					{
						//try to open their end, send interested
						luckyPeer.setRemoteStatus(RUBTConstants.PeerStatus.INTERESTED);
						luckyPeer.peer_log.info("sending interested to peer");
						luckyPeer.sendMessageToPeer(RUBTConstants.INTERESTED_MESSAGE);
					}
					if (!Manager.this.activePeers.contains(luckyPeer))
					{
						Manager.this.activePeers.add(luckyPeer);
					}
				} catch (IOException e) {
					//peer socket is bad disconnect
					Manager.this.connectedPeers.remove(luckyPeer);
					Manager.this.activePeers.remove(luckyPeer);
					luckyPeer.removeMessageListener(Manager.this);
					luckyPeer.disconnect();
				}
			}
		});
	}