Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Помогите с комбинаторной задачей!

Ответить
Настройки темы
Delphi - [решено] Помогите с комбинаторной задачей!
ALI ALI вне форума

Пользователь


Сообщения: 70
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: ALI
Дата: 28-10-2008
Народ, подскажите, пожалуйста, как лучше создать и реализовать алгоритм. Может быть, кто-то уже сталкивался с подобной комбинаторной задачей. Суть в следующем: есть 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

 
ALI ALI вне форума Автор темы

Пользователь


Сообщения: 70
Благодарности: 0

Профиль | Отправить 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



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


вот,я предлагаю хитро сортировать таблицу №2 и сразу получить оптимальное разбиение У меня предчуствие, что ручной алгоритм это и делает, и что оно оптимально среди всех разбиений. Как считается КГ? щас строго докажем что зря мучаешься

Отправлено: 19:14, 27-12-2008 | #12

ALI ALI вне форума Автор темы

Пользователь


Сообщения: 70
Благодарности: 0

Профиль | Отправить 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

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата ALI:
не в том, чтобы получить наилучшее решение (это маловероятно), а задача состоит в том, чтобы получить как можно лучшее решение. »
я понимаю это как одно и то же тем более множество перестановок конечно, значит наилучшее решение достижимо
Цитата ALI:
алгоритма, предложенным неким товарищем Поддубным »
доказательство алгоритма есть? Я так понимаю, что он даёт локальный минимум на множестве. Есть много методов улучшить такое решение (например на основе монте-карло)
Цитата ALI:
КГ = (S(Cij) х 100) / (2 х n х(n-1)),
где n - количество членов в подгруппе, а S(Cij) - сумма всех психологических связей в сформированной подгруппе (сумма всех значений соответствующих элементов в ТМ). »
n фиксировано для разбиения, для оптимизации независимые константы не имеют значения, поэтому достаточно максимизировать S(Cij) - смахивает на задачу линейного программирования. Даже проще - коммивояжёра. Может неправильно понимаю, КГ среднее - не зависит от разбиений? (сумма не зависит от прядка суммирования)

Отправлено: 21:54, 28-12-2008 | #14

ALI ALI вне форума Автор темы

Пользователь


Сообщения: 70
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата pva:
я понимаю это как одно и то же тем более множество перестановок конечно, значит наилучшее решение достижимо »
Дружище, сейчас речь идет о том, чтобы получить как можно лучшее решение с помощью РУЧНОГО алгоритма. Ручной алгоритм, в отличие от алгоритма перебора, дает единственное решение, которое маловероятно получить наилучшим. Поэтому передо мной и стоит задача "подкрутить" ручной алгоритм ТАКИМ ОБРАЗОМ, чтобы решени получилось наиболее оптимальным. А потом уже можно сравнивать это решение и результат работы алгоритма перебора. В переборе, конечно же, можно получить наилучшее решение.
Цитата pva:
доказательство алгоритма есть?»
Доказательства, к сожалению, нет. У моего алгоритма тем более.
Цитата pva:
так понимаю, что он даёт локальный минимум на множестве. Есть много методов улучшить такое решение (например на основе монте-карло) »
Так-так-так, а вот с этого момента, пожалуйста, поподробнее.
Цитата pva:
n фиксировано для разбиения, для оптимизации независимые константы не имеют значения, поэтому достаточно максимизировать S(Cij) - смахивает на задачу линейного программирования. Даже проще - коммивояжёра. »
Максимизировать нужно не КГ (а точнее S(Cij)), хотя его по возможности тожно нужно "вытягивать", а максимизировать необходимо КГср, то бишь КГ, характеризующее ВСЁ разбиение, т.е. несколько подгрупп. Нам ведь нужно получить не одну оптимальную подгруппу, а сразу несколько, образующих оптимальное разбиение.
Ферштейн?

Отправлено: 16:53, 30-12-2008 | #15

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Примение метода монте-карло:
1. Пусть есть итерационый метод, уточняющий некоторое начальное решение до локального оптимума вблизи этого начального решения.
2. Пусть доказано, что множество, на котором ищется решение ограничено и замкнуто, но содержит больше одного решения (иначе смысла нет, и так всё ясно)
3. Тогда можно случайно (с равномерным распределением) выбрать несколько начальных решений и уточнять их. Чем больше "постреляешь", тем вероятней найти глобально оптимальное решение

Всё-таки я склоняю к тому, чтобы сортировать по общей сумме
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:01, 31-12-2008 | #16

ALI ALI вне форума Автор темы

Пользователь


Сообщения: 70
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо за советы. Будем думать.

Отправлено: 14:10, 01-01-2009 | #17



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Помогите с комбинаторной задачей!

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход