Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.13;
Скачать: CL | DM;

Вниз

Помогите ускорить алгоритм   Найти похожие ветки 

 
madmech ©   (2008-12-05 17:38) [0]

Некоторое время назад я задал вопрос на другом форуме:

И частично проблема мной была решена, но теперь возникла новая загвоздка - надо ускорить алгоритм. Описываю суть:

         Добрый день, дамы и господа! Некоторое время назад я задавал вопрос по поводу комплектования малых подгрупп. Задачу выполнил с помощью [b]pva[/b] и используя данный алгоритм (функция формирования перестановок):
http://algolist.manual.ru/maths/combinat/permutations.php

         Но! Дело в том, что при количестве людей большем 12, алгоритм перебора начинает захлебываться, то есть жутко тормозить или зависать. Поэтому встает вопрос: как можно ускорить процесс? Вкратце опишу суть того, что я делаю: формирую всевозможные перестановки N людей. На определенном шаге отсекаю все варианты, начинающиеся с 2.
Варианты, начинающиеся с 3, 4 и т.д. уходят автоматически. Таким образом, количество перестановок резко сокращается. На каждом шаге формирования перестановки я осуществляю проверку на невозрастание внутри подгруппы и невозрастание первых людей подгрупп в соотвествии с алгоритмом, предложенным [b]pva[/b], . Если все ОК, то записываю перестановку в поток (TStream). После записи всех "правильных" перестановок (c учетом подгрупп) в поток
я считываю данные из потока в ClientDataSet и далее  они автоматически переносятся в DBGrid.
         Понятно, что промежуточные звенья (TStream и ClientDataSet) значительно тормозят процесс, но даже если
их отключить и оставить алгоритм формирования перестановок работающим "вхолостую", то процесс все равно захлебывается. Что делать? Как выкрутиться из этой непростой ситуации?


 
madmech ©   (2008-12-05 17:41) [1]

Забыл указать адрес того форума, чтобы было понятно, о чем идет речь:
http://forum.oszone.net/post-973199.html#post973199
:)


 
Jeer ©   (2008-12-05 17:43) [2]

Мозг с мыслями приведи в порядок - потом еще раз попробуй.
Зайти, типа.


 
MBo ©   (2008-12-05 17:47) [3]

А на алголисте я тебе говорил, что нужно не перестановки, а сочетания генерировать. Зря не прислушался.
Однако для больших чисел все равно наборов будет дофигища...


 
madmech ©   (2008-12-05 17:47) [4]

Не понял, поясни.
Изначальная проблема описана на том форуме, лень здесь по второму кругу писать, так что милости прошу пройти по сцылке.


 
Leonid Troyanovsky ©   (2008-12-05 17:55) [5]


> madmech ©   (05.12.08 17:47) [4]

> Не понял, поясни.

Поясняю.

Если проблем уж обсуждался, изволь привести, скажем, резюм.
Чтоб всем нам не бродить по неким ссылкам.
У нас и своих проблем хватает.

--
Regards, LVT.


 
madmech ©   (2008-12-05 18:08) [6]

Предыдущий пост относился к Jeer.)
MBo, проблема в том, что у меня есть функция, формирующая сочетания из N элементов, то есть элементы берутся от 1 до N. А как сформировать, например, все возможные сочетания из 3, 5, 6? Из 1, 2, 3 я могу. А тут затрудняюсь. Поэтому и решил реализовывать задачу через перестановки.
Еще раз поясню: там, на Алголисте, ты мне предложил реализовывать так:
фиксируем 1, далее из оставшихся элементов формируем все сочетания, то бишь 2..N. С этим у меня трудности.

Leonid Troyanovsky, special for you and Jeer привожу еще раз формулировку задачи:
Народ, подскажите, пожалуйста, как лучше создать и реализовать алгоритм. Может быть, кто-то уже сталкивался с подобной комбинаторной задачей. Суть в следующем: есть N людей в группе. Их надо разбить на m подгрупп по k людей в каждой. Например: 16=8x2, или 16=4х4, 15=3х5 и т.д. Передо мной стоит задача вывести на экран все возможные разбиения начальной группы. Формула для количества всевозможных вариантов (I) мной уже выведена. Выглядеть это должно примерно следующим образом (выводим в StringGrid или в DBGrid):

Разбиение 8=2х4:
_____________________________
| № | Подгруппа 1 | Подгруппа 2 |
-----------------------------------------------
| 1 | (1, 2, 3, 4) | (5, 6, 7, 8) |
| 2 | (1, 5, 3, 4) | (2, 6, 7, 8) |
| 3 | (1, 2, 5, 4) | (3, 6, 7, 8) |

| 35 | (1, 3, 5, 6) | (2, 4, 7, 8) |
----------------------------------------------|

Всего для данного конкретного разбиения существует 35 вариантов.

Как не сложно догадаться есть некоторые ограничения, значительно усложняющие на первый взгляд простенькую задачу:
1. Перестановки внутри подгруппы нас не интересуют, то есть: (1, 2, 3, 4) = (2, 1, 3, 4)
2. Перестановки подгрупп между собой тоже: [(1, 2), (3, 4)] = [(3, 4), (1, 2)]
3. Один и тот же человек не может входить сразу в две подгруппы, например: [(1, 2), (1, 3)]

Я решил для себя, что задачу проще всего будет организовать через трехмерный массив, где заполнение элементов будет осуществляться через 3 цикла (по количеству людей в подгруппе (1..k), по количеству подгрупп (1..m) и по количеству всевозможных вариантов (1..I)). Или, если быть точным, нужно составить двумерную матрицу, элементами которой являются одномерные массивы-строки (состав подгруппы). А потом полученные элементы "внешнего" массива я запишу в DBGrid, как показано в таблице.

Пояснение-резюме: человек на том форуме предложил сформировать все возможные перестановки и отобрать из них часть с учетом формирования подгрупп для дальнейшего занесения в ClientDataSet. Вкратце:
1. Люди внутри подгруппы должны быть выстроены по возрастанию.
2. Первые номера подгрупп так же должны быть выстроены по возрастанию.


 
KilkennyCat ©   (2008-12-05 18:17) [7]


> сформировать все возможные перестановки

излишне.
вполне алгоритмуется только необходимое.


 
Anatoly Podgoretsky ©   (2008-12-05 19:21) [8]


> Изначальная проблема описана на том форуме, лень здесь по
> второму кругу писать, так что милости прошу пройти по сцылке.

Тебе лень, а нам лень ходить по ссылкам, лучше ты сам туда иди.



Страницы: 1 вся ветка

Текущий архив: 2009.12.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.106 c
2-1256887537
d@nger
2009-10-30 10:25
2009.12.13
Не срабатывает триггер (Firebird)


2-1256214650
Кирей
2009-10-22 16:30
2009.12.13
Кодовая страница в ADOConnection


2-1256283325
Sergey2
2009-10-23 11:35
2009.12.13
insert ряд значений


15-1255679649
pavel_guzhanov
2009-10-16 11:54
2009.12.13
Существует ли литература на русском языке


2-1256319619
Заглянувший
2009-10-23 21:40
2009.12.13
Неповтояющийся RANDOM