Пример #1
0
        protected virtual int SetHighBound()
        {
            var bound = 0;
            var time  = 0;
            var selectedDeliveries    = SelectedVertices.ToList();
            var notSelectedDeliveries = AvailableVertices.ToList();

            for (var i = 0; i < selectedDeliveries.Count - 1; i++)
            {
                time += selectedDeliveries[i].TimeToOther[selectedDeliveries[i + 1]];
                if (selectedDeliveries[i + 1].DirectiveTime < time)
                {
                    bound++;
                }
            }
            bound += notSelectedDeliveries.RemoveAll(x => x.DirectiveTime <= time + selectedDeliveries.Last().TimeToOther[x]);
            while (notSelectedDeliveries.Any())
            {
                var delivery = notSelectedDeliveries.OrderBy(x => selectedDeliveries.Last().TimeToOther[x]).First();
                time += selectedDeliveries.Last().TimeToOther[delivery];
                selectedDeliveries.Add(delivery);
                notSelectedDeliveries.Remove(delivery);
                bound += notSelectedDeliveries.RemoveAll(x => x.DirectiveTime <= time + selectedDeliveries.Last().TimeToOther[x]);
            }
            selectedDeliveries.AddRange(AvailableVertices.Where(x => !selectedDeliveries.Contains(x)));
            HighResponse = AvailableVertices.Count == 0
                ? this
                : new DeiveryVerticeBase(selectedDeliveries, notSelectedDeliveries);
            return(bound);
        }
Пример #2
0
        public IEnumerable <ITreeVertice <Delivery> > GetNextVertices()
        {
            foreach (var delivery in AvailableVertices)
            {
                var newSelected = SelectedVertices.ToList();
                newSelected.Add(delivery);
                var newAvailable = AvailableVertices.Where(x => x.Id != delivery.Id).ToList();

                yield return(new DeiveryVerticeBase(newSelected, newAvailable));
            }
        }
Пример #3
0
        protected virtual int GetLowBound()
        {
            var time  = 0;
            var bound = 0;

            for (var i = 0; i < SelectedVertices.Count - 1; i++)
            {
                time += SelectedVertices[i].TimeToOther[SelectedVertices[i + 1]];
                if (SelectedVertices[i + 1].DirectiveTime < time)
                {
                    bound++;
                }
            }
            return(bound + AvailableVertices.Count(x => x.DirectiveTime <= SpentTime + SelectedVertices.Last().TimeToOther[x]));
        }
Пример #4
0
        protected override int GetLowBound()
        {
            var time  = 0;
            var bound = 0;

            for (var i = 0; i < SelectedVertices.Count - 1; i++)
            {
                time += SelectedVertices[i].TimeToOther[SelectedVertices[i + 1]];
                if (SelectedVertices[i + 1].DirectiveTime < time)
                {
                    bound++;
                }
            }

            return(bound + GetSubLowBound(AvailableVertices.ToList(), SelectedVertices.Last(), time, 2));
        }