2017-08-18 11 views
2

私はこれを理解しようとしている年を探しました。私はボウリングブラケットを走らせるためのブラケットランニングシステムを構築しようとしています。重複のないペアリングのグループを生成する、PHPとmysql

私はID列とBowlerID列を持つテーブルを持っています。それをbowling_bracket_entriesと呼んでください。 IDはユニークですが、同じBowlerIDのエントリが8〜1個の範囲で複数存在することがあります。私がしたいのは、BowlerIDの行からペアを作ることですが、同じペアを繰り返すことはありません。それらのペアリングから、4組のグループに入れ、BowlerIDは4組のグループ内で繰り返されません。

ボーリングの構造。ブラケットのエントリテーブル ID | BowlerID

766 151 
767 230 
768 201 
769 202 
770 140 
771 205 
772 62 
773 75 
774 56 
775 140 
759 129 
760 60 
761 165 
762 223 
763 145 
764 131 
765 145 
704 197 
705 230 
706 202 
707 167 
708 223 
709 205 
710 217 
711 217 
712 56 
713 60 
714 141 
715 60 
716 193 
717 181 
718 217 
719 75 
720 218 
721 151 
722 223 
723 202 
724 197 
725 140 
726 220 
727 203 
728 56 
729 62 
730 218 
731 160 
732 205 
733 141 
734 167 
735 165 
736 151 
737 205 
738 224 
739 203 
740 142 
741 181 
742 60 
743 60 
744 218 
745 217 
746 224 
747 160 
748 218 
749 223 
750 203 
751 193 
752 202 
753 62 
754 60 
755 142 
756 201 
757 151 
758 203 

私は、変数を作成し、次のペアリング(すなわち36〜92)を引き、ランダムに2つのBowlerID年代を選択し、ペアリングテーブルに挿入、その後、(すなわち22〜100)区切り文字でそれらを一緒に入れてみましたそのペアの逆(つまり92〜36)を探し、ペアリングテーブルに一致する値がないか見つからない場合は挿入し、EntriesテーブルからそれらのBowlerIDのIDを削除し、値が不足するまで繰り返す。問題は時々私はBowlerIDを自分自身とペアにすることです。時には、私はBowlerIDが自分自身とペアになっていない完全なリストを得るでしょう。

SELECT bracket_entries.ID, bracket_entries.BowlerID FROM bracket_entries ORDER BY rand() LIMIT 2 

そして、それらを一緒に入れて、ペアリングを作成する(すなわち36〜68)

$i = 0; 
    while($pairing=$rsNewPair->fetch_assoc()) { 
     //Build Pairing List 
     $thisPairing .= $pairing['BowlerID']; 
     $IDS .= $pairing['ID']; 
     $i++; 
      if($i < 2){ 
       $thisPairing .= "~"; 
       $IDS .= "~"; 
      } 
     } 


$flipFlop = explode('~', $thisPairing); 
    $reversePairing = $flipFlop[1].'~'.$flipFlop[0]; 
    if($flipFlop[0] == $flipFlop[1]){ 
     header("Refresh:0"); 
    } 

そして、そこにすでにあるものと比較します。

SELECT bracket_pairings.Pairing FROM bracket_pairings WHERE bracket_pairings.Pairing = '".$thisPairing."' OR bracket_pairings.Pairing = '".$reversePairing."'" 

それが何かを見つけるしない場合は、ペアリングテーブルにペアリングを挿入し、bracket_pairingsから次の2

bowling_bracket_pairingsテーブル構造

1 203~218 
2 193~218 
3 217~129 
4 201~60 
5 60~141 
6 141~165 
7 197~202 
8 230~203 
9 220~167 
10 60~62 
11 151~140 
12 151~230 
13 193~205 
14 60~140 
15 217~223 
16 203~142 
17 60~205 
18 197~151 
19 205~201 
20 218~62 
21 56~223 
22 217~167 
23 56~202 
24 217~75 
25 224~223 
26 160~203 
27 151~60 
28 131~145 
29 140~205 
30 202~75 
31 62~160 
32 142~181 
33 224~181 
34 145~223 
35 165~56 
36 218~202 

SELECT 
PairingID, SUBSTRING_INDEX(Pairing, '~', 1) AS entry1, 
SUBSTRING_INDEX(SUBSTRING_INDEX(Pairing, '~', 2), '~', -1) AS entry2 

に移動

次に、whileループを使用してペアを括弧で表示し、各エントリを4つのペアの配列に押し込んでいっぱいになるまで押し込み、次に比較してユーザーは重複しません。

while(($pairings=$rsEntries->fetch_assoc())&&($loop < 5)){ 
    $thisBowlerID1 = $pairings['entry1']; 
    $thisBowlerID2 = $pairings['entry2']; 

    if((!in_array($thisBowlerID1, $thisBracket)) || (!in_array($thisBowlerID2, $thisBracket))){ 
    while($players=$rsPlayers->fetch_assoc()){ 
      if($players['BowlerID'] == $thisBowlerID1){ 
       echo $players['BowlerID'].'<br>'; 
       //echo $players['Name'].'('.$players['CurrentAvg'].')<br>'; 
      } 
    } mysqli_data_seek($rsPlayers, 0); 
    array_push($thisBracket, $thisBowlerID1); 

    while($players=$rsPlayers->fetch_assoc()){ 
     if($players['BowlerID'] == $thisBowlerID2){ 
      echo $players['BowlerID'].'<br><br>'; 
      //echo $players['Name'].'('.$players['CurrentAvg'].')<br><br>'; 
    } 
    } mysqli_data_seek($rsPlayers, 0); 
    array_push($thisBracket, $thisBowlerID2); 

    $removeSQL="DELETE FROM bracket_pairings WHERE bracket_pairings.PairingID = ".$pairings['PairingID']; 
    $removePairing = $connAdmin->query($removeSQL); 
    $loop++; 
    } 
    $thisBracket = array(); 
} 
} 

