Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Нужен алгоритм

319
03 апреля 2004 года
xelos
577 / / 27.02.2003
Добрый день всем... нужен алгоритм, реализующий перестановки. Задача следующая:
есть n коробок и m объектов. нужен алгоритм, позволяющий разместить всеми возможными способами объекты в коробках, каждый раз в корбке должен быть как минимум 1 объект. Объекты нумерованные и их порядок в коробках важен.
Пример: 2 коробки А и В, 3 объекта 1,2 и 3. необходим алгоритм, позволяющий получить следующие решения:
А - 1, В - 2,3
А - 1, В - 3,2
А - 1,2 В - 3
А - 2,1 В - 3
А - 1,3 В - 2
А - 3,1 В - 2
А - 2, В - 1,3
А - 2, В - 3,1
А - 2,3 В - 1
А - 3,2 В - 1
А - 3 В - 1,2
А - 3 В - 2,1

Алгоритм нужен срочно. Спасибо заранее. Вобщем, все возможные перестановки найти надо. Условие, что по одному объекту в коробке можно снять, т.к. оно легко проверяется.

266
03 апреля 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by xelos
Добрый день всем... нужен алгоритм, реализующий перестановки. Задача следующая:
есть n коробок и m объектов. нужен алгоритм, позволяющий разместить всеми возможными способами объекты в коробках, каждый раз в корбке должен быть как минимум 1 объект.
Пример: 2 коробки А и В, 3 объекта 1,2 и 3. необходим алгоритм, позволяющий получить следующие решения:
А - 1, В -2,3
А - 1,2 В - 3
А - 1,3 В - 2
А - 2, В -1,3
А - 2,3 В - 1
А - 3 В - 1,2

Алгоритм нужен срочно. Спасибо заранее.


Я тут посмотрел, подумал...
Самый простой способ - перебор.
1. Создаёшь массив логических элементов размерностью количество коробок Х количество объектов
2. Задаёшь логическую переменную, например А
3. Заполняешь коробки в 1 исходный вариант так, чтобы у тебя в 1 коробке было максимум элементов. Например:

 
Код:
11111100
00000010
00000001

Я бы это делал в цикле вида:
Код:
For i=0 to m-n
 b(0,i) = True
next

A = i
For D = I to M
 FOR C=1 TO N
  IF D>A THEN
    B(D,C) = True
    A = D
  ENDIF
 NEXT
NEXT

Вроде нигде не обшибся.
Потом начинай "осыпать" в циклах значение из "верхнего" массива в нижние, чтобы получались матрицы вида
Код:
11111000
00000110
00000001

11110000
00001110
00000001

11100000
00011110
00000001

ну и так далее.
Теперь так. Строка матрицы - это логическое сложение
Логически складываешь элементы строк и перемножаешь. Если в итоге - True, то выводишь матрицу в качестве варианта ответа, иначе ищешь следующий вариант.
319
03 апреля 2004 года
xelos
577 / / 27.02.2003
забыл уточнить, объекты нумерованные и порядок объектов в коробках важен.

12345
67

и

12345
76

различнные решения.

потом при выводе результата, каждое решение нужно вывести на экран один раз.

см. корректировку условия
319
03 апреля 2004 года
xelos
577 / / 27.02.2003
я тут тоже подумал, по идее эту задачу можно разбить на две отдельные задачи из комбинаторики:
первая, если есть n объектов - найти все возможные перестановки объектов.

задача 2 - найти все возможные способы размещения n объектов в m коробках без учета порядка...

т.о. сначала делаем алгоритм 2, а потом для каждой коробки алгоритм 1.
319
03 апреля 2004 года
xelos
577 / / 27.02.2003
Цитата:
Originally posted by xelos
я тут тоже подумал, по идее эту задачу можно разбить на две отдельные задачи из комбинаторики:
первая, если есть n объектов - найти все возможные перестановки объектов.

задача 2 - найти все возможные способы размещения n объектов в m коробках без учета порядка...

т.о. сначала делаем алгоритм 2, а потом для каждой коробки алгоритм 1.


все, решил...
для раскидки объектов по ящикам делаем следующую вещь :
берем число длиной в количество объектов с базой в количество ящиков и организуем счетчик. Т.е. пусть есть ящики А,В,С и 4 объекта. Записываем число
АААА потом увеличиваем на 1 за каждый проход число:
АААВ
АААС
ААВА
ААВВ
и т.д.
это означает, что для АСАВ
в ящике А объекты 1,3, в ящике В - объект 4, в ящике С объект 2.

теперь перестановки - пусть в ящике n объектов, тогда число всех перестановок будет n!
начинаем с самого маленького числа.
алгоритм начинается с последней цифры и идет к первой. смотрим с конца числа неубывающую подпоследовательность. как дошли до первого числа этой подпоследовательности, меняем его и стоящее перед ним местами. образовавшуюся последовательность записываем в возрастающем порядке. начинаем по новой с самого последнего числа.

Насчет перестановок идеей помог один друг математик :):) доказательство этого алгоритма оставляю всем желающим в качестве упражнения :):)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог