2017-06-21 3 views
0

私はこのコミュニティの新しいメンバーであり、Pythonの新しいユーザーです。繰り返しのない4つのグループの要素を組み合わせる

私はコンセプトレベルとコーディングレベルの両方で少し問題に直面しています。

私は8つの同一要素の11グループを持っています(実生活では、2つの綿パッドをそれぞれ4つに分けて、合計8個、11人のドナーに掛けました。すなわち臭気コレクション研究)、:

AAAAAAAA BBBBBBBB CCCCCCCC ... MMMMMMMM

私は4つの異なるドナー片、例えばを組み合わせることにより、超ドナーパッドを形成するために、今持っている

ABCD、ABCE、CDEFなど...新しい要素の4つの要素は、同じドナーからの要素を含むべきではありません(例えば、AABCまたはABDDは許されません)。そして、断片が使用されている場合はもちろん、別の超ドナーパッドを形成する。 手作業で頭を打つことなく、グループの形成を自動的に許可するものをコーディングして、そのカウントを失う危険がありました。

繰り返しのない組み合わせの場合ですか? 私は、上記のような行列を作成し、20個(必要な上ドナーパッドの数)の4要素の空のグループ(リスト?)を作成し、次にランダムに選択するループマトリックスのCij要素を空のリストに移動し、次に選択する要素に進みますが、それが以前のグループで選択されていない別のタイプとピースであることを確認します(たとえば、グループに同じ要素を別のグループで使用しないでください)。 4要素グループがいっぱいになり次の4要素グループに移動するまで続きます

私はこれを行う時間がほとんどないので、助けを求めています。そうでなければ、間違いを犯して学習しようとします。 提案がありますか?

EDIT:既に作成4-素子群を有するテーブルの例及び使用される様々な要素に使用される第8部の部品の数(それらの一部はもちろん、事前になり)

supra-donor pads

事前に洞察を提供していただき、ありがとうございます。

+1

いくつかのサンプル入力と期待される結果の例を挙げてください。私はitertools builtinsが十分かもしれないと思う。 –

+0

こんにちは@JackEvans、素早い応答のおかげで。あなたの質問に答えることができれば、結論のイメージを添付しました。もう一度お返事をください –

+0

あなたは各グループからほぼ同じに多くを選ぶという要件はありますか? – JohanL

答えて

0

ドナーのすべての可能な組み合わせを生成し、それらをシャッフルし、すべての反復で新しいものを選ぶソリューションです。拾い上げられたドナーのすべてのサンプルが既に使い尽くされているため、拾い上げられたドナーが有効でない場合、その組み合わせはドロップされ、新しいものが選択されます。

import itertools 
import random 

def comb_generator(bases, per_base, sought): 
    combs = list(itertools.combinations(bases, 4)) 
    random.shuffle(combs) 

    avail = {} 
    for base in bases: 
     avail[base] = per_base 

    comb_wanted = sought > 0 # Ensure picking at least one new comb 
    while comb_wanted: 
     comb = combs.pop() 
     comb_wanted = False 

     for base in comb: 
      comb_wanted = avail[base] <= 0 
      if comb_wanted: 
       break 

     if not comb_wanted: 
      for base in comb: 
       avail[base] -= 1 
      yield comb 
      sought -= 1 
      comb_wanted = sought > 0 

bases = 'ABCDEFGHIJKLM' 
per_base = 8 
sought = 20 

comb_gens = comb_generator(bases, per_base, sought) 

for i, comb in enumerate(comb_gens): 
    print('{:2}: {}'.format(i, comb)) 

見ることができるように私はそれがエントリでの作業にする場合、後でかなり有用であることを見つけるために、私は、発電機としてのソリューションを実装しています。

N.B.現在の解決策は、各ドナーからの同数のサンプルを保持することには関心がない。それはあまり変わらないように、異なるドナーの利用可能性に関する要件を追加することによって行うことができます。しかし、「デッキ」の後の位置に、廃棄された組み合わせが再挿入される複雑さが増します。

+0

これは素晴らしいです。どうもありがとうございます! –

関連する問題