コード例 #1
0
    def wrapperIDtoCoords(zoneID, coord):
        out = sf.zoneIDtoCoordinates(zoneID)

        if coord == "lon":
            return out[0]
        else:
            return out[1]
コード例 #2
0
def toStringBooking(Stamp,Event,ToRecharge,Recharged,NearestCar,Distance,Iter,\
                     Discharge,TripDistance,FileID,extractedP,ZoneID,OccupiedCS,
                     Recharge, StartRecharge,StartRechageLVL, PoleID):

    Lvl = NearestCar.getBatteryLvl()
    ID = NearestCar.getID()
    ZoneC = sf.zoneIDtoCoordinates(ZoneID)
    EventCoords = Event.coordinates

    outputString = Event.type + ";"
    outputString += str(ToRecharge) + ";"
    outputString += str(Recharged) + ";"
    outputString += "%d;" % ID
    outputString += "%.2f;" % Lvl
    outputString += "%d;" % Distance
    outputString += "%d;" % Iter
    outputString += "%.2f;" % Recharge
    outputString += "%d;" % StartRecharge
    outputString += "%.2f;" % StartRechageLVL
    outputString += "%d;" % Stamp
    outputString += "[%.6f,%.6f];" % (EventCoords[0], EventCoords[1])
    outputString += "[%.6f,%.6f];" % (ZoneC[0], ZoneC[1])
    if (Discharge == "nan"):
        outputString += "nan;"
        outputString += "nan;"
    else:
        outputString += "%.2f;" % Discharge
        outputString += "%.2f;" % TripDistance
    outputString += "%s;" % FileID
    if (extractedP == "nan"):
        outputString += "nan;"
    else:
        outputString += "%.2f;" % extractedP
    outputString += "%d;" % ZoneID
    outputString += "%d;" % OccupiedCS
    outputString += "%d\n" % PoleID

    return outputString
コード例 #3
0
def RunSim(BestEffort,
    algorithmName,
    algorithm,
    AvaiableChargingStations,
    tankThreshold,
    walkingTreshold,
    ZoneCars,
    RechargingStation_Zones,
    Stamps_Events,
    DistancesFrom_Zone_Ordered,
    lastS,
    pThreshold,
    kwh,
    randomStrtingLevel,
    return_dict,
    processID,
    direction,
    city):

    gv.init()
    sf.assingVariables(city)

    time_init = time.time()

    numberOfStations = len(RechargingStation_Zones)

    policy, fileID, fname = foutname(BestEffort,algorithmName,AvaiableChargingStations,numberOfStations,tankThreshold,
                                     walkingTreshold, pThreshold, kwh)



    

    NRecharge = 0
    NStart = 0
    NEnd = 0
    MeterRerouteStart = []
    MeterRerouteEnd = []
    NDeath = 0
    
    ActualBooking = 0

    BookingID_Car = {}

    ZoneID_Zone = {}
    
    ReloadZonesCars(ZoneCars, ZoneID_Zone, AvaiableChargingStations)


    if randomStrtingLevel == True :
        for zone in ZoneCars:
            if len(ZoneCars[zone]) > 0 :
                for car in ZoneCars[zone]:
                    car.BatteryCurrentCapacity = round(random.SystemRandom().random(),2) * car.BatteryMaxCapacity

    
    output_directory ="../output/Simulation_"+str(lastS)+"/"
    if not os.path.exists(output_directory):
        os.makedirs(output_directory)


    fout = open(output_directory+fname,"w")
                
    fout2 = open(output_directory+"debugproblem.txt","w")
    a = datetime.datetime.now()
    WriteOutHeader(fout, {
    "Provider": gv.provider,
    "Policy": policy,                          
    "Algorithm": algorithm,
    "ChargingStations":numberOfStations,
    "AvaiableChargingStations":AvaiableChargingStations, 
    "TankThreshold":tankThreshold,
    "WalkingTreshold":  walkingTreshold,
    "pThreshold": pThreshold,
    "kwh": kwh})
    
    
    fout.write("Type;ToRecharge;Recharged;ID;Lvl;Distance;Iter;Recharge;StartRecharge;Stamp;EventCoords;ZoneC;Discharge;TripDistance;FileID;extractedP;ZoneID;OccupiedCS\n")

    i=0
    occupiedCS = 0
    #with click.progressbar(Stamps_Events, length=len(Stamps_Events)) as bar:

    for inutile in range(0,1):
        for Stamp in Stamps_Events:
            for Event in Stamps_Events[Stamp]:
                i+=1
                if(Event.type == "s"):
                    fout2.write("%d %d \n"%(Stamp,ActualBooking))#,TotalCar1,TotalCar2))
                    ActualBooking +=1
                    BookingStarting_Position = sf.coordinates_to_index(Event.coordinates)
                    BookingID = Event.id_booking
                    NearestCar, Distance, ZoneID, Iter = SearchNearestBestCar(RechargingStation_Zones,DistancesFrom_Zone_Ordered,ZoneID_Zone,\
                                                                       BookingStarting_Position, Stamp)


                    if NearestCar.WasInRecharge == True :
                        occupiedCS -= 1

                    Recharge, StartRecharge = NearestCar.Recharge(Stamp)
                    NearestCar.setStartPosition(Event.coordinates)
                    BookingID_Car[BookingID] = NearestCar
                    Lvl = NearestCar.getBatteryLvl()
                    ID = NearestCar.getID()
                    ZoneC = zoneIDtoCoordinates(ZoneID)

                    d={"Type":"s",
                    "ToRecharge":np.NaN,
                    "Recharged":np.NaN,
                    "ID":ID,
                    "Lvl":Lvl,
                    "Distance":Distance,
                    "Iter":Iter,
                    "Recharge":Recharge,
                    "StartRecharge":StartRecharge,
                    "Stamp":Stamp,
                    "EventCoords":Event.coordinates,
                    "ZoneC":ZoneC,
                    "Discharge":np.NaN,
                    "TripDistance":np.NaN,
                    "FileID": fileID,
                    "extractedP" : np.NaN,
                    "ZoneID":ZoneID,
                    "OccupiedCS":occupiedCS}


                    fout.write(dict_to_string(d))

                    if(Distance> 0):
                        MeterRerouteStart.append(Distance)
                    NStart+=1
                else:
                    BookingEndPosition = sf.coordinates_to_index(Event.coordinates)
                    if(BookingEndPosition<0): print(Event.coordinates)
                    ActualBooking -=1
                    BookedCar = BookingID_Car[Event.id_booking]
                    Discarge, TripDistance = BookedCar.Discharge(Event.coordinates)

                    Lvl, ToRecharge, Recharged, Distance, ZoneID, Iter, extractedP = ParkCar(RechargingStation_Zones,DistancesFrom_Zone_Ordered,ZoneID_Zone,\
                                                                           BookingEndPosition, BookedCar, tankThreshold, walkingTreshold, BestEffort,\
                                                                           pThreshold)


                    #extra consuption if there is rerouting
                    if Distance > 0:
                        BookedCar.setStartPosition(Event.coordinates)
                        DiscargeR, TripDistanceR = BookedCar.Discharge(sf.zoneIDtoCoordinates(ZoneID))
                        Discarge += DiscargeR
                        TripDistance += TripDistanceR
                        '''
                        Please notice that TripDistanceR > Distance because TripDistanceR keeps in account the corr. fact
                        Distance is dist(centre_arrival_Zone, centre_leaving_zone), so in this distance is biased by an error of 150m
                        '''
                        # print("Distnace", Distance)
                        # print("Discharge", Discarge)
                        # print("DischargeR", DiscargeR)
                        # print("TripDistance", TripDistance)
                        # print("TripDistanceR", TripDistanceR)
                        # print("check", sf.haversine(Event.coordinates[0],
                        #                             Event.coordinates[1],
                        #                             sf.zoneIDtoCoordinates(ZoneID)[0],
                        #                             sf.zoneIDtoCoordinates(ZoneID)[1]
                        #                             )*gv.CorrectiveFactor
                        # )
                        # print("-------------------------")

                    BookedCar.setStartRecharge(Stamp)
                    ID = BookedCar.getID()
                    del BookingID_Car[Event.id_booking]
                    ZoneC = zoneIDtoCoordinates(ZoneID)

                    if Recharged == True :
                        occupiedCS += 1

                    d={"Type":"e",
                    "ToRecharge":ToRecharge,
                    "Recharged":Recharged,
                    "ID":ID,
                    "Lvl":Lvl,
                    "Distance":Distance,
                    "Iter":Iter,
                    "Recharge":np.NaN,
                    "StartRecharge":np.NaN,
                    "Stamp":Stamp,
                    "EventCoords":Event.coordinates,
                    "ZoneC":ZoneC,
                    "Discharge":Discarge,
                    "TripDistance":TripDistance,
                    "FileID": fileID,
                    "extractedP":extractedP,
                    "ZoneID":ZoneID,
                    "OccupiedCS":occupiedCS}

                    fout.write(dict_to_string(d))

                    if(Distance > 0):
                        MeterRerouteEnd.append(Distance)

                    if(Recharged == True):
                        NRecharge +=1

                    if(BookedCar.getBatterCurrentCapacity()<0):
                        NDeath +=1

                    NEnd+=1

                # print (i, Event.type, occupiedCS)
                # if occupiedCS > AvaiableChargingStations * len(RechargingStation_Zones):
                #     print ("Noooooo")
                #     break

    b = datetime.datetime.now()
    c = (b - a).total_seconds()
    #print("End Simulation: "+str(int(c)))


    fout.close()
    fout2.close()

    if return_dict == None :
        os.system('scp %s bigdatadb:/data/03/Carsharing_data/output/Simulation_%d/%s'%(output_directory+fname,lastS,fname))
        os.system('cat %s | ssh bigdatadb hdfs dfs -put -f - Simulator/output/Simulation_%s/%s' %(output_directory+fname,lastS,fname))
        os.system('rm %s'%(output_directory+fname))
        return

    if return_dict != None:

        PercRerouteEnd = len(MeterRerouteEnd)/NEnd*100
        PercRerouteStart = len(MeterRerouteStart)/NStart*100
        PercRecharge = NRecharge/NEnd*100
        PercDeath = NDeath/NEnd*100

        MedianMeterEnd = np.median(np.array(MeterRerouteEnd))
        MeanMeterEnd = np.mean(np.array(MeterRerouteEnd))

        MedianMeterStart = np.median(np.array(MeterRerouteStart))
        MeanMeterStart = np.mean(np.array(MeterRerouteStart))

        RetValues = {}
        RetValues["ProcessID"] = processID
        RetValues["Direction"] = direction
        RetValues["PercRerouteEnd"] = PercRerouteEnd
        RetValues["PercRerouteStart"] = PercRerouteStart
        RetValues["PercRecharge"] = PercRecharge
        RetValues["PercDeath"] = PercDeath
        RetValues["MedianMeterEnd"] = MedianMeterEnd
        RetValues["MeanMeterEnd"] = MeanMeterEnd
        RetValues["MedianMeterStart"] = MedianMeterStart
        RetValues["MeanMeterStart"] = MeanMeterStart
        RetValues["NEnd"] = NEnd
        RetValues["NStart"] = NStart
        RetValues['WeightedWalkedDistance'] = (MeanMeterEnd * PercRerouteEnd + ((PercRecharge - PercRerouteEnd) * 150))/100
        return_dict[processID] = RetValues

    current_folder = os.getcwd().split("/")
    output_folder = ""
    for i in range(0,len(current_folder)-1):
        output_folder += current_folder[i]+"/"
    output_folder+="output/"

    print('PID %d, time: %d'%(processID, time.time()-time_init))
    #do not use
	#os.system('ssh bigdatadb hdfs dfs -put /data/03/Carsharing_data/output/Simulation_%d/%s Simulator/output/Simulation_%d/%s &' %(lastS,fname,lastS,fname))
    #os.system('ssh bigdatadb cat /data/03/Carsharing_data/output/Simulation_%d/%s | hdfs dfs -put -f - Simulator/output/Simulation_%s/%s &' %(lastS,fname,lastS,fname))
    
    return