私は、私は4(8個のエントリ)のグループに入れしようとすると、9つのブラケットを埋めるように見えることはありません72個のエントリを持っているだけで約7.5、その後に左のペアのランダムな組み合わせを残しますテーブルは配置されていないが、まだ私は開口部を持っています。

Bracket 1 
62 
141 

142 
151 

131 
218 

140 
56 

Bracket 2 
145 
201 

193 
160 

56 
205 

129 
203 

Bracket 3 
167 
75 

217 
201 

224 
217 

230 
140 

Bracket 4 
60 
193 

203 
197 

141 
167 

223 
220 

Bracket 5 
60 
165 

202 
142 

181 
60 

202 
202 

Bracket 6 
205 
140 

62 
218 

217 
60 

230 
223 

Bracket 7 
165 
223 

205 
218 

205 
75 

56 
151 

Bracket 8 
202 
203 

あなたは結果を見ることができるように

結果は8未充填のままにしておきます。すべての5つ目はスキップされた理由

5 197~218 
10 60~223 
15 181~62 
20 203~60 
25 160~217 
30 151~151 
35 145~224 

わからない:ここで

は、その含まれていませんでした上で残っているものです。私は正しい方向に進んでいると思いますが、私が持っている問題を解決する方法を理解するための助けやアイデアは素晴らしいでしょう。

+0

あなたの質問を編集して、あなたのテーブル 'Entries'と' Pairing'の完全なテーブル仕様を含んでいるようにしてください。特にあなたが 'UserID'カラムについて話しているが、あなたのクエリは代わりに' BracketId'を使うからです。また、テーブル名は、説明とSQLクエリの間で同じではないようです。また、72個のエントリの完全な例と、それらを9括弧で記入する方法を追加してください。 72の初期エントリがどのように満たされるのかを説明します。たぶん、同じ72の項目を持つ9つの括弧の中に別の詰め物が表示されているかもしれませんが、それは間違ってペアになっています(そしてその行にマークを付けます)。 – Progman

+1

私は質問を更新しました。うまくいけば、少し良くなっていることが分かりました。助けてくれてありがとう – user3338040

答えて

0

大丈夫、最初: "203〜60"のような文字列としてペアリングを保存しないでください。常に値を結合/分割する必要がある場合は、データベースを扱うのが難しくなります。テーブルは3NFにする必要があります。

第2:まだペアリングを構築しているときにペアリングをデータベースに保存しないでください。ペアリングが既に追加されているかどうかを確認するために、不必要なデータベース呼び出しを避けるためにPHPのメモリに保存してください。

あなたの問題を調べることができるアルゴリズムがいくつかあります。 softwareengineering.stackexchange.com上

私はいくつかのアルゴリズムを考えることができますが、状況によっては失敗します。アルゴリズムは次のように動作します。 https://en.wikipedia.org/wiki/Round-robin_tournament#Scheduling_algorithmのアルゴリズムを使用して、それぞれ8人のメンバーを持つ9チームのスケジューリングを作成します。それらを "a"〜 "i"と呼んでみましょう。ペアは次のようになります。

abcd aibc ahib aghi afgh 
hgfe gfed fedc edcb dcbi 

aefg adef acde bcfg 
cbih bihg ihgf dehi 

あなたが所定の位置に「」チームを保持することによって、この播種を取得し、テーブル/ペアの周りに残りのチームを回転させます。しかし、あなたは4 * 2の可能なシードのための9つのチームを持っているので、あなたは1つのチームをスキップする必要があります。 9番目のグループでは、 "a"チームがなく、 "b"から "i"の残りのシードが含まれています。

我々は8人のメンバーとこれらの9つのチームを持っている場合は、それぞれ、彼らがこのように表すことができます

aaaaaaaa 
bbbbbbbb 
cccccccc 
dddddddd 
eeeeeeee 
ffffffff 
gggggggg 
hhhhhhhh 
iiiiiiii 

あなたは以上の9つのチームを持っている場合、あなたは彼らが1つの擬似に一緒に属しているようにそれらを一緒にペアリングしてみてくださいサイズ8のチームは、これは、このように見えたことができます。

aaaaaabb 
ccccddde 
fffffggg 
hhiijjjj 
kkkkklll 
mmmmnnnn 
ooopppqq 
rrrrrsss 
ttuuvvww 

これらのチームは、「同じ」疑似チームになりますので、彼らはお互いに一致しないとアルゴリズムはまだ動作します。

:あなたはサイズ8の疑似チームでチームを置くことができないとき

しかし、アルゴリズムは失敗しますが
擬似チームは次のようになり8人のメンバーとサイズ7の8つのチームの2つのチームを持っていると仮定します

aaaaaaaa 
bbbbbbbb 
cccccccj 
dddddddj 
eeeeeeej 
fffffffj 
gggggggj 
hhhhhhhj 
iiiiiiij 

最終的に、行 "c"の "8番目の"プレイヤーは、行 "d"の "8番目の"プレイヤーと対戦するかもしれないが、実際には同じチームにいる。行 "c"の "8番目の"プレイヤーを "c"行の別の場所に移動させるのは難しいかもしれません。しかし、あなたがこの修正の道にいるときは、とにかく代わりにバックトラッキングアルゴリズムを使うことができます。

バックトラックすると、すべての組み合わせが強制的に強制終了され、解決策が機能しないことがわかったときに組み合わせがスキップされます。上記のURLをチェックして、バックトラックを理解してください(アニメーションgifが役に立つかもしれません)。

関連する問題