2010-02-11 7 views
2

J'essaie de générer des données de test. Dites que j'ai 1000 rendez-vous que j'ai besoin d'allouer sur une plage de dates.Distribution des rendez-vous sur une plage de dates

Maintenant, je dois distribuer ces rendez-vous de manière à ce qu'il y ait deux fois plus de rendez-vous par jour à la fin du mois qu'en début de mois. L'augmentation des rendez-vous doit augmenter avec une vitesse constante. Par exemple, s'il y a 5 rendez-vous le 1er jour du mois, à la fin du mois nous aurons 10 rendez-vous par jour.

Un rendez-vous ne peut avoir lieu qu'un jour de la semaine.

Y at-il un algorithme décent qui m'aiderait à distribuer ces dates de cette façon?

Modifier

C'est le meilleur que je suis à ce jour, inspiré par la solution Henriks:

private int GetNumForCurrentDate (DateTime date) 
    { 
     int daysInMonth = DateTime.DaysInMonth (date.Year, date.Month); 

     // x is the number of appointments on the first day 
     double firstDay = this._NumPerMonth/(((ratio + 1)/2) * daysInMonth); 

     // x * ratio is the number of appointments on the last day. 
     double lastDay = firstDay * ratio; 

     // Interpolate a value between the first and last days 
     double exactNumOnThisDay = firstDay + (lastDay - firstDay) * ((double)date.Day/(double)daysInMonth); 
     int numOnThisDay = Convert.ToInt32 (Math.Truncate (exactNumOnThisDay)); 

     // Accumulate any overflow 
     this._Overflow += exactNumOnThisDay - numOnThisDay; 
     if (this._Overflow > 1) 
     { 
      // Shove the overflow into our number when it gets into whole number teritory 
      numOnThisDay++; 
      this._Overflow--; 
     } 

     return numOnThisDay; 
    } 

Il retourne le nombre de jours d'allouer un jour particulier donné la date. Il s'agit de séparer les allocations à chaque mois et gère le dépassement d'arrondi, mais ce n'est pas tout à fait parfait, il n'a plus de jours à allouer le dernier jour, mais c'est assez bon pour le moment ..

+0

"s'il y a 5 rendez-vous le 1er jour du mois, d'ici la fin du mois nous aurons 10 rendez-vous par mois "--- Est-ce par mois ou par jour, comme vous le dites différemment à différents endroits dans votre question. Merci –

+0

Désolé .. faute de frappe! Je veux dire 10 par jour. Avoir édité. Merci pour le repérage;) –

Répondre

1

x rendez-vous le premier jour, 2x le dernier jour, donc 1.5x en moyenne. Quand il y a y la semaine, x est 1000/(1.5y). Donc 667/y le premier jour, 1333/y le dernier, interpoler pour les jours entre

+0

Je pense que vous avez oublié une exigence: "L'augmentation des rendez-vous doit augmenter avec une vitesse constante (pas linéairement)." C'est f '' (x) = c. La vôtre est f (x) = cx, f '(x) = c, f' '(x) = 0. –

+0

@Thomas: peut-être que vous avez raison. J'ai mal lu "l'augmentation de l'augmentation". – Henrik

+0

@Thomas: Mais avec cette interprétation le problème est sous-déterminé ma solution est toujours correcte, comme f '' = 0 = const. :) – Henrik