14.11.2019, 22:29
Какая-то у вас странная модель, по которой получаются тайлы. Некоторые из них явно были получены не так. Например, 1033, 1034, 1043, 1089 и т.д. содержат серые точки только внутри, а вокруг песок. К тому же, по-моему, ваша программа не умеет крутить составные части тайлов, а без этого не очень хорошо получится тайл 1000 и др. Вообще было бы логичней сгруппировать тайлы по аллодам или даже по локациям, это бы ускорило проверку одного тайла в несколько раз, потому что не нужно было бы перебрать те, которые 100% не подходят. Может быть для этой задачи бы больше подошёл не перебор, а какие-нибудь генетические алгоритмы или что-то подобное.
Ради интереса, я написал небольшую программку на 700 строк на плюсах, которая, используя некоторые отсечения и предположения, пережёвывает в среднем один тайл за 6 минут. В ней есть небольшая проблема с тем, что она не может менять порядок масок и клеит их всегда в одинаковом порядке, но в принципе на более-менее нормальных тайлах она работает более-менее нормально. Всё равно очень сложные можно обработать вручную.
Примеры результата работы программы и саму программу можно найти по ссылке отсюда . Я не определился, как лучше считать расстояние между пикселями, поэтому там две папки с результатами: results с суммой модулей разностей и resultsINF с максимумом модулей разности по каждому каналу. Вроде вторая немного лучше, и программа не пытается лепить воду вместо скал на 1004, 1005 , но с остальными нужно смотреть, что будет точнее. В скобках указано, на сколько приближение похоже на нужное. Я считаю его как 1-(сумма расстояний до тайла)/(сумма расстояний до полностью чёрной картинки), поэтому в файлах эти величины не согласуются.
Исходники первой версии лежат в ZIP архиве вместе с вспомогательными файлами. Для сборки нужна libpng и какая-то библиотека для STL потоков (в линуксе это pthreads, в винде это что-то другое). В коде всё считается на 6 потоках, при желании можно менять. Exe дать не могу, потому что компилятор только в линуксе и есть.
Если что, я в конкурсе участвовать не собираюсь, сделал это просто чтобы проверить, правда ли нереально написать более-менее быстрое решение. На моём компьютере, если собрать Release, то по идее всё бы обработалось за неделю непрерывного счёта. Но можно это время уменьшить, разделив тайлы на несколько компов.
Ради интереса, я написал небольшую программку на 700 строк на плюсах, которая, используя некоторые отсечения и предположения, пережёвывает в среднем один тайл за 6 минут. В ней есть небольшая проблема с тем, что она не может менять порядок масок и клеит их всегда в одинаковом порядке, но в принципе на более-менее нормальных тайлах она работает более-менее нормально. Всё равно очень сложные можно обработать вручную.
Примеры результата работы программы и саму программу можно найти по ссылке отсюда . Я не определился, как лучше считать расстояние между пикселями, поэтому там две папки с результатами: results с суммой модулей разностей и resultsINF с максимумом модулей разности по каждому каналу. Вроде вторая немного лучше, и программа не пытается лепить воду вместо скал на 1004, 1005 , но с остальными нужно смотреть, что будет точнее. В скобках указано, на сколько приближение похоже на нужное. Я считаю его как 1-(сумма расстояний до тайла)/(сумма расстояний до полностью чёрной картинки), поэтому в файлах эти величины не согласуются.
Исходники первой версии лежат в ZIP архиве вместе с вспомогательными файлами. Для сборки нужна libpng и какая-то библиотека для STL потоков (в линуксе это pthreads, в винде это что-то другое). В коде всё считается на 6 потоках, при желании можно менять. Exe дать не могу, потому что компилятор только в линуксе и есть.
Если что, я в конкурсе участвовать не собираюсь, сделал это просто чтобы проверить, правда ли нереально написать более-менее быстрое решение. На моём компьютере, если собрать Release, то по идее всё бы обработалось за неделю непрерывного счёта. Но можно это время уменьшить, разделив тайлы на несколько компов.