|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Помогите с комбинаторной задачей! |
|
Delphi - [решено] Помогите с комбинаторной задачей!
|
Пользователь Сообщения: 70 |
Профиль | Отправить PM | Цитировать
Народ, подскажите, пожалуйста, как лучше создать и реализовать алгоритм. Может быть, кто-то уже сталкивался с подобной комбинаторной задачей. Суть в следующем: есть 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, как показано в таблице. |
|
Отправлено: 15:56, 28-10-2008 |
Пользователь Сообщения: 70
|
Профиль | Отправить PM | Цитировать Э-э-э-э-э, дружище, ты меня не понял. Или я плохо объяснил. Я не мог долго ответить, потому что был сильно занят. Сейчас расскажу поподробнее, как производятся расчеты. Таблица взаимоотношений выстраивается совершенно другим образом, а именно на основе социометрии, где все люди «раздают» друг другу оценки по пятибалльной шкале от -2 до 2 (от полного негатива до полного позитива). К примеру, для группы из 6 человек матрица взаимных оценок будет выглядеть следующим образом:
Потом на основе этой таблицы я строю матрицу взаимных психологических связей (ТМ): Далее, совершая определенные манипуляции с ТМ, я получаю оптимальное решение (разбиение), например, для 6 = 2х3: (1, 3, 5), (2, 4, 6) И уже для этих разбиений я считаю по определенной формуле КГ на основе ТМ, а затем КГср: КГ(1, 3, 5) = 57 КГ(2, 4, 6) = 65 Кгср. = 61 На этом работа «ручного» алгоритма заканчивается и начинается работа алгоритма перебора. Далее я ищу ВСЕ возможные разбиения. Для разбиения вида 2х3 их количество составит 10. Итак, что же мы имеем, выстраивая разбиения по возрастанию по КГср, то бишь вверху будут находиться разбиения с максимальным КГср, а внизу с минимальным: Красным цветом я выделил искомое разбиение. И вот теперь-то я могу судить об эффективности или неэффективности «ручного» алгоритма, видя занимаемую позицию найденного разбиения. |
Отправлено: 18:10, 26-12-2008 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать вот,я предлагаю хитро сортировать таблицу №2 и сразу получить оптимальное разбиение У меня предчуствие, что ручной алгоритм это и делает, и что оно оптимально среди всех разбиений. Как считается КГ? щас строго докажем что зря мучаешься
|
Отправлено: 19:14, 27-12-2008 | #12 |
Пользователь Сообщения: 70
|
Профиль | Отправить PM | Цитировать Насчет того, насколько оптимален ручной алгоритм или нет, судить сложно, потому что этот алгоритм разработан мной на основе другого алгоритма, предложенным неким товарищем Поддубным. Но могу сказать одно: он НЕ дает наилучшего решения. Смысл-то как раз не в том, чтобы получить наилучшее решение (это маловероятно), а задача состоит в том, чтобы получить как можно лучшее решение.
А КГ считается следующим образом: КГ = (S(Cij) х 100) / (2 х n х(n-1)), где n - количество членов в подгруппе, а S(Cij) - сумма всех психологических связей в сформированной подгруппе (сумма всех значений соответствующих элементов в ТМ). Например: КГ(1, 2, 3) = (2 + 2 + 1) * 100 / (2 * 3 * (3-1)) = 41,6 Кстати говоря, в предыдущем посте КГ я брал от балды, так что не обращай внимания. Лень было считать врукопашную. Ну, а КГср считается, как среднее арфметическое от всех КГi по подгруппам. В нашем случае (6=2х3) это: КГср = (КГ1 + КГ2) / 2 |
Отправлено: 20:43, 27-12-2008 | #13 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Цитата ALI:
Цитата ALI:
Цитата ALI:
|
|||
Отправлено: 21:54, 28-12-2008 | #14 |
Пользователь Сообщения: 70
|
Профиль | Отправить PM | Цитировать Цитата pva:
Цитата pva:
Цитата pva:
Цитата pva:
Ферштейн? |
||||
Отправлено: 16:53, 30-12-2008 | #15 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Примение метода монте-карло:
1. Пусть есть итерационый метод, уточняющий некоторое начальное решение до локального оптимума вблизи этого начального решения. 2. Пусть доказано, что множество, на котором ищется решение ограничено и замкнуто, но содержит больше одного решения (иначе смысла нет, и так всё ясно) 3. Тогда можно случайно (с равномерным распределением) выбрать несколько начальных решений и уточнять их. Чем больше "постреляешь", тем вероятней найти глобально оптимальное решение Всё-таки я склоняю к тому, чтобы сортировать по общей сумме |
Отправлено: 11:01, 31-12-2008 | #16 |
Пользователь Сообщения: 70
|
Профиль | Отправить PM | Цитировать Спасибо за советы. Будем думать.
|
Отправлено: 14:10, 01-01-2009 | #17 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
C/C++ - помогите с задачей по СИ!!! | feliks2009 | Программирование и базы данных | 4 | 16-11-2009 00:18 | |
Delphi - [решено] Помогите с задачей /Pascal/ | Habetdin | Программирование и базы данных | 23 | 11-11-2009 22:46 | |
C/C++ - [решено] Помогите с задачей! | FeuerEngel | Программирование и базы данных | 3 | 28-05-2009 09:58 | |
VBS/WSH/JS - Помощь с простенькой задачей) | Triz | Программирование и базы данных | 10 | 05-03-2009 18:35 | |
C/C++ - Помогите с задачей по Тройкам Пифагора | quaker_strelok | Программирование и базы данных | 10 | 01-12-2008 16:44 |
|