Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
6 / 0 / 0
Регистрация: 03.07.2015
Сообщений: 2
.NET 4.x

Перебор всех вариантов

03.07.2015, 16:45. Показов 1755. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Это моя первая проблема, с которой хотелось бы поделиться. Проблема сложная, но хотелось бы верить, что получится найти ее решение.

Я пытаюсь создать программу следующего типа: задается территория размером N*N (ее реализует отдельный класс), после этого в разных точках территории задается несколько летательных аппаратов (его также реализует отдельный класс), каждый из которых обозревает одинаковую площадь K*K. После этого программа должна просчитать оптимальный маршрут пути так, чтобы все эти аппараты за минимальное время "осмотрели" все клетки. За каждый шаг любой аппарат может сдвинуться вправо, влево, вверх или вниз, в зависимости от своего положения. Например, находясь в левом верхнем углу, он не сможет сдвинуться влево или вверх.

Идея реализации маршрута такая: предположим, есть 3 аппарата. В начальный момент времени у первого аппарата есть 3 возможных хода, у второго 2, у третьего 4. Метод, который ищет оптимальный путь, ищет один из возможных ходов, например, первый идет влево, второй вправо, третий вниз, после чего вызывает сам себя рекурсивно. Если посещены все клетки, то надо возвратить значение true и запомнить ходы, если на данный момент решение оптимально, и false иначе. Таким образом надо перебрать все возможные варианты. Да, это тупо, но после перебора всех вариантов точно известно, что конкретный вариант - лучший.

Проблема заключается в том, что изначально неизвестно, сколько всего аппаратов. Их может быть 2, а может быть 10 или даже 100. Соответственно, для 3 аппаратов, например, я бы написал 3 цикла for и перебрал бы все варианты. В идеале нужно сделать так - ход для первого, второго аппарата зафиксирован, для третьего рассматриваем возможные. Перешли на шаг вперед. Выяснили, что все клетки посещены, а решение неоптимально. Вернулись обратно, рассмотрели все шаги третьего аппарата - решение по-прежнему неоптимально. Взяли другой шаг второго аппарата - еще раз пересчитали все по третьему аппарату - неоптимально. Итого для начального момента времени из примера имеем 3*2*4 = 24 возможных хода. Получается, что надо рекурсивно рассмотреть все возможные ходы для одного момента времени, после чего опять-таки рекурсивно рассчитать, какой из них наилучший. А как реализовать это средствами C#?
Вложения
Тип файла: 7z UAV.7z (42.9 Кб, 1 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.07.2015, 16:45
Ответы с готовыми решениями:

Перебор всех возможных вариантов
Доброго всем дня! Есть задача: На вход дается строка из символов '0' '1' и '2' длиной не более 50. Нужно изменить число 0 на 1...

перебор вариантов...
имеется строка, содержащая слово. (например слово "лампа") Как можно перебрать всевозможные сочитания букв этого слова? разбил слово на...

Перебор вариантов из строки
Здравствуйте! Задачка такая. Есть строка с текстом "Ананас; Абрикос; Банан". Требуется, что бы программа выбирала эти элементы...

1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
03.07.2015, 21:32
Маньяк,
Сначала рассмотрим вопрос теоретически. Число всевозможных путей аппаратов - огромно и растет экспоненциально. Поэтому рассмотреть абсолютно все варианты - невозможно. Следовательно вариант полного перебора отпадает. А значит точного решения нет. Это плохо.
С другой стороны есть хороший критерий оптимальности решения. Если каждый аппарат на каждом шагу будет покрывать новую точку (для упрощения примем что K = 1), то такое решение точно будет оптимально, потому что аппараты просмотрят максимально возможное число точек за одно и то же время и одновременно закончат просмотр. Это хорошо.

Далее. Учитывая критерий оптимальности, нужно распределить все множество точек между аппаратами так, что бы у каждого аппарата было одинаковое число точек. Помимо этого множества точек должны обладать свойством связности, что бы аппарат мог обследовать свое множество не пересекая другие множества. Ну и сам аппарат должен находится изначально в своем множестве точек.
Попутно заметим, что задача близка к диаграмме Вороного. Однако в диаграмме Вороного множества точек в общем случае имеют разную площадь, что нам не подходит. Однако, если изначально аппараты распределены более-менее равномерно на плоскости, то диаграмма Вороного даст неплохое приближение к оптимальному разбиению множества.

Далее. Алгоритмов разбиения можно предложить несколько. На вскидку:

1) Берем первый аппарат, присваиваем ему одну ближайшую незанятую точку. Далее берем второй аппарат, присваиваем ему тоже ближайшую незанятую точку. И так далее, пока все точки не закончатся. Понятно, что множество равномерно разобьется между аппаратами. В этом методе не гарантируется связность точек. Однако мне кажется он неплох.

2) Посчитаем центр масс всех точек и центр масс всех аппаратов. Проведем линию между этими двумя точками. Поскольку любая линия, проведенная через центр масс разбивает множество на две равные(!) части, то после разбиения у нас в каждой полуплоскости окажется одинаковое число аппаратов и одинаковое число точек. Далее для каждой полуплоскости снова считаем центр масс точек и центр масс аппаратов, и снова делим каждую полуплоскость на две равные части. И так далее, пока в каждом участке не окажется ровно один аппарат.

3) Итерационный метод. На каждом шагу аппарат движется к ближайшей незанятой точке, попутно отталкиваясь от общего центра масс аппаратов. Расталкивание гарантирует, что аппараты равномерно займут площадь поиска. Простой но не оптимальный алгоритм.

4) Модифицируем алгоритм диаграммы Вороного, так, что бы у каждого аппарата оказалось одинаковое число точек.
Ну и т.д.

Далее. Допустим мы разбили все множество точек между аппаратами. Как аппарату облетать эти точки? Тут несколько вариантов. Самое простое - летать вдоль границы. Тогда траектория будет похожа на спираль и не будет иметь самопересечений. Это хорошо сработает если множества точек не вытянутой формы.
Другой способ - двигать аппарат так, как в алгоритмах заливки. Однако движение вдоль границ кажется более предпочтительным вариантом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.07.2015, 21:32
Помогаю со студенческими работами здесь

Перебор всех комбинаций
Нужно перебрать все комбинации символов(чисел) например Есть массив M = {1 , 2 , 3} и есть N = 2 (эти значения могут изменятся) ...

Перебор всех возможных сочетаний из множества
Всем привет! Задача состоит в следующем. задается число, скажем 3 и мы должны перебрать сочетания все чисел от 1 до 3. т.е. 1 2 3 ...

Комбинаторика - перебор всех возможных сочетаний
Всем привет! Есть некоторый массив A {11, 11, 22, 13, 34, 35, ...,NN} в котором содержится неопределённое количество двухзначных цифр....

Перебор всех файлов из папки и их запись в таблицу
using System; using System.Data; using Microsoft.VisualBasic.FileIO; using ReadCSVFile; using System.Data.SqlClient; using...

Process terminated due to StackOverflowException (Перебор всевозможных вариантов)
Всем здравствуйте. Я пишу программу, которая перебирает всевозможные варианты ходов в карточной игре "Бридж". Написав код,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru