2016-07-05 5 views
1

私はC#でこれを試しましたが、あまり成功しませんでした。だから私は現在SASで試しています。 EGセッションとSASコードを使用して、SASHELP.CLASSの学生リストを作成します。 これらの人はお互いを知り合い、毎月ランダムなペアリングをしてCoffee Dateに行きたいと思っています。SAS:コーヒーは誰ですか?

ルール: ランダムコーヒー日付リストは毎月生成されます。 毎月のペアリングを履歴データセットに保存します。履歴データセットは毎月追加します。

6か月以内に同一人物とコーヒーを飲むことはできません。だから我々は、3バールとの歴史的な目的のために別のデータセットを保つ: LastDate、InviterID、InvitedID

我々は唯一の目的を確認するために、一時データセットに直近6ヶ月のデータをロードしているの歴史的なリストに対して、各ペアリングを確認してください。

最近一致するペアが見つからない場合は、新しいペアが新しいペアデータセットに追加され、2つの名前(行)が元の参加者データセットから削除されます。

残念ながら、このリストには19人の人がいますので、新しい参加者を追加することができるまで1人が脱落します。コーヒークラブに参加することに興味のある人はいますか? :-)

だから私は、データセットから派生し、ID(N)で開始し、私はこれらの19人々はコーヒークラブで私の参加になります

Data Participants(Keep=ID Name); 
FORMAT ID 8.; 
set SASHelp.class; 
ID=_n_; 
run; 

名前を保持します。

私は多かれ少なかれ思考の行は、次のとおりです。

data _null_; 
randvar = ceil(rand('UNIFORM') * 100000); 
call symput('RANDSEED', randvar); 
run; 

data CR.names2(keep=MEMID randid); 
set CR.MasterNames; 
randid = rand('UNIFORM'); 
run; 

proc sort data=CR.names2 ; by randid; run; 

data CR.pairs(keep=pairgrp MEMID); 
set CR.names2 nobs=num_peeps; 
pairgrp+1; 
if pairgrp > floor(num_peeps/2) then pairgrp=1; 
run; 

proc sort data=CR.pairs; by pairgrp;run; 

proc transpose data=CR.pairs 
        out=CR.pairs2 (drop=_NAME_); 
    var memid; 
    by pairgrp; 

run; 

Data CR.Pairs3; 
set CR.pairs2; 
rename COL1=InviterID COL2=InvitedID; 
run; 

をしかし、私は、私は休みくださいとの助けを必要と :-(立ち往生...

誰が、このタイプのを行っていますランダムなペアリングが正常に終了しましたか?ここでわらを掴んでいます... 助けを歓迎します。

答えて

1

これは私の考えです。関連するイアン製品。また、私はその場合に別の行を追加することで奇数に騙されました。

  1. データを準備し、空の結果テーブルを生成します。
  2. 最近のペアリングを除くすべてのペアリング(組み合わせ)のリストを作成します。
  3. ランダムソートを行い、すべての要素が一度選択されるまでリストを降ります。
  4. 結果テーブルに追加します。

可能性のあるすべてのパートナーが既に選出されているため、ペアリングを取得しないメンバーが存在する可能性があるため、欠点があります。最大のペアリングが得られるまで反復することができないようにする。 編集:反復を追加しました。これで、誰もが一致するか、しきい値に達するまで、プログラムはランダムに描画を行います。

この問題は、おそらくIMLやRのようなマトリックス指向言語で実装する必要があります。

data Participants(Keep=ID Name) ; 
    set SASHelp.class nobs = num_peeps ; 
    ID=_n_ ; 
    output ; 
    if _n_ = 1 and mod(num_peeps,2) then do ; /* get even number of members: empty ID to pair with last participant*/ 
     name = 'empty' ; 
     id = 0 ; 
     output ; 
    end ; 
run ; 

data list_of_meetings ; 
    length iteration InviterID InvitedID 8. ; 
run ; 

/**** 
    iter = number of club meetings 
    hist = length of memory for pairings 
    tries = number of iterations to pair everyone 
****/ 
%macro loop_coffee (iter=, hist=6, tries= 10) ; 

    proc sql noprint ; 
     select max(0,max(iteration)) + 1 into :base 
      from list_of_meetings ; 
    quit ; 

%do i = &base. %to &iter. ; /* loop through number of meetings */ 

    proc sort data = list_of_meetings (where=(iteration >= &i - &hist)) out = lookup nodupkey ; by InviterID InvitedID ; run ; /* get memory of pairings */ 

    proc sql ; /* list all acceptable pairs */ 
    create table all_pairs as 
     select a.ID as InviterID, b.ID as InvitedID 
      from Participants a 
       inner join Participants b 
        on a.ID lt b.ID 
       left join lookup c /* exclude the memory */ 
        on a.ID eq c.InviterID and b.ID eq c.InvitedID 
      where c.InviterID is NULL ; 
    quit ; 

    %let j = 0 ; 
    %let all_pairs = 0 ; 
    %do %until (&all_pairs | &j > &tries) ; /* iterate and random sort until all members are paired */ 
     %let j = %eval(&j + 1) ; 

     data all_pairs; 
      set all_pairs; 
      randnum = ranuni(12345 + &i + &j); 
     run; 

     proc sort data = all_pairs ; by randnum ; run ; /* random sort */ 

     data out_pairs ; /* select the pairs: no. of IDs/2 */ 
      declare hash h() ; 
      h.defineKey("ID") ; 
      h.defineDone() ; 
      do until (eof1) ; 
       set Participants (keep= ID) end = eof1 ; 
       rc = h.add() ; /* populate list of members */ 
      end ; 
      do until (eof2) ; 
       set all_pairs (keep= InviterID InvitedID) end = eof2 ; 
       rc1 = h.check (key:InviterID) ; 
       rc2 = h.check (key:InvitedID) ; 
       if rc1 = 0 and rc2 = 0 then do ; 
        rc = h.remove (key:InviterID) ; /* delete member from list if paired */ 
        rc = h.remove (key:InvitedID) ; 
        output ; 
       end ; 
       if h.num_items = 0 then do ; 
        call symput('all_pairs', 1) ; 
        stop ; 
       end; 
      end ; 
      stop ; 
      keep InviterID InvitedID ; 
     run ; 

    %end ; 

    data list_of_meetings ; 
     set list_of_meetings (where=(iteration ne .)) 
      Out_pairs (in=pairs) ; 
     if pairs then iteration = &i. ; 
    run ; 

%end ; 
%mend ; 
%loop_coffee (iter=10,hist=6,tries=10) ; 
関連する問題