Advertisement
Guest User

Untitled

a guest
Jan 16th, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.10 KB | None | 0 0
  1. package mas.agent.student;
  2.  
  3. import cz.agents.alite.communication.Message;
  4. import cz.agents.alite.communication.content.Content;
  5. import java.util.ArrayList;
  6. import java.util.HashMap;
  7. import java.util.HashSet;
  8. import java.util.Iterator;
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.Random;
  12. import java.util.Set;
  13. import mas.agent.MASQueenAgent;
  14.  
  15. /**
  16.  * This example agent illustrates the usage API available in the MASQueenAgent class.
  17.  */
  18. public class MyQueenAgent extends MASQueenAgent {
  19.     private int _selection;
  20.     private List<Integer> _reachAgents;
  21.     private HashMap<Integer, Integer> _view;
  22.     private Set<Map<Integer, Integer>> _noGoods;
  23.     Random rnd;
  24.  
  25.     public MyQueenAgent(int agentId, int nAgents) {
  26.         // Leave this method as it is...
  27.         super(agentId, nAgents);
  28.         rnd = new Random();
  29.         this._selection = rnd.nextInt(nAgents);
  30.         this._reachAgents = new ArrayList<>();
  31.         this._view = new HashMap<>();
  32.         this._noGoods = new HashSet<>();
  33.         for (int i = agentId + 1; i < nAgents; i++) {
  34.             _reachAgents.add(i);
  35.         }
  36.     }
  37.  
  38.     @Override
  39.     protected void start(int agentId, int nAgents) {
  40.         sendAllReachable(new HandleOk(getAgentId(), _selection));
  41.     }
  42.  
  43.     private void sendAllReachable(Content msg){
  44.         for(Integer agent : this._reachAgents){
  45.             sendMessage(agent.toString(), msg);
  46.         }
  47.     }
  48.  
  49.     @Override
  50.     protected void processMessages(List<Message> newMessages) {
  51.         // This method is called whenever there are any new messages for the robot
  52.  
  53.         // You can list the messages like this:
  54.         for (Message message : newMessages) {
  55.             Content cont = message.getContent();
  56.             if (cont instanceof HandleOk) {
  57.                 HandleOk handle = (HandleOk) cont;
  58.                 _view.put(handle.getSender(), handle.getValue());
  59.                 this.handle_Ok(handle);
  60.             } else if (cont instanceof HandleNoGood) {
  61.                 HandleNoGood handle = (HandleNoGood) cont;
  62.                 this.handle_noGood(handle);
  63.             } else if (cont instanceof HandleNoSolution) {
  64.                 notifySolutionDoesNotExist();
  65.             } else if (cont instanceof HandleSolution) {
  66.                 HandleSolution handle = (HandleSolution) cont;
  67.                 if(handle.getIsFinal()){
  68.                     notifySolutionFound(_selection);
  69.                 } else {
  70.                     handle_solutionNotFinal(handle);
  71.                 }
  72.             } else {
  73.                 System.out.println("---");
  74.             }
  75.         }
  76.  
  77.     }
  78.  
  79.     private void handle_Ok(HandleOk handle){
  80.         if (!isConsistent(handle.getSender(), handle.getValue())) {
  81.             // generate new assignment or nogood
  82.             createNewSelection();
  83.         } else if (getAgentId() == nAgents() - 1 && _view.size() == nAgents() - 1) {
  84.             // lowest priority agent will suggest a solution
  85.             HashMap<Integer, Integer> solution = new HashMap<>(_view);
  86.             solution.put(getAgentId(), _selection);
  87.             sendMessage(Integer.toString(getAgentId() - 1), new HandleSolution(solution, false));
  88.         }
  89.     }
  90.  
  91.     private void handle_noGood(HandleNoGood handle){
  92.         if (!isNoGood(handle, false)) {
  93.             sendAllReachable(new HandleOk(getAgentId(), _selection));
  94.             return;
  95.         }
  96.         _noGoods.add(handle.getView());
  97.         for (Map.Entry<Integer, Integer> entry : handle.getView().entrySet()) {
  98.             if (!_view.containsKey(entry.getKey()) && entry.getKey() != getAgentId()) {
  99.                 _view.put(entry.getKey(), entry.getValue());
  100.             }
  101.         }
  102.         createNewSelection();
  103.     }
  104.  
  105.     private void handle_solutionNotFinal(HandleSolution handle){
  106.         if (validateSolution(handle.getView())) {
  107.             if (getAgentId() == 0) {
  108.                 broadcast(new HandleSolution(_view,true));
  109.                 notifySolutionFound(_selection);
  110.             } else {
  111.                 sendMessage(Integer.toString(getAgentId() - 1), handle);
  112.             }
  113.         } else {
  114.             sendAllReachable(new HandleOk(getAgentId(), _selection));
  115.         }
  116.     }
  117.  
  118.     private void createNewSelection(){
  119.         Integer validSelection = -1;
  120.         ArrayList<Integer> validList = new ArrayList<>();
  121.         for(int i=0; i<nAgents();i++) {
  122.             if (i != this._selection) {
  123.                 boolean isValid = true;
  124.                 for (Map.Entry<Integer, Integer> entry : _view.entrySet()) {
  125.                     if (!isConsistent(entry.getKey(), entry.getValue(), getAgentId(), i)) {
  126.                         isValid = false;
  127.                         break;
  128.                     }
  129.                 }
  130.                 Iterator<Map<Integer, Integer>> it = _noGoods.iterator();
  131.                 while (it.hasNext()) {
  132.                     Map<Integer, Integer> noGood = it.next();
  133.                     for (Map.Entry<Integer, Integer> entry : noGood.entrySet()) {
  134.                         if (entry.getKey() == getAgentId() && entry.getValue() == i) {
  135.                             isValid = false;
  136.                             break;
  137.                         }
  138.                     }
  139.                 }
  140.                 if (isValid) {
  141.                     validList.add(i);
  142.                 }
  143.             }
  144.         }
  145.         if (validList.isEmpty()) {
  146.             validSelection =  -1;
  147.         } else {
  148.             Random r = new Random();
  149.             validSelection = validList.get(rnd.nextInt(validList.size()));
  150.         }
  151.         if (validSelection == -1){
  152.             int index = createNoGood();
  153.             if (index != -1){
  154.                 this._view.remove(index);
  155.                 createNewSelection();
  156.             }
  157.         } else {
  158.             this._selection = validSelection;
  159.             if (getAgentId() == nAgents() - 1 && _view.size() == nAgents() - 1) {
  160.                 HashMap<Integer, Integer> solu = new HashMap<>(_view);
  161.                 solu.put(getAgentId(), _selection);
  162.                 sendMessage(getAgentId() - 1 + "", new HandleSolution(solu,false));
  163.             } else {
  164.                 sendAllReachable(new HandleOk(getAgentId(), this._selection));
  165.             }
  166.         }
  167.     }
  168.  
  169.     private int createNoGood() {
  170.         if (_view.isEmpty()) {
  171.             broadcast(new HandleNoSolution());
  172.             notifySolutionDoesNotExist();
  173.             return -1;
  174.         } else {
  175.             int agent = -1;
  176.                 for (Integer i : _view.keySet()) {
  177.                     if (i > agent) {
  178.                         agent = i;
  179.                     }
  180.                 }
  181.             sendMessage("" + agent, new HandleNoGood(_view));
  182.             return agent;
  183.         }
  184.     }
  185.  
  186.     private boolean isConsistent(int sender, int assignment) {
  187.         return isConsistent(sender, assignment, getAgentId(), _selection);
  188.     }
  189.  
  190.     private boolean isConsistent(int senderId, int senderAssignment, int myId, int myAssignment) {
  191.         //column check
  192.         if (myAssignment == senderAssignment) {
  193.             return false;
  194.             // diagonal check
  195.         } else if (myId - senderId == Math.abs(myAssignment - senderAssignment)) {
  196.             return false;
  197.         }
  198.         return true;
  199.     }
  200.  
  201.     private boolean isNoGood(HandleNoGood noGood, boolean skipMe) {
  202.         return isNoGood(noGood.getView().entrySet(), skipMe);
  203.     }
  204.  
  205.     private boolean isNoGood(Set<Map.Entry<Integer, Integer>> noGood, boolean skipMe) {
  206.         boolean valid = true;
  207.         for (Map.Entry<Integer, Integer> entry : noGood) {
  208.             if (skipMe) {
  209.                 if (entry.getKey() == getAgentId()) {
  210.                     continue;
  211.                 }
  212.             } else {
  213.                 if (entry.getKey() == getAgentId()) {
  214.                     if (entry.getValue() != _selection) {
  215.                         valid = false;
  216.                         break;
  217.                     } else {
  218.                         continue;
  219.                     }
  220.                 }
  221.             }
  222.             if (_view.containsKey(entry.getKey())) {
  223.                 if (_view.get(entry.getKey()).intValue() != entry.getValue()){
  224.                     valid = false;
  225.                     break;
  226.                 }
  227.             } else {
  228.                 valid = false;
  229.                 break;
  230.             }
  231.         }
  232.         return valid;
  233.     }
  234.  
  235.     private boolean validateSolution(Map<Integer, Integer> assignments) {
  236.         for (Map.Entry<Integer, Integer> entry : assignments.entrySet()) {
  237.             if (entry.getKey() == getAgentId()) {
  238.                 if (entry.getValue() == _selection) {
  239.                     continue;
  240.                 } else {
  241.                     return false;
  242.                 }
  243.             }
  244.             if (entry.getKey() < getAgentId()) {
  245.                 if (_view.containsKey(entry.getKey())) {
  246.                     if (entry.getValue().intValue() != _view.get(entry.getKey()).intValue()) {
  247.                         return false;
  248.                     }
  249.                 } else {
  250.                     return false;
  251.                 }
  252.             }
  253.         }
  254.         return true;
  255.     }
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement