private void CreateSchedule(BreakSchedule schedule)
        {
            var advertisementDataList = Solution.AdOrdersScores.Values.Where(t => !t.TimesAiredSatisfied || t.ViewsSatisfied).ToList();

            advertisementDataList.Shuffle(Random);
            foreach (var ad in advertisementDataList)
            {
                if (Instance.GetTypeToBreakIncompatibility(ad, schedule) == 1)
                {
                    continue;
                }
                if (Instance.GetBulkBrandIncompatibilities(ad.AdConstraints, schedule.Order).Contains(double.PositiveInfinity))
                {
                    continue;
                }
                schedule.AddAd(ad.AdConstraints);
                if (schedule.UnitFill > schedule.BreakData.SpanUnits + MaxOverfillUnits)
                {
                    break;
                }
            }
            ScoringFunction.AssesBreak(schedule);
            AddToSolutionScores(schedule.Scores);
            GenerateReportEntry();
        }
        private static void AssertScoringFunctionsEqual(ScoringFunction expected, ScoringFunction actual)
        {
            Assert.IsType(expected.GetType(), actual);
            Assert.Equal(expected.FieldName, actual.FieldName);
            Assert.Equal(expected.Boost, actual.Boost);
            Assert.Equal(expected.Interpolation, actual.Interpolation);

            var expectedMagnitudeFunction = expected as MagnitudeScoringFunction;
            var expectedFreshnessFunction = expected as FreshnessScoringFunction;
            var expectedDistanceFunction  = expected as DistanceScoringFunction;
            var expectedTagFunction       = expected as TagScoringFunction;

            if (expectedMagnitudeFunction != null)
            {
                AssertMagnitudeScoringFunctionsEqual(expectedMagnitudeFunction, (MagnitudeScoringFunction)actual);
            }
            else if (expectedFreshnessFunction != null)
            {
                AssertFreshnessScoringFunctionsEqual(expectedFreshnessFunction, (FreshnessScoringFunction)actual);
            }
            else if (expectedDistanceFunction != null)
            {
                AssertDistanceScoringFunctionsEqual(expectedDistanceFunction, (DistanceScoringFunction)actual);
            }
            else if (expectedTagFunction != null)
            {
                AssertTagScoringFunctionsEqual(expectedTagFunction, (TagScoringFunction)actual);
            }
            else
            {
                Assert.True(false, "Unexpected scoring function type.");
            }
        }
        protected override void InternalSolve()
        {
            _order = new List <AdvertisementTask>();
            foreach (var adInfo in Instance.AdOrders.Values)
            {
                for (int i = 0; i < adInfo.MinTimesAired; i++)
                {
                    _order.Add(adInfo);
                }
            }
            _order.Shuffle(Random);
            int curr      = 0;
            var breakList = Solution.AdvertisementsScheduledOnBreaks.Values.ToList();

            breakList.Shuffle(Random);
            foreach (var schedule in breakList)
            {
                int currentSize = 0;
                while (curr < _order.Count)
                {
                    if ((currentSize += _order[curr].AdSpanUnits) >= schedule.BreakData.SpanUnits)
                    {
                        break;
                    }
                    schedule.AddAd(_order[curr]);
                    curr++;
                }
                schedule.Scores = null;
            }
            ScoringFunction.AssesSolution(Solution);
        }
 private void AddToSolutionScores(Dictionary <int, TaskScore> addedScores)
 {
     Solution.AddToSolutionScores(addedScores);
     ScoringFunction.RecalculateSolutionScoresBasedOnTaskData(Solution);
 }