我想一羣人分成更小的子組,洗牌組多次爲歷屆會議之後,讓所有的人滿足對方在至少一次。分組的人多次,所有的成員達到同組彼此至少一次
- 在每個會話中,人們被劃分爲固定數量的小組。每個人都必須加入一個小組。
- 組的大小應該是最接近於(人數)/(組數)。不應該有一羣人太少或太多人。
- 會議持續進行,直到每對人至少遇見一次。
- 優選地,同一對彼此相遇的次數應該被最小化。
以下是11人(編號0-10)和3組(3列)的此問題的答案。它需要5個會話。
Session 1: 3,6,8,10 0,1,7,9 2,4,5
Session 2: 3,5,7,8 0,1,2,10 4,6,9
Session 3: 0,1,6,8 2,3,4,9 5,7,10
Session 4: 0,3,5,9 1,4,8,10 2,6,7
Session 5: 1,3,5,6 2,8,9,10 0,4,7
Members of two groups of different size must meet each other (1v1, once)
上面的問題是相似的,但我想寧可讓人們見面只是在一個組一個更大的羣體,而不是1對1的。
,以下是我的做法是使用合金。這適用於少數人(〜15)和組(〜2),但當尺寸增加時,它很快會導致計算時間爆炸。我需要爲〜25個人和〜5個團隊計算它。
module Teaming
sig Person { groups: some Group }
sig Group { people: some Person }
sig Session { groups: some Group }
one sig Sessions { sessions: some Session }
sig GroupPerSession {}
-- Tree structures
fact {
all s: Session | s in Sessions.sessions
all g: Group | g in Session.groups
all s: Session | all p:Person | p in s.groups.people
people =~ groups
}
-- The total number of people
fact {
all s: Session | #s.groups.people = #Person
}
-- The number of groups per session
fact {
all s: Session | #s.groups = #GroupPerSession
}
-- The number of people in a group
fact {
all g: Group | (#g.people) >= div[#(Person), #(GroupPerSession)] and (#g.people) <= add[div[#Person,#GroupPerSession],1]
}
-- Mutually exclusive grouping in a session
fact separate {
all s: Session | all disj a,b: s.groups | no p: Person | p in a.people and p in b.people
}
-- Every pair of people meets somewhere
pred sameGroup {
all disj a,b: Person | some g: Group | a in g.people and b in g.people
}
-- The same people should not meet too many times
fact sameGroupNotTooMuch {
all disj a,b: Person | #{a.groups & b.groups} <= 3
}
run sameGroup for 6 Int, 5 Session, 15 Group, exactly 3 GroupPerSession, exactly 16 Person
run sameGroup for 6 Int, 6 Session, 24 Group, exactly 4 GroupPerSession, exactly 18 Person
run sameGroup for 6 Int, 7 Session, 35 Group, exactly 5 GroupPerSession, exactly 18 Person
我想動態編程應該可以工作,但我找不到任何具體的東西。 Alloy代碼或其他算法的改進指針會很棒。