Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 11.11.2022
Сообщений: 5

Задача о гладиаторах

11.11.2022, 11:31. Показов 1358. Ответов 16

Студворк — интернет-сервис помощи студентам
Суть проблемы:
Есть два набора бойцов:
В первой m человек
Во второй n человек

Необходимо выбрать из каждого набора 2 команды по p (p < m) и q (q < n) человек соответственно.
Таких, бой между которыми будет самым зрелищным (биться будет каждый из первой команды с каждым из второй). необходимо вернуть индексы бойцов в каждой команде.

Примеры:
m = 5, n = 5, p = 3, q = 3.

Первый набор - 1 2 3 4 5
Второй набор - A B C D E

Пример 1.
На пересечении - "зрелищность" боя.
Code
1
2
3
4
5
6
    1 2 3 4 5
A   9,9,9,3,4
B   9,9,9,4,2
C   9,9,9,5,2
D   4,1,2,4,5
E   6,6,6,4,2
В ответ ожидается:
Первая команда, бойцы: 1,2,3
Вторая команда, бойцы: A,B,C

Пример 2.
Та же самая таблица, но с изменённым порядком строк и столбцов (так проблема более наглядна).
Code
1
2
3
4
5
6
    1 2 3 4 5
A   9,2,9,4,9
B   6,2,6,4,6
C   9,2,9,5,9
D   4,5,2,4,1
E   9,4,9,3,9
В ответ ожидается:
Первая команда, бойцы: 1,3,5
Вторая команда, бойцы: A,C,E

Собственно суть вопроса не в просьбе написать алгоритм, а в возможных подсказках в плане оптимизации или подходах к решению этой задачи, т.к. m и n могут быть довольно большими.
Может есть похожие задачи, с решениями не требующими полного перебора.
Возможно есть подходы находящие не самое оптимальное решение (может генетический алгоритм), но работающие относительно быстро.
Возможно есть какой-то способ уменьшить изначальные наборы.

Думаю над проблемой довольно долго, глаз "замылился".
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.11.2022, 11:31
Ответы с готовыми решениями:

Олимпиадная задача по программированию. PascalABC.NET. Задача L. Переключение между окнами
Когда пользователь работает в операционной системе Winux, у него часто запущено несколько приложений. Каждое из приложений работает в...

Васильев C# Глава 8 задача 2 (Просьба объяснить формулировку(задача внутри)
Текст задачи Написать программу , в которой есть класс с полем, являющимся ссылкой на одномерный целочисленный массив. У класса есть...

Васильев C# Глава 7 задача 8 (Просьба объяснить формулировку(задача внутри)
Текст задачи Напишите программу с классом, у которого есть текстовое поле. Значение текстовому полю присваивается при создании объекта...

16
383 / 280 / 112
Регистрация: 28.04.2015
Сообщений: 1,726
11.11.2022, 17:41
а я не понял
что именно - долго писать, поэтому не буду
в общем далеко не все понятно из постановы ( за себя говорю )
-----------------------
когда дошел до фразы " Есть два набора бойцов:" сразу почудились двудольные графы...ну ладно...
1
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,696
12.11.2022, 07:12
Если оптимальное решение необязательно, то динамическое программирование: допустим у нас уже набраны часть бойцов из первой и второй группы, перебираем оставшихся бойцов и выбираем такого, который даст максимальную прибавку зрелищности (в текущем составе).
1
30 / 24 / 7
Регистрация: 22.02.2019
Сообщений: 104
13.11.2022, 13:06
А если так:
  • подсчитаем рейтинг бойцов команды А как сумму баллов соответствующей строки/столбца матрицы;
  • выберем p бойцов команды А с наивысшим рейтингом;
  • подсчитаем рейтинг бойцов команды В как сумму баллов встреч с уже выбранными бойцами команды А;
  • выберем q бойцов команды В с наивысшим рейтингом;
Кажется, готово?
1
0 / 0 / 0
Регистрация: 11.11.2022
Сообщений: 5
14.11.2022, 13:48  [ТС]
Спасибо за ответ.
Вариант, похоже, не плохой.

Но есть кейсы, когда может выдать не самый хороший результат.
Наример:

Code
1
2
3
4
5
6
    1 2 3 4 5
A  9 9 9 2 2
B  9 9 9 4 4
C  9 9 9 7 7
D  1 1 1 9 9
E  1 1 1 8 8
в данном случае, если "фиксировать" бойцов из группы (A-E), алгоритм отработает корректно.
но если сперва выбирать из группы (1-5)
после первоначального отсеивания получим:
Code
1
2
3
4
5
6
    1 4 5
A  9 2 2
B  9 4 4
C  9 7 7
D  1 9 9
E  1 8 8
т.к. сумма в столбцах 4 и 5 - больше, чем 1 - 3

После второго:
Code
1
2
3
4
    1 4 5
B  9 4 4
C  9 7 7
D  1 9 9
Вероятно "улучшением" алгоритма будет выбор лучшего из 2-х решений - (1) с фиксацией по строкам и (2) по столбцам.

Пока писал ответ, придумал вариант (который "ломает") в том числе предложенное улучшение:
Code
1
2
3
4
5
6
7
8
    1 2 3 4 5 6 7
A  7 7 7 1 1 1 1
B  7 7 7 1 1 1 1
C  7 7 7 1 1 1 1
D  1 1 1 6 6 6 6
E  1 1 1 6 6 6 6
F  1 1 1 6 6 6 6
G  1 1 1 6 6 6 6
В данном случае в любом случае вернётся набор из 6 (т.к. сумма по столбцам и по строкам будет больше и 7 не попадут ни в один из наборов).

Тем не менее - учитывая что нам не всегда нужен лучший вариант, а важен баланс между скоростью и результатом. Решение имеет право на жизнь.
0
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,696
14.11.2022, 14:59
Свести задачу к задаче целочисленного линейного программирования (ЦЛП).
Для каждого боя заводим целочисленную переменную, которая будет принимать 0 (бой не состоится) или 1 (состоится).
Эти переменные x[1,1], ..., x[m,1], x[1,2], ..., x[m,n] - матрица, оптимизируемые целочисленные решения.
Накладываются ограничения:
x[i, j] >= 0
x[i, j] <= 1
x[i, j] - целое
sum(x[i,1], ..., x[i, n]) = p
sum(x[1, j], ..., x[m, j]) = q
sum(A[1,1]*x[1,1], ..., A[m,n]*x[m,n]) = max

Это типичная ЗЦЛП. Решается точно и влёт.

A[i,j] - матрица зрелищности боёв.

