2011-05-03 3 views
2

새로운 질문에서이 질문에 대한 부정적 피드백을 얻은 후에 ... 여기 내 개정 된 질문이 있습니다. 예, 제가 작업하고있는 것과 동일한 프로젝트이지만, 기본적으로 라운드 로빈 유형의 스케줄러가 있어야한다는 점이 명확하지 않았습니다.PHP 무작위 팀 스케줄 생성기 - 라운드 로빈 스케줄러

저는 라운드 로빈 스타일 하키 리그 스케줄러에서 일하고 있는데 도움이 필요합니다.

전체적인 목표는 최종 관리자가 3 개의 변수를 펀치 할 수 있고 WEEKS 카운터에 도달 할 때까지 라운드 로빈 스타일 일정을 수행하도록하는 것입니다. 아래는 팀의 양과 게임이 플레이되는 주 수의 예입니다.

$Teams = array('team1','team2','team3','team4','team5','team6','team7','team8'); 
$Weeks = 16; 

목표는 1 시간 일주일을 재생하는 각 팀을 가지고, 4 개 게임 주를 만들고, 그 루프 16 번하는 것입니다. 라운드 로빈 알고리즘은 모든 가능성 조합이 이루어지기까지 매주 다른 팀을 플레이해야하지만 16 주를 넘지 않아야합니다. 우리가 가능한 조합보다 4 팀 또는 그 이하의 팀을 보유하고있는 경우, 주 숫자가 맞을 때까지 라운드 로빈을 다시 시작해야합니다.


편집 :

내가 할 수있는이 스크립트를 필요로 무엇에 약 90 %입니다 ...하지만 나는 한 가지에 붙어있다. 다차원 배열을 병합하는 데 도움이 필요합니다.

먼저 계층이 있습니다. 다음은 주입니다 (모두 1 주일입니다). 그런 다음 팀 경기가 일치합니다.

Array 
(
[1] => Array 
    (
     [1] => Array 
      (
       [1] => Array 
        (
         [home] => Whalers 
         [visitor] => Lumberjacks 
        ) 

       [2] => Array 
        (
         [home] => Team America 
         [visitor] => Wolfpack 
        ) 

      ) 

    ) 

[2] => Array 
    (
     [1] => Array 
      (
       [1] => Array 
        (
         [home] => Warriors 
         [visitor] => Litchfield Builders 
        ) 

       [2] => Array 
        (
         [home] => Icemen 
         [visitor] => Nighthawks 
        ) 

      ) 

    ) 

[3] => Array 
    (
     [1] => Array 
      (
       [1] => Array 
        (
         [home] => The Freeze 
         [visitor] => Devils Rejects 
        ) 

       [2] => Array 
        (
         [home] => Cobras 
         [visitor] => New Haven Raiders 
        ) 

       [3] => Array 
        (
         [home] => Crusaders 
         [visitor] => Whalers 
        ) 

       [4] => Array 
        (
         [home] => Blizzard 
         [visitor] => CT Redlines 
        ) 

      ) 

    ) 

는)

나는 다음과 같이보고 최종 결과는 티어 드롭과 함께 모두 같은 주에 게임을 병합 할이 같은

Array 
    (
     [1] => Array 
      (
       [1] => Array 
        (
         [home] => Whalers 
         [visitor] => Lumberjacks 
        ) 

       [2] => Array 
        (
         [home] => Team America 
         [visitor] => Wolfpack 
        ) 

       [3] => Array 
        (
         [home] => Warriors 
         [visitor] => Litchfield Builders 
        ) 

       [4] => Array 
        (
         [home] => Icemen 
         [visitor] => Nighthawks 
        ) 

       [5] => Array 
        (
         [home] => The Freeze 
         [visitor] => Devils Rejects 
        ) 

       [6] => Array 
        (
         [home] => Cobras 
         [visitor] => New Haven Raiders 
        ) 

       [6] => Array 
        (
         [home] => Crusaders 
         [visitor] => Whalers 
        ) 

       [8] => Array 
        (
         [home] => Blizzard 
         [visitor] => CT Redlines 
        ) 

      ) 

    ) 
+0

이 문제에 대한 답변을 찾으십니까? 나는 팀 게임을위한 스케줄러와 비슷한 상황에서 일하고있다. 또한 내야 위치를 작업 중이다. – Jakub

답변

1

어쩌면 뭔가를?

<?php 
$teams = array(
    'Team 1', 
    'Team 2', 
    'Team 3', 
    'Team 4', 
    'Team 5', 
    'Team 6', 
    'Team 7', 
    'Team 8' 
); 

function getMatches($teams) { 
    shuffle($teams); 
    return call_user_func_array('array_combine', array_chunk($teams, sizeof($teams)/2)); 
} 

