public SolvedInstance(Instance instance, List <TaskToSchedule> tasksOrder, double h, int startTime) { if (startTime < 0) { throw new Exception("Zaczął przed 0!"); } Instance = instance; HParameter = h; DueTime = (int)(HParameter * Instance.Length); TasksOrder = tasksOrder; StartTime = startTime; Value = GoalFunctionCalculator.Calculate(StartTime, TasksOrder, DueTime); }
public SolvedInstance Solve(Instance instance, double h) { int dueTime = Convert.ToInt32(Math.Floor(instance.Length * h)); var byCostForDelayDesc = instance.Tasks.OrderBy(t => t.CostForDelay).Select(t => t.Index).ToList(); var byCostForLeadAsc = instance.Tasks.OrderByDescending(t => t.CostForLead).Select(t => t.Index).ToList(); var newOrder = new List <TaskToSchedule>(); while (byCostForLeadAsc.Any() || byCostForDelayDesc.Any()) { if (newOrder.Sum(t => t.Length) < instance.Length * h) { var first = byCostForLeadAsc.First(); newOrder.Add(instance.Tasks.First(t => t.Index.Equals(first))); byCostForLeadAsc.Remove(first); byCostForDelayDesc.Remove(first); } else { byCostForLeadAsc.Clear(); byCostForDelayDesc.ForEach(index => newOrder.Add(instance.Tasks.First(t => t.Index.Equals(index)))); byCostForDelayDesc.Clear(); } } var bestStartTime = 0; var bestValue = GoalFunctionCalculator.Calculate(bestStartTime, newOrder, dueTime); bool isNewStartTimeBetter; do { var newStartTime = bestStartTime + 1; var newValue = GoalFunctionCalculator.Calculate(newStartTime, newOrder, dueTime); isNewStartTimeBetter = newValue < bestValue; if (isNewStartTimeBetter) { bestStartTime = newStartTime; bestValue = newValue; } } while (isNewStartTimeBetter); return(new SolvedInstance(instance, newOrder, h, bestStartTime)); }