Разделите список чисел в меньший список с “суммой” приблизительно то же

Я выполняю приблизительно 2 000 тестов на сетке, каждый тест, запущенный как отдельная задача на сетке. Тесты действительно имеют довольно большое время запуска. Общее выполнение занимает 500 часов, концы меньше чем за 10 часов на 60 узлах SunGridEngine. Время выполнения тестов варьируется от 5 минут до 90 минут. Объединение тестов без большой аналитики дало некоторое увеличение производительности. Я хотел бы создать "задачи", которые являются приблизительно равным размером. Как я могу сделать так?

(что мы делаем теперь: Сортировка всех тестов и продолжает добавлять, пока сумма времени выполнения не составляет приблизительно 5 часов. Поиск некоторой вещи лучше)

5
задан Jayan 29 January 2010 в 18:01
поделиться

5 ответов

Делать это оптимально, является NP-Complete. Это вариация задачи раздела , которая представляет собой особый случай комбинированной проблемы , которая сама по себе является особого случая проблемы проблема Knaxack .

В вашем случае вам, вероятно, не нужно точное решение, поэтому вы, вероятно, можете использовать некоторые эвристики, чтобы получить что-то «достаточно хорошо» в разумное количество времени. См. Методы раздел страницы задачи раздела для описания некоторых подходов.

11
ответ дан 18 December 2019 в 09:07
поделиться

Это составляет версию задача подмножества, и является NP-Complete. Ваша лучшая ставка состоит в том, чтобы нанять некоторые эвристики подмножеств .

3
ответ дан 18 December 2019 в 09:07
поделиться

Ваша проблема звучит немного, как проблема планирования магазина. Есть все виды различных подходов секвенирования, некоторые из которых описаны здесь . Сортировка растущего порядка времени обработки, например, минимизирует среднее время ожидания и целую кучу других мер. Если вы уточните немного больше на объективную, время установки, время обработки и любую взаимозависимость, которая поможет.

1
ответ дан 18 December 2019 в 09:07
поделиться

, глядя на ссылки 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));

    }
0
ответ дан 18 December 2019 в 09:07
поделиться

Когда дело доходит до чего-то подобного, не изобретайте колесо заново. Расстояние Левехштейна, вероятно, ваша лучшая ставка, если вы должны сделать это самостоятельно, но в противном случае, сделать некоторые исследования существующих решений, которые делают запрос базы данных и нечеткий поиск. Они делают это дольше, чем вы, это, вероятно, будет лучше, тоже..

Удачи!

-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

Надеюсь, это поможет.

3
ответ дан 18 December 2019 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: