За последние 24 часа нас посетили 22099 программистов и 1152 робота. Сейчас ищут 553 программиста ...

Алгоритм распределения по командам

Тема в разделе "PHP для новичков", создана пользователем Survivor, 8 фев 2023.

  1. Survivor

    Survivor Новичок

    С нами с:
    8 фев 2023
    Сообщения:
    63
    Симпатии:
    10
    Доброго времени суток.
    Есть массив:
    PHP:
    1. <?php
    2. // ALL USER
    3. $teams =
    4. [
    5.   0 => ['rait' => 12],
    6.   1 => ['rait' => 5],
    7.   2 => ['rait' => 10],
    8.   3 => ['rait' => 10]
    9. ];
    10. ?>
    Пытаюсь заполнить два массива( 2 команды, красная и синяя ) равномерно по значению (рейтинг) "rait"
    PHP:
    1. <?php
    2.   shuffle($teams);
    3.   usort($teams, function($x, $y)
    4.   {
    5.         return mt_rand(1,2) == 1 ? ( $x["rait"] > $y["rait"] ? 1 : ($x["rait"] < $y["rait"] ? -1 : 0) ) : ( $x["rait"] > $y["rait"] ? 1 : ($x["rait"] < $y["rait"] ? -1 : 0) );
    6.   });
    7.   $c_1 = [];
    8.   $c_2 = [];
    9.   for ( $i = 0; $i < sizeOf($teams); $i++)
    10.   {
    11.     if ( $i%2==0 )
    12.      $c_1[] = $teams[$i]['rait'];
    13.     else
    14.      $c_2[] = $teams[$i]['rait'];
    15.   }
    16.   /* var_dump()
    17.   array (
    18.     0 => 5,
    19.     1 => 10,
    20.   )
    21.   array (
    22.     0 => 10,
    23.     1 => 12,
    24.   )
    25.   */
    26. ?>
    Выходит, что первая команда априори более слабая, чем вторая.
    1) 5 + 10 ( общий 15 )
    2) 10 + 12 ( общий 22 )
    Подскажите, пожалуйста, как реализовать систему распределения так, чтобы (по данному примеру) вышло
    12 + 5 в первой команде
    и
    10 + 10 во второй
     
  2. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    861
    Симпатии:
    132
    Ну, перебрать все возможные сочитания игроков в командах, запомнить общие очки команд и выбрать с минимальной разницей, ничего больше не придумал.
     
  3. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Кроме перебора: разве что деревья, "сбалансированные по весу".
    Но количество равное как-то надо будет обеспечить :)
     
  4. dantemgs

    dantemgs Новичок

    С нами с:
    24 дек 2022
    Сообщения:
    47
    Симпатии:
    9
    Для начала сделать человеческий список, с этими вложениями не охота работать:
    PHP:
    1. $arr = [
    2.   0 => 12,
    3.   1 => 5,
    4.   2 => 10,
    5.   3 => 10
    6. ];
    7. $teamCount = 2;
    8. $mid = array_sum($arr)/$teamCount;
    А дальше тот же совет: перебрать все возможные комбинации, только я бы искал их разницу со средним значением рейтинга. Потом отсортировал модуль этой разницы и взял бы первых 2.
     
    Survivor нравится это.
  5. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    861
    Симпатии:
    132
    @dantemgs, человеческий список без индексов будет )))