Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2014, 12:40   #1
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию Генетический алгоритм для покрытия матрицы прямоугольниками

Здравствуйте, уважаемые форумчане.

Столкнулся с задачкой, над которой бьюсь уже пару недель с попеременным успехом.

Условие звучит так:
На вход программы подаётся квадратная матрица M порядка N (Mij равно 0 или 1). Матрица вводится в виде списка из N строк матрицы, где каждая строка - это список из N элементов матрицы. Затем задаётся положительное целое число K.
Можно ли покрыть все единичные элементы матрицы M не более чем K прямоугольниками? Другими словами, существует ли такая последовательность четвёрок (ai, bi, ci, di) (1 ≤ i ≤ K, 1 ≤ ai, bi, ci, di ≤ N, ai ≤ ci, bi ≤ di), в которой ai, ci - это номера строк матрицы, а bi, di - номера столбцов. Эта последовательность должна удовлетворять условию, что любой единичный элемент матрицы должен покрываться хотя бы одним прямоугольником, и любой прямоугольник должен состоять только из единиц. Если такого покрытия не существует, напечатайте "False". Если покрытие существует, напечатайте "True", затем количество прямоугольников, а затем список описаний прямоугольников. Каждое описание прямоугольника представляет собой список из 4 элементов как описано выше.

Пример:
Входные:
((1 0) (0 1))
2
Выходные:
True
2
((1 1 1 1) (2 2 2 2))

Основывался на идее решения http://forum.vingrad.ru/forum/topic-341571.html. Черновое решение (Delphi XE6) во вложении. Оно, кхм, не находит ответ (для фиксированного условия: ((1 1 1 0 1 1 1) (1 1 1 0 1 1 1) (1 1 1 1 1 1 1) (0 0 1 1 1 0 0) (1 1 1 1 1 1 1) (1 1 1 0 1 1 1) (1 1 1 0 1 1 1)) K = 5). Проблемы, скорее всего, заключаются в фит-функции и мутировании, но после чтения ~5 статеек в интернете так и не придумал ничего лучше.
Вложения
Тип файла: txt solution.txt (9.3 Кб, 150 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 10.11.2014 в 12:49.
BDA вне форума Ответить с цитированием
Старый 10.11.2014, 13:08   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Фигасе. Эт если ты над ней бьешься то что будет со мной, матемадвоешником? Конвульсии наверное
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.11.2014, 13:26   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

По сути у вас есть матрица:
00000000
00111100
00111100
00111100
00000000

И ваш алгоритм должен распознать там фигуру из единиц, так?

Почему бы не применить тот же волновой алгоритм? Аля умное выделение фрагмента изображения из множества изображений в одной картинке, только на автомате начинающее работать от центра картинки.
Пример 1(искать Magic Wand)

только определите для программы минимальные размеры размеры прямоугольника, ибо 2x2 это уже квадрат, а 1x1 просто точка, и основные правила этого объека(все стороны прямые, хотябы).

или задача в том и состоит, чтобы конкретный алгоритм применить?

Последний раз редактировалось Человек_Борща; 10.11.2014 в 13:32.
Человек_Борща вне форума Ответить с цитированием
Старый 10.11.2014, 13:39   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Stilet, ну так я тоже не особо математически подкован (всякие вероятности не рассчитывал для задания размера популяции).
Человек_Борща, да и рад бы применить другой алгоритм, но использование именно генетического - обязательное требование. Дополнительную сложность добавляет вариант, когда решением является множество пересекающихся прямоугольников. Например:
11111100111111
11111100111111
11111100111111
11111111111111
11111111111111
00001111110000
00001111110000
00001111110000
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 10.11.2014 в 13:42.
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генетический алгоритм nudist Общие вопросы Delphi 2 28.02.2014 21:18
Генетический алгоритм CannibalCorpse Общие вопросы Delphi 0 13.04.2012 15:48
Безнадежная тема.. алгоритм покрытия kypck Общие вопросы C/C++ 1 08.03.2012 20:51
Генетический алгоритм Sparky Помощь студентам 5 16.12.2011 20:32
Генетический Алгоритм rust09reg91 Общие вопросы Delphi 2 03.04.2011 16:03