2013-04-02 12 views
6

Muszę obliczyć łączne kwoty do zapłaty dla posiadaczy kart, aby uzyskać dostęp oparty na karcie do parkingów. Moja struktura stawek wygląda tak. Każda strefa na parkingu będzie miała priorytetową listę tych cen.Jak obliczyć stawki parkingowe na kilka dni, gdy stawki są ustalane codziennie?

public partial class HourlyPrice 
{ 
    public int Id { get; set; } 
    public int DayId { get; set; } 
    public DateTime StartTime { get; set; } 
    public DateTime EndTime { get; set; } 
    public int MinHour { get; set; } 
    public int MaxHour { get; set; } 
    public decimal Price { get; set; } 
} 

DayId pozwala na np. "bezpłatnie w niedziele od 13h00". MinNour i "MaxHour" pozwalają na 0 do 2 godzin są bezpłatne, a 5 do 6 godzin kosztuje 11,00 R11. StartTime i EndTime pozwalają na "po 19h00 kosztuje R7.00, stawka ryczałtowa".

Moją obawą jest to, gdzie nie określono ceny wielodniowej. Kiedy samochód wchodzi pod jedną strukturą cenową jednego dnia i wyjeżdża pod inną ceną w innym dniu. Wydaje mi się, że będę musiał kolejno odwiedzać każdą godzinę zaparkowaną w pojeździe i gromadzić należną kwotę. Wydaje się to bardzo drogim sposobem robienia rzeczy.

Każda rada na temat takiej realizacji zostanie bardzo doceniona.

+0

Można zmierzyć całkowity czas spędzony w każdej "GodzinieCeny", przechodząc od "bieżącej chwili" do granicy odpowiedniej "Godzinowej Ceny", a następnie czyniąc ten moment graniczny "bieżącym momentem" i powtarzając (zwróć uwagę na nakładanie się). –

+2

"Wydaje się, że to bardzo drogi sposób robienia rzeczy." Ile tysięcy samochodów zamierzasz obsłużyć na sekundę? – Corak

+0

Spoglądając na zestaw wymagań, nie widzę żadnego sposobu na przerwanie każdego okresu parkowania w dół do godzin i obliczenie kosztu za godzinę przy użyciu zestawu reguł. Chciałbym zobaczyć inne rozwiązania, ale nie mogę myśleć o jednym ... –

Odpowiedz

0

Mogłeś przechowywać polityki cenowej każdego konkretnego dnia w przedziale drzewa. Drzewo powinno przechowywać wszystkie godziny dnia. Oprócz godzin, należy podać kilka informacji:

  • Mieszkanie typu boolean: czy cena jest płaska? (np. R7.00 dla całego okresu przedziału)
  • Cena całkowita: koszt godziny w okresie. Jeśli flat ma wartość true, jest to koszt całego okresu.

Otrzymujesz wpisy parkingowe na wejściu. Zakładam, że są to sygnatury czasowe czasu przyjazdu i wyjazdu dla samochodu. Dwie pierwsze godziny są bezpłatne, więc "zwiększasz" czas przybycia o dwie godziny. Z wynikowych znaczników czasowych można zbudować sekwencję trojanów (dzień, czas rozpoczęcia, czas zakończenia). To może być pusta (jeśli właściciel samochodu zaparkowane mniej niż dwie godziny), to sprawa jest banalna: kosztuje R0.00

Teraz algorytm, który przetwarza sekwencję powinna wyglądać następująco:

cost <- 0 
while (NOT is_empty(sequence)) { 
    dayTriplet <- pop(sequence) 
    down <- dayTriplet.StartTime 
    up <- dayTriplet.EndTime 
    pricingTree <- getPriceTree(dayTriplet.dayId) 
    while (down < up) { 
     node <- findNode(pricingTree, down) 
     nbHours <- min(up, node.up) - down 
     if (node.flat) { 
      cost <- cost + node.price 
     } else { 
      cost <- cost + nbHours*node.price 
     } 
     down <- down + nbHours 
    } 
} 

Algorytm jest trochę błędny, ale czułem, że pomysły stojące za nim były warte strzału. Na przykład, jeśli samochód jest zaparkowany po godzinie 18.00 jednego dnia do 4:00 następnego dnia, algorytm ten będzie analizowany (d, 18, 24) i (d + 1, 0, 4), a zatem właściciel powinien być obciążany dwukrotnie stawka ryczałtowa okresu zamiast tylko raz. System typu carry-like powinien poradzić sobie z tym problemem. Po prostu nie włączyłem go, aby pozostawić stosunkowo jasny algorytm.

Powiązane problemy