Дозвольте мені побачити, чи правильно я зрозумів, червоними блоками були сині кольори, алгоритм знайшов форму T і позначив їх червоною, це правильно? Ваша мета - знайти якомога більше T фігур з однаковими кольоровими блоками, правильно, поки я сподіваюся. В даний час ви відзначаєте їх, як тільки ви їх знайдете, і це зменшує корисність алгоритму (Оскільки, можливо, вам не вистачить оптимального рішення). Ви плануєте шукати всі форми, а потім вибирати, які з них використовувати, а які не використовувати. Чи правильно я поки що? Тому що ви хочете максимально збільшити кількість блоків, що містяться всередині T фігур, коли алгоритм виконаний.
Якщо я маю рацію, наступне - це оптимальне рішення для вашої ситуації, на мою думку.
Ми будемо використовувати лінійне програмування Integer.
Я вважаю, що раніше це використовував:
http://sourceforge.net/projects/lpsolve/
http://lpsolve.sourceforge.net/5.5/Java/README.html
(Ви можете змусити його працювати з багатьма мовами, я використовував це з PHP, Java та C)
Що ми будемо робити, це зареєструвати всі можливі форми T на дошці, а потім використовувати ILP, щоб максимізувати кількість охоплених блоків. ІЛП експоненціально складний. Враховуючи розмір вашої дошки, це не буде проблемою. Я запускав набагато складніші запитання щодо мінімуму / максимуму на графіках з ILP, і на це знадобилося лише частку секунди і до 30-90 секунд із сотнями вершин (у вашому випадку це припадає на частку секунди).
Що я б рекомендував зробити:
- Знайдіть усі можливі форми ліній
- Знайдіть усі перетини між формами ліній одного кольору
- Знайдіть усі можливі форми T, шукаючи всі перетини.
- Визначте булеву змінну у лінійній задачі для кожної форми T (
0 <= Bi <= 1
) Оскільки значення є цілими числами, то виходить 0 або 1.
- Складіть умови для кожної пари Т-образів, які перетинаються (
Bi + Bj <= 1
)
- Цільовою функцією буде (сума блоків у "T" формі (i) * Bi)
- Запустіть розв'язувач і затемніть Т-фігури там, де розв'язувач відповідає булевим (им), де 1 - в оптимальному рішенні.
Це цінні знання, я часто використовував лінійні розв'язувачі для робочих проектів.
ILP - це в основному спосіб вирішити проблеми вибору, коли ви хочете досягти максимуму або мінімуму для якоїсь лінійної функції.
Ви можете прочитати більше тут, використовуючи лінійне програмування Integer та лінійне програмування - це те саме для програміста, що Integer набагато складніший для комп'ютера, що може спричинити за собою тривалий час роботи. Не у вашому випадку, це дуже просто і у найгіршому випадку має займати менше мілісекунд.
Я думаю, ви можете прочитати більше тут:
http://en.wikipedia.org/wiki/Integer_linear_programming#Integer_unknowns
Це добре пояснює:
http://fisher.osu.edu/~croxton_4/tutorial/
Це в основному рішення проблеми вирішення, як приймати рішення, які максимізують бажаний результат. Це передбачає, що функція, яка оцінює результат, лінійна, що у вашому конкретному випадку це. Функція, яка оцінює результат у цьому випадку, підсумовує блоки для всіх Т-образів, які ви вирішили затемнити.
Математично, як встановити змінні: у нашому теперішньому випадку булеві (чи я затемнював форму T з індексом i чи ні) до оптимальних значень, щоб досягти максимального результату, який ми бажаємо: затемнення якомога більшої кількості блоків без потемніння, що перетинає фігури T. Поки бажаний результат можна обчислити за допомогою лінійної функції, коли у вас встановлені всі змінні, це вирішить. У нашому випадку ми перевіряємо, які форми T потемніли, і підсумовуємо блоки, які вони покривають.
Я знаю, що це не банально, тому якщо ви вирішите скористатись стрибком, не соромтесь коментувати, і я докладу.