def runIntegerProgram(csvFile, timeLimit = -1, outputFlag = 0): taskList = createTasksFromCsv.getTaskList(csvFile) helperFunctions.preprocessTimeWindows(taskList) schedule, isOptimal = integerProgramSolve(taskList, timeLimit, outputFlag) # assert(isFeasible(taskList, schedule)) return schedule, isOptimal
def runGreedyByOrder(csvFile,orderMethod): taskList = createTasksFromCsv.getTaskList(csvFile) helperFunctions.preprocessTimeWindows(taskList) # create a list of tuples (time of latest time window ending, taskId) timeWindowsAndPriorities = [] for task in taskList: latestTime = 0 for day in task.timeWindows: for window in day: if window[1] >= latestTime: latestTime = window[1] timeWindowsAndPriorities.append([latestTime, task.priority, task.id, float(task.priority)/max(float(task.getNumTimeWindows()), 1), task.dependencyTasks]) # sorting by deadline timeWindowsAndPriorities = orderMethod(timeWindowsAndPriorities) # sorting by priority taskOrdering = [] for timeTaskTuple in timeWindowsAndPriorities: taskOrdering.append(timeTaskTuple[2]) return helperFunctions.createOptimalSchedule(taskList, taskOrdering)
def runIntegerProgram(csvFile, timeLimit=-1, outputFlag=0): taskList = createTasksFromCsv.getTaskList(csvFile) helperFunctions.preprocessTimeWindows(taskList) schedule, isOptimal = integerProgramSolve(taskList, timeLimit, outputFlag) # assert(isFeasible(taskList, schedule)) return schedule, isOptimal
def runGreedyByOrder(csvFile, orderMethod): taskList = createTasksFromCsv.getTaskList(csvFile) helperFunctions.preprocessTimeWindows(taskList) # create a list of tuples (time of latest time window ending, taskId) timeWindowsAndPriorities = [] for task in taskList: latestTime = 0 for day in task.timeWindows: for window in day: if window[1] >= latestTime: latestTime = window[1] timeWindowsAndPriorities.append([ latestTime, task.priority, task.id, float(task.priority) / max(float(task.getNumTimeWindows()), 1), task.dependencyTasks ]) # sorting by deadline timeWindowsAndPriorities = orderMethod(timeWindowsAndPriorities) # sorting by priority taskOrdering = [] for timeTaskTuple in timeWindowsAndPriorities: taskOrdering.append(timeTaskTuple[2]) return helperFunctions.createOptimalSchedule(taskList, taskOrdering)
def makeSchedule(taskList): fullTaskList = copy.deepcopy(taskList) helperFunctions.preprocessTimeWindows(taskList) schedule = Schedule() lastDay = len(taskList[0].timeWindows) for day in range(lastDay): schedule.append(Route()) lastTimeWindowEndings = [0 for i in range(lastDay + 1)] for task in taskList: for index, day in enumerate(task.timeWindows): for timeWindow in day: if timeWindow[1] > lastTimeWindowEndings[index]: lastTimeWindowEndings[index] = timeWindow[1] insertionSuccesful = True while insertionSuccesful: insertionSuccesful = False bestTaskInfo = (None, None, None, None) bestTask = None for task in taskList: taskInfo = helperFunctions.isTaskInsertable(schedule, task, lastTimeWindowEndings, fullTaskList) # if task can be finished earliest if (taskInfo[2] != None and (bestTaskInfo[2] == None or taskInfo[2] < bestTaskInfo[2])): bestTaskInfo = taskInfo bestTask = task if (bestTaskInfo != None and bestTaskInfo[2] != None): insertionSuccesful = True isInsertable, endingTime, endingDay, insertPosition = bestTaskInfo schedule.routeList[endingDay].taskList.insert(insertPosition, bestTask) schedule.routeList[endingDay].endingTimes.insert(insertPosition, endingTime) for index, task in enumerate(taskList): if (task.id == bestTask.id): taskList.pop(index) return schedule
def runGreedyConstructiveHeuristic(csvFile): unscheduledTaskList = createTasksFromCsv.getTaskList(csvFile) helperFunctions.preprocessTimeWindows(unscheduledTaskList) fullTaskList = copy.deepcopy(unscheduledTaskList) avgDistance = findAvgDistance(fullTaskList) avgPriority = findAvgPriority(fullTaskList) avgDuration = findAvgDuration(fullTaskList) priorityWeight = avgPriority / (avgDistance + avgDuration) schedule = Schedule() numDays = len(fullTaskList[0].timeWindows) for day in range(numDays): route = Route() schedule.append(route) for task in unscheduledTaskList: print "one task down!" schedule, taskToRemove = returnScheduleInsertedWithBestTask( schedule, unscheduledTaskList, fullTaskList, priorityWeight) # we have to do this because remove doesn't use equality testing, # so it doesn't know tasks in the deepcopy are the same for task in unscheduledTaskList: if task == taskToRemove: unscheduledTaskList.remove(task) break # taskList.remove(taskToRemove) # I don't know if I can actually do this.... return schedule
def findBestSchedule(taskList, permutations): helperFunctions.preprocessTimeWindows(taskList) bestSchedule = Objects.Schedule() for perm in permutations: newSchedule = helperFunctions.createOptimalSchedule(taskList, perm) if isBetterSchedule(newSchedule, bestSchedule): bestSchedule = newSchedule return bestSchedule
def findBestScheduleWithTimeLimit(taskList, permutations, timeLimit): ''' A function given a list of task objects and all the potential task permutations will create a schedule for each ordering and output one of the best schedules in the time it has that is has tried. ''' start = time.time() helperFunctions.preprocessTimeWindows(taskList) bestSchedule = Objects.Schedule() for perm in permutations: newSchedule = helperFunctions.createOptimalSchedule(taskList, perm) if isBetterSchedule(newSchedule, bestSchedule): bestSchedule = newSchedule if time.time() - start >= timeLimit: return bestSchedule return bestSchedule
def randomlyPickBestScheduleUnderTime(csvFile, numSeconds): taskList = createTasksFromCsv.getTaskList(csvFile) helperFunctions.preprocessTimeWindows(taskList) bestSchedule, bestProfit = None, 0 taskIds = [task.id for task in taskList] start = time.time() while time.time() < (start + numSeconds): # Get a random permutation orderToTry = random.sample(taskIds, len(taskIds)) schedule = helperFunctions.createOptimalSchedule(taskList, orderToTry) if schedule.getProfit() > bestProfit: bestProfit = schedule.getProfit() bestSchedule = schedule return bestSchedule