Ejemplo n.º 1
0
        private void GraphBehavior_VerticesCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            // Remove everything deleted from selection
            switch (e.Action)
            {
            case NotifyCollectionChangedAction.Add:
                break;

            case NotifyCollectionChangedAction.Remove:
            case NotifyCollectionChangedAction.Replace:
                foreach (var oldItem in e.OldItems)
                {
                    SelectedVertices.Remove((VertexBase)oldItem);
                }
                break;

            case NotifyCollectionChangedAction.Move:
                break;

            case NotifyCollectionChangedAction.Reset:
                var vertices = (IList)sender;
                for (int index = 0; index < SelectedVertices.Count; index++)
                {
                    if (!vertices.Contains(SelectedVertices[index]))
                    {
                        SelectedVertices.RemoveAt(index--);
                    }
                }
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Ejemplo n.º 2
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);
        }
Ejemplo n.º 3
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));
            }
        }
Ejemplo n.º 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));
        }
Ejemplo n.º 5
0
 public override string ToString()
 {
     return(string.Join("->", SelectedVertices.Select(x => x.Id)) + $"({LowBound}/{HighBound})");
 }
Ejemplo n.º 6
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]));
        }