for ($i = 0; $i < 14; $i += 1) { 
    print_r(getMatches($teams)); 
} 

일정을 어떻게 정의 할 지 모르겠으니 조금 설명해 주시면 도와 드리겠습니다.

+0

감사합니다. 짝수 팀에게도 큰 영향을 미쳤습니다. 내 경우에는 때로는 홀수 개의 팀이 있습니다. 그 문제를 해결할 방법을 알고 있습니까? – Michele

+0

내가 틀린다면 정정 해 주겠다. 그러나 모든 팀이 같은 규칙으로 경기해야한다면 팀 수가 홀수가 될 경우 모든 팀이 같은 수의 경기를 치르는 것이 가능한가? – Yoshi

+0

1 대 2, 1 대 3, 2 대 3 - 총 3 경기, 팀당 2 경기. –

1

하나를 팝하고 임의로 지정하고 다른 하나를 팝합니다. 너의 게임이있다. 하나 남은 경우, 어떤 임의의 팀은 주력을하고이 개 게임이 주 재생할 수 있습니다

for ($week=1; $i<=$totalWeeksPlayed; $i++) 
{ 

    $games = 0; 
    $temp = $teams; 

    while (count($temp) > 1) 
    { 
    $team = array_shift($temp); 
    shuffle($temp); 
    $opponent = array_shift($temp); 
    $game[$week][$games] = $team . ' vs' . $opponent; 
    $games++; 
    } 

    if (count($temp) == 1) 
    { 
    $workhorses = $teams; 
    unset($workhorses[array_search($temp[0], $teams)); 
    shuffle($workhorses); 
    $team = $temp[0]; 
    $opponent = array_shift($workhorses); 
    $game[$week][$games] = $team . ' vs' . $opponent; 
    $games++; 
    } 

} 
+0

예를 들려 줄 수 있습니까? 감사. – Michele

+0

내 예제를 수정했습니다. 이상한 팀을 지원합니다. –

+0

나는이 질문을 다시했지만, 내가 필요한 것을 더 잘 설명해 주었다. 실제로 라운드 로빈 스케줄러가 필요합니다. 이 질문에 대한 피드백은 모두 도움이되었지만 필요한 것은 아닙니다. 오늘까지 그걸 몰랐어. 도와 주셔서 감사합니다! 다음은 내 새로운 질문입니다. http://stackoverflow.com/questions/6022446/help-with-round-robin-php-scheduling-script – Michele

0

이 팀의 테이블을 감안할 때, 팀 ( teamname ) 말을;

비품의 테이블

고정구 ( 일자 ); 재생

을 '재생'( fixture_date 분해 관계로

. 팀 이름 );

다음은 각 날짜를 반복하여 팀을 만들고 그 날짜에 아직 조명기가없는 팀을 임의로 선택하는 것입니다. 선택한 팀을 플레이하지 않았거나 선택한 팀을 플레이하지 않았습니다. 최근 팀).

간단한 해결책은 팀 [n] (여기서 n은 0 ... 팀 수 -1입니다)의 다양한 값에 대해 팀 [(n + (팀 수) % X]

+0

답변을 시도해 주셔서 감사합니다. 나는 당신의 대답을 이해하지 못한다. 그러나 나는 그 시도에 감사한다.중요한 질문을 빠뜨릴 수 있으므로 원래 질문에 대한 언급을 바꾸 었습니다. – Michele

1

아래 질문에서 복사하십시오.

만약 내가 틀린다면 정정 해주십시오.하지만 모든 팀이 같은 규칙으로 경기해야한다면, 홀수 개의 팀이 있다면 모든 팀이 같은 양의 게임을 할 수 있습니까? - 당신이 (16주 8 개 팀이 경우) 업을 페어링하려고하는 팀의 수는 매우 어려운 작업이 될 수 있습니다

15시 5분


미셸에서 요시 5월 3일 '11, "스케줄링 프로세스"의 시작일뿐입니다. 올바른 팀 페어링이 결정되면 배포 일정을 함께 모으기 시작한 것입니다. 다음으로, 4 주 타임 슬롯의 목록은; 요일, 시작 시간 및 전체 16 주 동안의 각 시간 슬롯에 대한 위치 이름. Comment : 가장 도움이되는 것은 균형이 잡힌 상대 팀홈 & away이있는 8 팀 스케줄링 매트릭스를 얻는 것입니다. 그것은 일정의 질에 큰 차이를 만듭니다. 이른 시간과 늦은 시간 슬롯을 균등하게 분배하고, 동등한 홈 & 부재 상태, 상대방과 동등한 팀 분포를 균등하게 분배하는 것이 중요합니다. 대부분의 균형은 균형 팀 쌍 매트릭스를 사용하여 수행됩니다.

보스턴 지역에서 35 년간의 교육, 코칭 및 스케줄링을 마친 후 다음 정보를 제공 할 수 있습니다. 스포츠 조직을위한 리그 또는 게임 일정을 만드는 것은 많은 사람들이 공유하는 결코 끝나지 않는 작업으로 보이며 참가자의 연령이 증가하고 리그를 운영하는 사람들이 변화함에 따라 일정을 만드는 것과 관련된 학습 곡선은 받아 들여라.

그렇다면 고도로 교육받은 수학적 마법사가 일정 문제를 해결할 완벽한 솔루션 (알고리즘)을 고안해 내는데 얼마나 많은 사람들이 참여했는지 놀랍습니다. 3 년 동안 자신과 친구 (수학/프로그래머 천재)는 4 ~ 22 개 팀의 일정을 만들 때 모든 중요한 구성 요소의 균형을 완벽하게 조정하는 소프트웨어를 만들었습니다. 우리가 배운 것은 균형 잡힌 일정을 생성하기 위해 일반 변수에 추가 할 수있는 모든 변수를 처리 할 수있는 알고리즘이 없다는 것입니다. 내가 말하고있는 것은 팀 매트릭스를리스트하는 상대방과 집 & 게임의 방문자 상태를 다루는 수학적 순열과 조합이 있기 때문에 "what ifs"만큼이나 있습니다.

예를 들어, 한 주에 4 경기를하는 9 팀 부문에 대해 완벽하게 균형 잡힌 일정을 만들어 보겠습니다. 9 주 만에 모든 팀이 8 게임을 뛰었고 모두 1 초를 보냈고 4 회의 타임 슬롯에서 모두 2 번 뛰었고 모두 4 번 홈 팀과 4 번 방문 팀으로 예정되어 있습니다.

더 많은 사람들이 무엇을 원할 수 있습니까? 이제는 재미가 있습니다. 당신이 선택한 4 개의 시간 슬롯에는 매주 토요일 2 경기, 매주 일요일 2 경기가 있기 때문에 첫 번째 문제가 발생합니다 (일정이 생성되고 게시 및 통과 된 후 2 팀의 코치 2 명이 전화를 걸어 토요일, 우리 게임을 일요일로 옮길 수 있습니까?물론, 나는 그것을 할 수있다. 나는 변경 사항을 만들고 일정을 다시 게시하고 다시 배포 할 것입니다.

새로운 일정이 배포 된 후 다른 코치가 전화를 걸어 "어이, 내 게임 중 일부를 토요일로 옮겼다. 나는 토요일에 일하고, 뒤로 움직여 라."라고 말합니다. 전화가 다시 울립니다. 이번에는 다른 팀의 코치이며 일정의 다섯 번째 주에 토너먼트에 참가하고 있으며 그 주일에는 경기를 할 수 없다고합니다. 마침내 마지막 콜은 또 다른 코치로부터옵니다. 그는 자신의 선수 중 한 명의 부모가 일요일 오후에 CCD 강습을 가르치고 팀의 절반이 CCD 강습을 갖고 있으며 일요일 경기를 모두 토요일로 옮기길 원한다고 말했다. 충분히!

내 요점은 당신이하는 일이나 일정에 관계없이 가장 좋은 해결책은 경기 일과 시간대를 일정에 지정하기 전에 플레이어/코치 팀의 제한이나 제한을 최대한 찾아내는 것입니다. 이러한 예측할 수없는 변수는 완벽한 스케줄을 엉망으로 만든다. 사람들은 바람직하지 않은 일정이 배포 될 때 화를 내고 불평을합니다. 일정이 충분하지 않을 때, 일부 학부모는 다음 해에 놀기 위해 자녀를 사인하지 않을 것입니다. 이것은 두세 명의 어린 자녀가있는 젊은 가정이 있고 아빠의 일이 자신의 능력을 제한 할 때 발생합니다. 이른 아침 게임이있을 때, 엄마의 어깨에 모든 것이 떨어질 때 엄마의 어려움을 볼 수 있다고 생각합니다.

일정이 잡히지 않은 사용자는 일정을 유지하십시오. 문제를 다루는 약간의 경험을 얻은 후에 시간이 지남에 따라 나아집니다. 팀 쌍을 계산하기 위해 일정 잡기 소프트웨어 프로그램을 구입하는 경우 조심하십시오. 그들이 만드는 일정에 대해 전체 단일 라운드 로빈을 보도록하십시오. 위에서 설명한 내용을 확인하십시오 (균형 및 분배에 관한 정보).

밥 R