//This function return orders the elevator should stop for func Stop(myip string, mystate string) []Network.Request { var takerequest []Network.Request requestlist := Network.GetRequestList() for _, request := range requestlist { if (request.Direction == Elevator.BUTTON_COMMAND && request.Source == myip) || (request.Direction == Elevator.BUTTON_CALL_UP && mystate == "UP") || (request.Direction == Elevator.BUTTON_CALL_DOWN && mystate == "DOWN") { if request.Floor == Elevator.CurrentFloor() && Elevator.AtFloor() { takerequest = append(takerequest, request) } } } return takerequest }
// Nextrequest will provide the best elevator for each request, using the three above functions func Nextrequest(localip string, Elevatorlist []extra.Elevator) Network.Request { var statelist = make(map[string]Network.Info) infolist := Network.GetInfoList() for host, info := range infolist { statelist[host] = info } requestlist := Network.GetRequestList() loop: for _, request := range requestlist { if !InternalOrExternal(request) { go Externalrequest(localip, Elevatorlist, request) return externalrequest continue loop } else { go Internalrequest(localip, Elevatorlist, request) return internalrequest continue loop } } return Network.NoRequest[0] }
//This function does a BFS-search through all orders to find the most effective solution func Nextrequest(myip string, Elevatorlist []misc.Elevator) Network.Request { var statelist = make(map[string]Network.Info) infolist := Network.GetInfoList() for host, info := range infolist { statelist[host] = info } requestlist := Network.GetRequestList() insideloop: for _, request := range requestlist { if request.Direction != Elevator.BUTTON_COMMAND { continue insideloop } for _, elevator := range Elevatorlist { if info, ok := statelist[Elevator.Address]; ok { if ((info.State == "UP" || info.State == "IDLE") && info.LastFloor <= request.Floor) || ((info.State == "DOWN" || info.State == "IDLE") && info.LastFloor >= request.Floor) { if info.Source == request.Source { if info.Source == myip { return request } else { delete(statelist, Elevator.Address) continue insideloop } } } } } for _, elevator := range Elevatorlist { if info, ok := statelist[Elevator.Address]; ok { if (info.State == "UP" && info.LastFloor >= request.Floor) || (info.State == "DOWN" && info.LastFloor <= request.Floor) { if info.Source == request.Source { if info.Source == myip { return request } else { delete(statelist, Elevator.Address) continue insideloop } } } } } } requestloop: for _, request := range requestlist { if request.Direction == Elevator.BUTTON_COMMAND { continue requestloop } for i := 0; i < Elevator.N_FLOORS; i++ { for _, elevator := range Elevatorlist { if info, ok := statelist[Elevator.Address]; ok { if i != 0 && (info.State == "UP" && info.LastFloor+i == request.Floor) || (info.State == "DOWN" && info.LastFloor-i == request.Floor) { if statelist[Elevator.Address].Source == myip { return request } else { delete(statelist, Elevator.Address) continue requestloop } } } } for _, elevator := range Elevatorlist { if info, ok := statelist[Elevator.Address]; ok { if info.State == "IDLE" && (info.LastFloor == request.Floor+i || info.LastFloor == request.Floor-i) { if statelist[Elevator.Address].Source == myip { return request } else { delete(statelist, Elevator.Address) continue requestloop } } } } } } return Network.EmptyRequest[0] }