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); }
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)); }