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(); } }
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); }
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)); } }
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)); }
public override string ToString() { return(string.Join("->", SelectedVertices.Select(x => x.Id)) + $"({LowBound}/{HighBound})"); }
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])); }