Advertisement
Guest User

Untitled

a guest
Dec 30th, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Groovy 14.43 KB | None | 0 0
  1. package boarding.relogo
  2.  
  3. import static repast.simphony.relogo.Utility.*;
  4. import static repast.simphony.relogo.UtilityG.*;
  5. import repast.simphony.relogo.Stop;
  6. import repast.simphony.relogo.Utility;
  7. import repast.simphony.relogo.UtilityG;
  8. import repast.simphony.relogo.schedule.Go;
  9. import repast.simphony.relogo.schedule.Setup;
  10. import boarding.ReLogoObserver;
  11.  
  12. class UserObserver extends ReLogoObserver
  13. {
  14.     List<Integer> freeSeats = java.util.stream.IntStream.rangeClosed(1, 3).toArray()
  15.     Map<Integer, List<Integer>> seatCoords = new HashMap<Integer, List<Integer>>()
  16.    
  17.     Integer maxPassengers = 3
  18.    
  19.     Map<Passenger, List<Passenger>> shufflingPassengers = new HashMap<Passenger, List<Passenger>>()
  20.    
  21.     @Setup
  22.     def setup()
  23.     {
  24.         GeneratePlane()
  25.        
  26.         setDefaultShape(Passenger, "person")
  27.         __Board(patch(-10, 0)) //first person
  28.     }
  29.    
  30.     @Go
  31.     def go()
  32.     {
  33.         def passengers = turtles()
  34.        
  35.         MovePassengers(passengers)
  36.        
  37.         BoardNewPassenger(passengers)
  38.     }
  39.    
  40.     def __CheckNextPassengerIfShuffling(movingPassenger, parentPassenger, listMovingPassengers)
  41.     {
  42.         def parentSeatX, parentSeatY
  43.         (parentSeatX, parentSeatY) = GetSeatCoords(parentPassenger.seatID)
  44.        
  45.         def seatX, seatY
  46.         (seatX, seatY) = GetSeatCoords(movingPassenger.seatID)
  47.        
  48.         def sign = CalculateSeatSide(parentPassenger, parentSeatY)
  49.        
  50.         def movingPassSign = CalculateSeatSide(movingPassenger, seatY)
  51.        
  52.         if(seatX == movingPassenger.getXcor() && movingPassSign == sign) // Passenger has seat at opposite side of plane
  53.         {
  54.             if(sign < 0)
  55.             {
  56.                 if(seatY > parentSeatY)
  57.                 {
  58.                     if(movingPassenger.parent != null)
  59.                         return true
  60.                        
  61.                     movingPassenger.moving = true
  62.                    
  63.                     movingPassenger.parent = parentPassenger
  64.                    
  65.                     listMovingPassengers = shufflingPassengers.get(parentPassenger)
  66.                     listMovingPassengers.add(movingPassenger)
  67.                    
  68.                     return false
  69.                 }
  70.             }
  71.             else
  72.             {
  73.                 if(seatY < parentSeatY)
  74.                 {
  75.                     if(movingPassenger.parent != null)
  76.                         return true
  77.                    
  78.                     movingPassenger.moving = true
  79.                    
  80.                     movingPassenger.parent = parentPassenger
  81.                    
  82.                     listMovingPassengers = shufflingPassengers.get(parentPassenger)
  83.                     listMovingPassengers.add(movingPassenger)
  84.                    
  85.                     return false
  86.                 }
  87.             }
  88.         }
  89.     }
  90.    
  91.     def DefinePassengersToShuffle(parentPassenger, parentSeatX, parentSeatY)
  92.     {
  93.         def sign = CalculateSeatSide(parentPassenger, parentSeatY)
  94.        
  95.         if(sign < 0)
  96.         {
  97.             def listMovingPassengers = new ArrayList<Passenger>()
  98.             for(int y = 0; y > parentSeatY; y += sign)
  99.             {
  100.                 def turtles = turtlesOn(patch(parentSeatX, y))
  101.                
  102.                 if(turtles.size() != 1)
  103.                     continue
  104.                
  105.                 def movingPassenger = turtles.get(0)
  106.                
  107.                 def passengerBusy = __CheckNextPassengerIfShuffling(movingPassenger, parentPassenger, listMovingPassengers)
  108.                
  109.                 return passengerBusy
  110.             }
  111.         }
  112.         else
  113.         {
  114.             def listMovingPassengers = new ArrayList<Passenger>()
  115.             for(int y = 0; y < parentSeatY; y += sign)
  116.             {
  117.                 def turtles = turtlesOn(patch(parentSeatX, y))
  118.                
  119.                 if(turtles.size() != 1)
  120.                     continue
  121.                    
  122.                 def movingPassenger = turtles.get(0)
  123.                
  124.                 def passengerBusy = __CheckNextPassengerIfShuffling(movingPassenger, parentPassenger, listMovingPassengers)
  125.                
  126.                 return passengerBusy
  127.             }
  128.         }
  129.     }
  130.    
  131.     def MovePassengers(passengers)
  132.     {
  133.         for(int index = 0; index < passengers.size(); index++)
  134.         {
  135.             def currentPassenger = passengers.get(index)
  136.            
  137.             if(currentPassenger.shuffling)
  138.             {
  139.                 SeatShuffle2(currentPassenger)
  140.             }
  141.             else
  142.             {
  143.                 if(currentPassenger.seated || currentPassenger.moving)
  144.                     continue
  145.                
  146.                 def currentPatch = currentPassenger.patchHere()
  147.                
  148.                 def seatX
  149.                 def seatY
  150.                 (seatX, seatY) = GetSeatCoords(currentPassenger.seatID)
  151.                
  152.                 if(seatX == currentPassenger.getXcor() + 1)
  153.                 {
  154.                     shufflingPassengers.put(currentPassenger, new ArrayList<Passenger>())
  155.                    
  156.                     def passengerBusy = DefinePassengersToShuffle(currentPassenger, seatX, seatY)
  157.                    
  158.                     if(passengerBusy == true)
  159.                     {
  160.                         shufflingPassengers.remove(currentPassenger)
  161.                     }
  162.                     else
  163.                     {
  164.                         currentPassenger.shuffling = true
  165.                         currentPassenger.parent = currentPassenger
  166.                         SeatShuffle2(currentPassenger)
  167.                     }
  168.                 }
  169.                 else
  170.                 {
  171.                     MoveToNextPatch(currentPassenger)
  172.                 }
  173.             }
  174.         }
  175.     }
  176.    
  177.     def SeatShuffle2(parentPassenger)
  178.     {
  179.         def passengersNeededToMove = shufflingPassengers.get(parentPassenger)
  180.        
  181.         def passengersNum = passengersNeededToMove.size()
  182.        
  183.         def CloserFurther = GetCloserFurtherPassenger(passengersNeededToMove)
  184.        
  185.         def passengerClosestToCorridor = CloserFurther[0]
  186.         def passengerFurtherToCorridor = CloserFurther[1]
  187.        
  188.         if(passengersNum == 0)
  189.         {
  190.             ExecuteParentSuffle(parentPassenger, passengersNum)
  191.         }
  192.        
  193.         else // There are some passengers that need to move.
  194.         {
  195.             if(passengersNum == 1) // passengerFurtherToCorridor == null (only one passenger needs to move)
  196.             {
  197.                 if(passengerClosestToCorridor.goingToSeat == true)
  198.                     return
  199.                
  200.                 if(passengerClosestToCorridor.movedOnRightPosition == false)
  201.                     ExecuteShuffleStep(passengerClosestToCorridor, parentPassenger)
  202.                
  203.                 else if(passengerClosestToCorridor.movedOnRightPosition == true || passengerClosestToCorridor.seated == true)
  204.                 {
  205.                     ExecuteParentSuffle(parentPassenger, passengersNum)
  206.                     ExecuteShuffleStep(passengerClosestToCorridor, parentPassenger)
  207.                 }
  208.             }
  209.            
  210.             else if(passengersNum == 2)
  211.             {
  212.                 if(passengerClosestToCorridor.goingToSeat == true || passengerFurtherToCorridor.goingToSeat == true)
  213.                     return
  214.                
  215.                 if(passengerClosestToCorridor.movedOnRightPosition == false && passengerFurtherToCorridor.movedOnRightPosition == false)
  216.                 {
  217.                     ExecuteShuffleStep(passengerClosestToCorridor, parentPassenger, 2)
  218.                     ExecuteShuffleStep(passengerFurtherToCorridor, parentPassenger, 1)
  219.                 }
  220.                
  221.                 else if((passengerClosestToCorridor.movedOnRightPosition == true || passengerClosestToCorridor.seated == true) &&
  222.                     (passengerFurtherToCorridor.movedOnRightPosition == true || passengerFurtherToCorridor.seated == true))
  223.                 {
  224.                     ExecuteParentSuffle(parentPassenger, passengersNum)
  225.                     ExecuteShuffleStep(passengerFurtherToCorridor, parentPassenger, 1)
  226.                     ExecuteShuffleStep(passengerClosestToCorridor, parentPassenger, 2)
  227.                    
  228.                 }
  229.             }
  230.         }
  231.        
  232.         println("Shuffling Passengers:")
  233.         println(shufflingPassengers)
  234.        
  235.         println("parent passenger: " + parentPassenger.seatID)
  236.         println("passengersNum = " + passengersNum)
  237.         for(int i = 0; i < passengersNum; i++)
  238.         {
  239.             def pass = passengersNeededToMove.get(i)
  240.             println("moving passenger: " + pass.seatID)
  241.             println("seated = " + pass.seated)
  242.             println("shuffling = " + pass.shuffling)
  243.             println("moving = " + pass.moving)
  244.             println("movedOnRightPosition = " + pass.movedOnRightPosition)
  245.             println("comingBack = " + pass.comingBack)
  246.             println("goingToSeat = " + pass.goingToSeat)
  247.         }
  248.         println("-------------")
  249.        
  250.     }
  251.    
  252.     def ExecuteParentSuffle(parentPassenger, passengersNeededToMoveSize)
  253.     {
  254.         def seatX, seatY
  255.         (seatX, seatY) = GetSeatCoords(parentPassenger.seatID)
  256.        
  257.         def pasX = parentPassenger.getXcor()
  258.         def pasY = parentPassenger.getYcor()
  259.        
  260.         if(pasX == seatX)
  261.         {
  262.             MoveTowardSeat(parentPassenger)
  263.            
  264.             pasY = parentPassenger.getYcor()
  265.             if(pasY == seatY)
  266.             {
  267.                 parentPassenger.seated = true
  268.                 parentPassenger.goingToSeat = false
  269.                
  270.                 if(passengersNeededToMoveSize == 0)
  271.                 {
  272.                     shufflingPassengers.remove(parentPassenger)
  273.                     parentPassenger.shuffling = false
  274.                     parentPassenger.parent = null
  275.                 }
  276.             }
  277.         }
  278.         else
  279.         {
  280.             parentPassenger.goingToSeat = true
  281.             MoveToNextPatch(parentPassenger)
  282.         }
  283.     }
  284.    
  285.     /**
  286.      * Execute shuffle for passenger that needs to move.
  287.      *
  288.      * @param passenger Passenger that needs to move.
  289.      * @param parentPassenger Parent passenger of passenger.
  290.      * @param placeOffset Offset of passenger's seatX set to 1 as default (assuming only one passenger needs to move).
  291.      */
  292.     def ExecuteShuffleStep(passenger, parentPassenger, placeOffset=1)
  293.     {
  294.         def shufSeatX, shufSeatY
  295.         (shufSeatX, shufSeatY) = GetSeatCoords(passenger.seatID)
  296.        
  297.         def shufCurrentX = passenger.getXcor()
  298.         def shufCurrentY = passenger.getYcor()
  299.        
  300.         if(shufCurrentY == 0 || passenger.comingBack == true) // At corridor
  301.         {
  302.             if(!passenger.movedOnRightPosition) // Moving for parent to be able to take their seat
  303.             {
  304.                 MoveToNextPatch(passenger)
  305.                
  306.                 shufCurrentX = passenger.getXcor()
  307.                 if(shufCurrentX == shufSeatX + placeOffset)
  308.                     passenger.movedOnRightPosition = true
  309.             }
  310.             else if(parentPassenger.getYcor() != 0) // Parent is moving to his seat
  311.             {
  312.                 passenger.comingBack = true
  313.                 ComeBackToSeat(passenger)
  314.                
  315.                 CheckIfPassengersSeated(parentPassenger)
  316.             }
  317.             // else wait till everything is done
  318.         }
  319.         else
  320.         {
  321.             MoveTowardCorridor(passenger)
  322.            
  323.             shufCurrentY = passenger.getYcor()
  324.             if(passenger.seated && shufCurrentY != shufSeatY)
  325.             {
  326.                 passenger.seated = false
  327.                 passenger.moving = true
  328.             }
  329.         }
  330.     }
  331.    
  332.     def CalculateSeatSide(passenger, seatY)
  333.     {
  334.         def sign
  335.         if(seatY < 0)
  336.             sign = -1
  337.         else
  338.             sign = 1
  339.            
  340.         return sign
  341.     }
  342.    
  343.     def ComeBackToSeat(passenger)
  344.     {
  345.         def seatX, seatY
  346.         (seatX, seatY) = GetSeatCoords(passenger.seatID)
  347.        
  348.         def sign = CalculateSeatSide(passenger, seatY)
  349.        
  350.         def pasX = passenger.getXcor()
  351.         def pasY = passenger.getYcor()
  352.        
  353.         def currentPatch = patch(pasX, pasY)
  354.        
  355.         if(pasX != seatX)
  356.         {
  357.             MoveToPreviousPatch(passenger)
  358.         }
  359.         else
  360.         {
  361.             MoveTowardSeat(passenger)
  362.            
  363.             pasY = passenger.getYcor()
  364.             if(pasY == seatY)
  365.             {
  366.                 passenger.movedOnRightPosition = false
  367.                 passenger.comingBack = false
  368.                 passenger.seated = true
  369.                 passenger.moving = false
  370.             }
  371.         }
  372.     }
  373.    
  374.     def CheckIfPassengersSeated(parentPassenger)
  375.     {
  376.         def passengers = shufflingPassengers.get(parentPassenger)
  377.         def pasSize = passengers.size()
  378.        
  379.         def numSeated = 0
  380.        
  381.         if(parentPassenger.seated == true)
  382.             numSeated++
  383.        
  384.         for(int i = 0; i < pasSize; i++)
  385.         {
  386.             if(passengers.get(i).seated == true)
  387.                 numSeated++
  388.         }
  389.        
  390.         if(numSeated == pasSize + 1) // parent + children
  391.         {
  392.             for(int i = 0; i < pasSize; i++)
  393.             {
  394.                 def pas = passengers.get(i)
  395.                 pas.parent = null
  396.             }
  397.             parentPassenger.shuffling = false
  398.             parentPassenger.parent = null
  399.             shufflingPassengers.remove(parentPassenger)
  400.         }
  401.     }
  402.    
  403.     def MoveToPreviousPatch(passenger)
  404.     {
  405.         def seatX, seatY
  406.         (seatX, seatY) = GetSeatCoords(passenger.seatID)
  407.        
  408.         def sign = CalculateSeatSide(passenger, seatY)
  409.        
  410.         def pasX = passenger.getXcor()
  411.         def pasY = passenger.getYcor()
  412.        
  413.         def currentPatch = patch(pasX, pasY)
  414.         def previousPatch = patch(pasX - 1, pasY)
  415.        
  416.         if(!previousPatch.occupied)
  417.         {
  418.             currentPatch.occupied = false
  419.             passenger.moveTo(previousPatch)
  420.             previousPatch.occupied = true
  421.         }
  422.     }
  423.    
  424.     def MoveToNextPatch(passenger)
  425.     {
  426.         def seatX, seatY
  427.         (seatX, seatY) = GetSeatCoords(passenger.seatID)
  428.        
  429.         def sign = CalculateSeatSide(passenger, seatY)
  430.        
  431.         def pasX = passenger.getXcor()
  432.         def pasY = passenger.getYcor()
  433.        
  434.         def currentPatch = patch(pasX, pasY)
  435.         def nextPatch = patch(pasX + 1, pasY)
  436.        
  437.         if(!nextPatch.occupied)
  438.         {
  439.             currentPatch.occupied = false
  440.             passenger.moveTo(nextPatch)
  441.             nextPatch.occupied = true
  442.         }
  443.     }
  444.    
  445.     def MoveTowardSeat(passenger)
  446.     {
  447.         def seatX, seatY
  448.         (seatX, seatY) = GetSeatCoords(passenger.seatID)
  449.        
  450.         def sign = CalculateSeatSide(passenger, seatY)
  451.        
  452.         def pasX = passenger.getXcor()
  453.         def pasY = passenger.getYcor()
  454.        
  455.         def currentPatch = patch(pasX, pasY)
  456.         def patchNextSeat = patch(pasX, pasY += sign)
  457.        
  458.         if(!patchNextSeat.occupied)
  459.         {
  460.             currentPatch.occupied = false
  461.             passenger.moveTo(patchNextSeat)
  462.             patchNextSeat.occupied = true
  463.         }
  464.     }
  465.    
  466.     def MoveTowardCorridor(passenger)
  467.     {
  468.         def seatX, seatY
  469.         (seatX, seatY) = GetSeatCoords(passenger.seatID)
  470.        
  471.         def sign = CalculateSeatSide(passenger, seatY)
  472.        
  473.         def pasX = passenger.getXcor()
  474.         def pasY = passenger.getYcor()
  475.        
  476.         def currentPatch = patch(pasX, pasY)
  477.         def patchNextSeat = patch(pasX, pasY -= sign)
  478.        
  479.         if(!patchNextSeat.occupied)
  480.         {
  481.             currentPatch.occupied = false
  482.             passenger.moveTo(patchNextSeat)
  483.             patchNextSeat.occupied = true
  484.         }
  485.     }
  486.    
  487.     def GetSeatCoords(ID)
  488.     {
  489.         def coords = seatCoords.get(ID)
  490.         return coords
  491.     }
  492.    
  493.     def GetCloserFurtherPassenger(passengersNeededToMove)
  494.     {
  495.         def passengersNum = passengersNeededToMove.size()
  496.        
  497.         def passengerClosestToCorridor = null
  498.         def passengerFurtherToCorridor = null
  499.        
  500.         def tempY = 0
  501.         for(int i = 0; i < passengersNum; i++)
  502.         {
  503.             def passenger = passengersNeededToMove[i]
  504.             if(tempY == 0 || abs(passenger.getYcor()) < tempY)
  505.             {
  506.                 tempY = abs(passenger.getYcor())
  507.                
  508.                 if(passengerClosestToCorridor != null)
  509.                     passengerFurtherToCorridor = passengerClosestToCorridor // previous closest is now further
  510.                
  511.                 passengerClosestToCorridor = passenger
  512.             }
  513.             else
  514.                 passengerFurtherToCorridor = passenger
  515.         }
  516.        
  517.         def CloserFurther = [passengerClosestToCorridor, passengerFurtherToCorridor]
  518.         return CloserFurther
  519.     }
  520.    
  521.     def GeneratePlane()
  522.     {
  523.         def corridorColor = 5
  524.         def seatColor = 105
  525.         def count = 1
  526.        
  527.         for(int x = -10; x <= 10; x++)
  528.         {
  529.             if(seatColor == 105)
  530.                 seatColor = 106
  531.             else
  532.                 seatColor = 105
  533.                
  534.             for(int y = 3; y >= -3; y--)
  535.             {              
  536.                 def currentPatch = patch(x, y)
  537.                
  538.                 if(x > -8 && x < 9 && y != 0)
  539.                 {
  540.                     currentPatch.setPcolor(seatColor)
  541.                     currentPatch.ID = count
  542.                     seatCoords.put(count, [x, y])
  543.                     currentPatch.setPlabel(currentPatch.ID)
  544.                     count++
  545.    
  546.                     if(seatColor == 105)
  547.                         seatColor = 106
  548.                     else
  549.                         seatColor = 105
  550.                 }
  551.                 else
  552.                 {
  553.                     currentPatch.setPcolor(corridorColor)
  554.    
  555.                     if(corridorColor == 5)
  556.                         corridorColor = 6
  557.                     else
  558.                         corridorColor = 5
  559.                 }
  560.             }
  561.         }
  562.     }
  563.  
  564.     def __Board(firstPatch)
  565.     {
  566.         def passenger = createPassengers(1)
  567.        
  568.         passenger[0].setXcor(-10)
  569.         passenger[0].setYcor(0)
  570.        
  571.         passenger[0].setColor(white())
  572.        
  573.         def id_index = random(freeSeats.size())
  574.         passenger[0].seatID = freeSeats.remove(id_index)
  575.         passenger[0].setLabel(passenger[0].seatID)
  576.         passenger[0].setLabelColor(black())
  577.        
  578.         def currentPatch = passenger[0].patchHere()
  579.         currentPatch.occupied = true
  580.     }
  581.    
  582.     def BoardNewPassenger(passengers)
  583.     {
  584.         def firstPatch = patch(-10, 0)
  585.         if(!firstPatch.occupied && passengers.size() != maxPassengers)
  586.         {
  587.             __Board(firstPatch)
  588.         }
  589.     }
  590. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement