Путь разработчика    

Используйте ветку и привязаны для решения проблемы раздела в C#

eda2480d

Сообщение Используйте исчерпывающий поиск для решить проблему раздела в C# , объясняет проблему раздела и то, как вы можете использовать исчерпывающий поиск для поиска решений для него.

К сожалению, количество возможных решений огромно. Если вы делите N элементов, то есть 2 N возможных способов разделить их на две группы. Это означает, что существует слишком много возможных решений, чтобы попробовать их всех, если N не очень мало. Например, если вы можете исследовать 1 миллион возможных решений в секунду, потребуется 18 минут для изучения каждого возможного решения для 30 пунктов, 12,7 дней для 40 предметов и 35,7 года для 50 предметов.

Ветвь и граница - это метод сокращения количества ветвей, которые вам нужно посетить, при поиске дерева. Вы можете рассматривать проблему секционирования как поиск дерева, если вы рассматриваете каждое решение о том, следует ли поместить элемент в набор 1 или установить 2, выбрав ветку в дереве. Если есть N элементов, то дерево является полным двоичным деревом с N уровнями, поэтому оно содержит 2 N листовые узлы, соответствующие возможным решениям.

В ветке и привязке программа отслеживает наибольшее улучшение, которое может дать ветвь, если вы продолжаете следовать ей. Тогда, если улучшение не может сделать текущее тестовое решение лучше, чем лучшее решение, найденное до сих пор, программа перестает изучать эту ветвь.

Например, предположим, что вы уже нашли деление на 30 элементов, где значения двух наборов отличаются на 10. Теперь предположим, что вы рассматриваете тестовое решение, которое уже назначило 20 элементов, поэтому наборы в тестовом решении так значительно отличаются на 20, а общая стоимость остальных 10 предметов равна 5. Даже если вы добавите все оставшиеся предметы в меньший из двух наборов, лучшее, что вы могли бы сделать, это сделать, чтобы наборы отличались на 15. Это не улучшение по сравнению с лучшим решением, найденным до сих пор, поэтому нет смысла продолжать рассмотрение этого тестового решения. Это позволяет пропустить рекурсивные вызовы, которые будут посещать остальную часть дерева, и это может потенциально сэкономить огромное количество времени.

Следующая версия метода PartitionValuesFromIndex принимает дополнительный параметр unassigned_value, чтобы отслеживать общую сумму значения, которая еще не назначена в тестовом решении. Он рекурсивно называет себя только тогда, когда это значение может потенциально улучшить наилучшее решение.

Python

Если вы сравниваете этот пример с предыдущий , вы обнаружите, что это намного быстрее, потому что он посещает только небольшую часть дерева поиска.

Источник: http://csharphelper.com/blog/2015/01/use-branch-and-bound-to-solve-the-partition-problem-in-c/



Отзывы (через Facebook):

Оставить отзыв с помощью аккаунта FaceBook:

Методы Accessor и Mutator в Python

Поскольку рекомендуется хранить внутренние данные объекта private, нам часто требуются методы в интерфейсе класса, чтобы позволить пользователю объектов из...

04 12 2020 4:12:15

If, else, case в Bash

В Bash, If утверждения очень полезны.  В этом разделе нашего урока вы узнаете, как вы можете использовать, If, else, elif, case инструкции в ваших сценариях Bash....

03 12 2020 3:35:41

Метод Java String concat()

Конкатенация строк - это процесс объединения двух или более маленьких строк для создания большей строки. В Java вы можете комбинировать строку несколькими...

02 12 2020 12:13:48

Как открыть и прочитать URL-адрес в Java

Чтение с URL-адреса так же просто, как чтение из входного потока. URL - это аббревиатура Uniform Resource Locator. Java-программы, которые взаимодействуют...

01 12 2020 2:57:16

Позвольте пользователю выбрать критерии поиска базы данных в C#

Верхняя часть этой программы содержит три столбца элементов управления. В левом столбце содержатся комбинированные поля, содержащие имена полей в таблице б...

30 11 2020 14:45:33

Методы расширения в C#

C# поддерживает несколько способов расширения существующих типов без изменения существующего кода. Существует два разных способа: методы расширения и перео...

29 11 2020 1:13:37

Преобразование растрового изображения в курсор в C#

Преобразование растрового изображения в курсор непросто, но вы можете сделать это, используя функцию API CreateIconIndirect. В этом примере используется сл...

28 11 2020 15:56:59

Создайте библиотеку кнопок XAML в C#

В этом примере показано, как можно создать библиотеку кнопок XAML с возможностью повторного использования в WPF. Пример Создание шаблона кнопки WPF в C# ис...

27 11 2020 2:21:35

Как сделать секундомер в C#

Эта программа представляет собой простой секундомер. Когда вы нажимаете кнопку « Пуск», программа меняет заголовок кнопки на « Стоп» и запускает Timer. По ме...

26 11 2020 20:17:30

Сделать меню во время выполнения для приложения WPF в C#

В этом примере показано, как вы можете создавать меню во время выполнения и добавлять их в приложение WPF. Обычно вы создаете пользовательский интерфейс пр...

25 11 2020 7:43:55

Как удалить непечатаемые символы ASCII из строки в C#

Следующий способ расширения TrimNonAscii удаляет непечатаемые символы ASCII из строки. ... Обратите внимание, что этот метод удаляет много полезных символо...

24 11 2020 22:38:58


Parse error: syntax error, unexpected ',' in /home/users/9/9165884745/domains/flash-mx.ru/lessons/926.php on line 69