Как я могу создать равномерное распределение объектов с разным весом (планирование)? - PullRequest
0 голосов
/ 01 апреля 2011

Вот моя проблема на английском:

  • У меня есть несколько WidgetContainer объектов.
  • Каждый WidgetContainer будет иметь хотя бы один Widget.
  • Каждый WidgetContainer хочет отображать одно из Widgets n раз в день.
  • Widgets может отображаться на «х» числе Venues.
  • A Widget отображается ровно t секунд до того, как следующий запланированный WidgetContainer's Widget займет свое место.
  • Если весь день не заполнен, тогда ничего не должно отображаться в это время (реклама должна быть равномерно распределена в течение дня t секунд за раз)

А вот объекты, представленные псевдокодом:

var WidgetContainers = [
   {
       DailyImpressionsRequired: 52, // should be split between Venues
       Widgets: ["one", "two"],
       Venues: ["here", "there"]
   },
   {
       DailyImpressionsRequired: 20,
       Widgets: ["foo"],
       Venues: ["here", "there", "everywhere"]
   },
   {
       DailyImpressionsRequired: 78,
       Widgets: ["bar", "bat", "heyhey!"],
       Venues: ["up", "down", "allAround"]
   }
];
var SecondsInADay = 86400;
var DisplayInterval = 30; // seconds
var TotalNumverOrVenues = /*eh, some calulations...*/;
var AvailableSlots = /*eh, some calulations...*/;
var SlotsNeeded = /*eh, some calulations...*/;

Мне нужно найти эффективный способ расчета равномерно распределенного расписания для этих объектов. Эти "объекты" являются объектами linq-to-sql, поэтому некоторые предложения linq были бы хорошими

Моя идея сейчас состоит в том, чтобы сплющить WidgetContainers до Widgets; разделив их DailyImpressions на число Widgets.

Я мог бы понять это легко, если бы не было нескольких и разных мест, чтобы принять во внимание.

У меня такое ощущение, что мне просто нужно увидеть взгляд другого человека на проблему, поскольку я так долго на нее смотрел.

Итак, любая помощь, которая могла бы направить меня в правильном направлении или дать представление о проблеме, даже если она очевидна, будет принята с благодарностью!

1 Ответ

0 голосов
/ 01 апреля 2011

Исходя из этого лота, если я понял, это должно дать вам правильные ответы:

static void Main(string[] args)
        {
            List<WidgetContainer> data = new List<WidgetContainer>();

            data.Add(new WidgetContainer {
                Widgets = new List<String> {"one","two"},
                Venues = new List<String>{"here","there"},
                DailyImpressionsRequired=52});

            data.Add(new WidgetContainer {
                Widgets = new List<String> {"foo"},
                Venues = new List<String>{"here","there","everywhere"},
                DailyImpressionsRequired=20});

            data.Add(new WidgetContainer {
                Widgets = new List<String> {"bar","bat", "heyhey!"},
                Venues = new List<String>{"up","down", "allAround"},
                DailyImpressionsRequired=78});

            var SecondsInADay = 86400;
            var DisplayInterval = 30; // seconds

            var TotalNumverOfVenues = data.SelectMany(x=> x.Venues).Distinct().Count();
            var AvailableSlots = SecondsInADay * data.SelectMany(x=> x.Venues).Distinct().Count() / DisplayInterval ; //assuming you didn't already have the count as a variable - will re-evaluate so don't use this for real!
            //var AvailableSlots = SecondsInADay * TotalNumverOfVenues / DisplayInterval ; //the better way - avoids recalculating count
            var SlotsNeeded = data.Sum(x => x.DailyImpressionsRequired);

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...