Я выполняю приблизительно 2 000 тестов на сетке, каждый тест, запущенный как отдельная задача на сетке. Тесты действительно имеют довольно большое время запуска. Общее выполнение занимает 500 часов, концы меньше чем за 10 часов на 60 узлах SunGridEngine. Время выполнения тестов варьируется от 5 минут до 90 минут. Объединение тестов без большой аналитики дало некоторое увеличение производительности. Я хотел бы создать "задачи", которые являются приблизительно равным размером. Как я могу сделать так?
(что мы делаем теперь: Сортировка всех тестов и продолжает добавлять, пока сумма времени выполнения не составляет приблизительно 5 часов. Поиск некоторой вещи лучше)
Делать это оптимально, является NP-Complete. Это вариация задачи раздела , которая представляет собой особый случай комбинированной проблемы , которая сама по себе является особого случая проблемы проблема Knaxack .
В вашем случае вам, вероятно, не нужно точное решение, поэтому вы, вероятно, можете использовать некоторые эвристики, чтобы получить что-то «достаточно хорошо» в разумное количество времени. См. Методы раздел страницы задачи раздела для описания некоторых подходов.
Это составляет версию задача подмножества, и является NP-Complete. Ваша лучшая ставка состоит в том, чтобы нанять некоторые эвристики подмножеств .
Ваша проблема звучит немного, как проблема планирования магазина. Есть все виды различных подходов секвенирования, некоторые из которых описаны здесь . Сортировка растущего порядка времени обработки, например, минимизирует среднее время ожидания и целую кучу других мер. Если вы уточните немного больше на объективную, время установки, время обработки и любую взаимозависимость, которая поможет.
, глядя на ссылки Laurcence. взбивает что-то вверх. Алгоритм - назначить самый длинный тест на кратчайший список задач (повторять, пока все тесты не будут назначены). Используя ваши примеры и случайные времена, отклонение СТД было довольно низким, менее чем за 2 минуты в бегах его несколько раз (код в C #, но ничего, что не будет тривиальным для преобразования):
private static void BuildJobs()
{
PriorityQueue<Task> tasks = new PriorityQueue<Task>();
//create a task list for each node
for (int i = 0; i < 60; i++)
{
Task t = new Task();
tasks.Enqueue(t);
}
//get the list of tests, in order from longest to shortest
int[] testList = new int[2000];
for (int i = 0; i < testList.Length; i++)
{
testList[i] = random.Next(5, 90);
}
Array.Sort<int>(testList);
Array.Reverse(testList);
// add the longest running test to the current shortest task list
foreach (int time in testList)
{
Task t = tasks.Dequeue();
t.addTest(time);
tasks.Enqueue(t);
}
Debug.WriteLine(CalculateStdDev(tasks));
}
Когда дело доходит до чего-то подобного, не изобретайте колесо заново. Расстояние Левехштейна, вероятно, ваша лучшая ставка, если вы должны сделать это самостоятельно, но в противном случае, сделать некоторые исследования существующих решений, которые делают запрос базы данных и нечеткий поиск. Они делают это дольше, чем вы, это, вероятно, будет лучше, тоже..
Удачи!
-121--1693103-Добро пожаловать в сообщество Python! Я все еще учусь, но имо Пайтон лучше, чем интерактивный язык данных.
В любом случае, ответ Игнасио об использовании модуля кода выглядит так, будто он может предоставить то, что вы хотите, по крайней мере, параллельно остановке IDL.
Еще одна вещь, которая может оказаться полезной, это переход в интерактивный режим Python и импорт программы. Затем с ним можно взаимодействовать, выполняя функции и т.д. (Надо признать, что я не эксперт в этом.) В этом случае в файле, управляющем программой, потребуется функция main (). Например, у вас будет что-то вроде:
import sys
def main():
# do stuff
return(0)
if __name__ == '__main__':
sys.exit(main())
, а не просто:
# do stuff
Это предотвращает выполнение программы, когда вы втягиваете ее в интерпретатор Python. Дополнительные сведения см. в статье Гвидо об основных функциях .
-121--3690527-Вы ищете раздел проблемы для k наборов.
Существует сом-литература о k = 3, называемая проблемой 3-разбиения. Это NP полный в сильном смысле.
Существует много эвристики, которая должна дать приблизительный результат быстро.
Я предлагаю вам начать здесь: http://en.wikipedia.org/wiki/Partition_problem
Надеюсь, это поможет.