Добавлено через 11 минут
Но тут прочитал, что ЗЦЛП является NP-полной. ((
Но алгоритмы-решатели есть, надо их использовать.
0
2615 / 1627 / 265
Регистрация: 19.02.2010
Сообщений: 4,318
14.11.2022, 15:18
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Накладываются ограничения:
x[i, j] >= 0
x[i, j] <= 1
x[i, j] - целое
Можно записать тут единственное ограничение x[i, j]*(1-x[i, j])=0 - станет возможным последующее применение алгоритмов гладкой оптимизации.
Если кому не очевидно - то потребуется всего лишь трансформация подобного и других (не стал их включать в цитату) критериев вида z=const в критерии вида (z-const)2->min, и последующая сборка их в единую дифференцируемую функцию из кучи слагаемых ("штрафных слагаемых" вдобавок к основному максимизируемому критерию).
0
30 / 24 / 7
Регистрация: 22.02.2019
Сообщений: 104
14.11.2022, 17:17
Цитата Сообщение от azizoff Посмотреть сообщение
Вариант, похоже, не плохой.
Но есть кейсы, когда может выдать не самый хороший результат.
Выбор в качестве рейтинга суммы баллов по строке/столбцу это просто первое, что в голову пришло.
Можно, наверно, поэкспериментировать и с другими функциями.
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
15.11.2022, 13:41
Если задачу свести к целочисленному линейному программированию, что уже написали, то решение будет находится быстро.
Для малых задач можно использовать полный перебор, количество вариантов: кол-во сочетаний p по m помноженное на количество сочетаний q по n (для стартовой задачи - 225 вариантов). Может быть получится применить метод ветвей и границ для сокращения расчетов

Для больших размерностей, и для необязательности нахождения именно оптимального результата, когда достаточно "хорошего", то можно вначале решить задачу "жадным" алгоритмом, затем ее улучшать алгоритмом имитации отжига, пытаясь заменить одного спортсмена на другого, если это приводит к улучшению

Добавлено через 1 минуту
azizoff, Вы можете приложить задачу с реальными данными большой размерностью?
1
0 / 0 / 0
Регистрация: 11.11.2022
Сообщений: 5
15.11.2022, 13:48  [ТС]
На самом деле - данная задача не совсем академическая (приведена к такому виду для простоты понимания), а вполне требующая решения на практике, за разумное время.
В реальности m и n могут быть трехзначными и четырёхзначными. (от сотен до тысяч)
p и q до сотни.
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
15.11.2022, 13:58
Цитата Сообщение от azizoff Посмотреть сообщение
В реальности m и n могут быть трехзначными и четырёхзначными. (от сотен до тысяч)
p и q до сотни.
Повторю вопрос, Вы можете приложить реальные данные?
Можно конечно придумать их генератором случайных чисел, но лучше все таки протестировать реальные данные
0
0 / 0 / 0
Регистрация: 11.11.2022
Сообщений: 5
15.11.2022, 13:59  [ТС]
m-ch, приложил полноразмерный пример (таблица "зрелищностей").
Ожидаемые p = 13 и q = 13.
Вложения
Тип файла: xlsx table.xlsx (55.0 Кб, 14 просмотров)
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
15.11.2022, 17:00
Посмотрите такое решение, не обязательно оно будет оптимальным, но считает относительно быстро на текущих данных
Вложения
Тип файла: zip Максимизация.zip (273.1 Кб, 6 просмотров)
1
0 / 0 / 0
Регистрация: 11.11.2022
Сообщений: 5
15.11.2022, 18:05  [ТС]
m-ch, Спасибо! Наглядное решение, пошел изучать макрос.
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
15.11.2022, 21:46
Как можно улучшить решение:
Можно стартовое решение не находить жадным алгоритмом, а взять любое: взять столбцы и строки просто по порядку, по сортировке суммы по столбцам и строкам или просто случайным образом (метод Монте-Карла).
Затем улучшать решение, до тех пор, пока не найдем локальный максимум.
Также можно транспонировать исходную матрицу и поменять порядок перебора строк и столбцов.

Из множества решений выбираем лучшее.
Если время позволяет, то будет найдено решение не хуже, а даже немного лучше, чем было найдено за один проход.
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
15.11.2022, 22:33
Нашел у себя в коде небольшую ошибку, выкладываю с исправлениями
Описанную выше методику не реализовывал
Вложения
Тип файла: rar Максимизация.rar (316.8 Кб, 3 просмотров)
1
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
16.11.2022, 23:03
Дополнил решение "медленным" алгоритмом, по сути, это тот же алгоритм, но используется перебор всех n столбцов в качестве стартового решения, из множества n решений выбирается лучшее.
Получилось чуть лучше, но решает значительно дольше
Вложения
Тип файла: rar Максимизация2.rar (263.2 Кб, 3 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.11.2022, 23:03
Помогаю со студенческими работами здесь

Задача со строками. Задача находится на фотке, которая прикреплена к сообщению
Фотку прикрепил к сообщению. П.5.4. Правил Запрещено создавать темы с бессмысленными названиями вроде &quot;Помогите!&quot;,...

Задача при создание нового лида выводится задача от несущ.пользователя Б24
При создание нового Лида Выходит уведомление от пользователя которого нету в компаний. Как поменять пользователя???

Задача о шахматном коне (задача Эйлера). Поиск в глубину
Требуется обойти все клетки шахматной доски ходом коня. Метод поиска решений – поиск в глубину. Буду признателен за любую помощь! Заранее...

Задача на перебор вариантов. Задача Л.Эйлера. Про чиновника
Задача Л.Эйлера. Некий чиновник купил лошадей и быков на сумму 1770 талеров. За каждую лошадь он уплатил по 31 талеру, а за каждого быка по...

Задача целочисленного программирования. Задача на оптимизацию. Матричный метод
Здравствуйте. Преподаватель дал задачи (скриншоты прикреп.) и эти две задачи были решены компонентным методом (файлы прикреплены). Но...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru