2011-05-03 130 views
2

在得到一個新問題中提出這個問題的負面反饋...這是我修改後的問題。是的,這是我正在研究的項目,但我不清楚我是否需​​要基本上具有循環式調度程序。PHP隨機團隊時間表生成器 - 循環調度

我正在研究循環賽風格的曲棍球聯賽排程,需要一些幫助。

總體目標是最終管理員用戶能夠打入3個變量,並讓它執行循環羅賓式樣計劃,直到WEEKS計數器被擊中。以下是球隊數量和比賽週數的例子。

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

目標是讓它循環16次,每週製作4場比賽,每隊每週打1次。循環賽算法應該讓球隊每週都有不同的球隊,直到所有可能的組合都已經完成,但不超過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 2011-12-11 01:29:38

回答

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 2011-05-03 14:57:21

+0

如果我得到這個錯誤,糾正我,但是如果所有球隊都必須在同一時間進行比賽,那麼如果球隊數量是奇數,是否有可能讓所有球隊進行相同數量的比賽? – Yoshi 2011-05-03 15:05:32

+0

1對2,1對3,2對3 - 三場總比賽,但每隊出場2場。 – 2011-05-03 15:09:48

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 2011-05-03 14:58:27

+0

修正了我的例子 - 它支持奇怪的團隊。 – 2011-05-03 15:50:14

+0

我再次提出這個問題,但更好地解釋我需要什麼。我其實需要一個循環調度器。所有來自這個問題的反饋都非常有幫助,但不是我所需要的。直到今天我才意識到這一點。謝謝您的幫助!這是我的新問題: http://stackoverflow.com/questions/6022446/help-with-round-robin-php-scheduling-script – Michele 2011-05-16 19:56:59

0

鑑於球隊的表,說 隊( teamname );

和夾具的一個表

夾具( 日期; );

用 '播放'

播放( fixture_date分解的關係。 teamname );

然後,它只需要遍歷每個日期,然後團隊和隨機選擇一個團隊,該團隊尚未擁有該日期的固定裝置,並且沒有播放所選團隊(或未播放所選團隊團隊最近)。儘管更簡單的解決方案是讓團隊[n](其中n爲0 ...團隊數量-1)爲團隊[(n +(團隊數量))%X]

+0

謝謝你的答案。我不太瞭解你的答案,但我很欣賞這種嘗試。我重新提出了我原來的問題,因爲我可能遺漏了一個重要的注意事項。 – Michele 2011-05-16 20:10:46

1

下面的問題從上面複製而來。

如果我弄錯了,請糾正我,但是如果所有球隊都必須定期比賽,那麼如果隊伍數量奇數,是否有可能讓所有球隊都有相同數量的比賽? - 耀西5月3 '11在15:05


米歇爾,

你嘗試配對後(在這種情況下,8支球隊爲16周)的球隊的數量可以是一個艱鉅的任務,這只是「調度過程」的開始。一旦確定了正確的團隊配對,這只是將時間表放在一起進行分配的開始。接下來,每週4個時間表的列表包括:整週16周的每個時間段的開始時間和地點名稱。評論:對你最有幫助的是獲得一個8隊調度矩陣,其中有平衡對手主隊&客場狀態。它對時間表的質量有很大的影響。重要的是平均分配早期和晚期時間位置,等於主場狀態,並與對手平等分配球隊。大部分餘額是通過使用平衡的團隊對矩陣來完成的。

經過35年的教學,指導和調度波士頓地區的體育運動,我可以提供以下信息。制定體育組織的聯賽或比賽時間表似乎是許多人共享的永無止境的任務,並隨着參與者年齡的增長和聯盟運行的變化而反覆重複,與創建時間表相關的學習曲線對於那些接管。

有了這個說法,我很驚訝有多少受過高等教育的數學奇才參與試圖提出完美的解決方案(算法)來解決一個人的排班問題。在3年的時間裏,我和一位朋友(誰是數學/程序員的天才)創建了一個軟件,可以在爲4到22個團隊創建時間表時完美平衡所有重要組件。我們學到的是,沒有算法可以處理添加到常規變量中的所有可能變量以創建均衡的時間表。我所說的就是有很多「假設」,因爲有數學排列和組合可以處理創建一個團隊矩陣,列出對手和家庭遊戲的訪問者狀態。

例如:我們爲一個9人團隊每週玩4場比賽創建一個完美平衡的時間表。九個星期後,所有球隊都打了8場比賽,全部都有1場比賽,所有球隊在4個時間段內都打了兩次,而且所有球隊都被定爲主隊4次,而客隊則被定爲4次。

任何人都想要什麼?那麼現在好玩。因爲你選擇的4個時間段每個星期六有2場比賽,每個星期日有2場比賽,所以第一個問題就會彈出來(在時間表創建,發佈和傳出之後,來自2個不同團隊的2個教練打電話說他們星期六工作,你能把我們的比賽移到星期天嗎?當然,我可以做到這一點。我只會做出更改,重新發布並重新分配時間表。

幾天後,一個不同的教練打電話說:「嘿,你把我的一些比賽轉到星期六,我星期六工作......,把他們移回去」。電話再次響起。這一次,這是來自另一支球隊的教練,並表示他們在比賽的第五週參加了比賽,並且不能在那一週參加比賽。最後還有另一位教練打來電話。他說,他的一個球員的父母在星期天下午教CCD課程,他的一半隊伍正在CCD班,並希望將我們所有的週日比賽移動到週六。足夠!

我的觀點是無論你做什麼或者賽程有多完美,最好的解決方案是在你將比賽日期和時間分配給任何時間表之前,找出儘可能多的球員/教練團隊的限制或限制。這些不可預知的變數讓一個完美的時間表變得糟糕。當不合理的時間表分發時,人們會生氣並抱怨。如果時間表足夠糟糕,一些家長不會在第二年簽下年輕人。當你有一個擁有兩三個小孩的年輕家庭時,會發生這種情況,而爸爸的工作限制了他在那裏的能力。當有一個清晨的比賽時,我想你可以在媽媽的肩膀上看到困難。

對於那些不熟悉調度的人,請留下來。在獲得處理問題的經驗後,它會隨着時間的推移而變得更好。如果您購買計劃軟件程序來計算團隊對,請小心。堅持看到他們創造的時間表的完整循環。檢查上述內容(關於平衡和分配)。

Bob R