我正在尝试优化一个过程,即计算所有可能的玩家组合以形成分区。为了理解我的问题,我使用以下示例。
例如我们有一组玩家N = {1,2,3,4,5}
,这些玩家是这样重新组合的{1,2},{3,4},{5}
。这意味着玩家 1 将与玩家 2 作为单人玩家一起玩,依此类推。每组玩家都有一套策略或选择。每个玩家选择他想所属的组,例如:组{1,2}
有这些可能性{{1,2};{1,2,3,4}}
;即玩家{1,2}
要么选择呆在一起,要么加入团队{3,4}
。其余玩家的解释相同:
{3,4}=>{{3,4};{3,4,5};{1,2,3,4}}
{5}=>{{5};{3,4,5}}
现在,选择相同策略的玩家群体将组成一个新的群体(联盟)。例如,组{1,2}
选择策略,{1,2,3,4}
即玩家{1,2}
想与玩家组成一个新组{3,4}
。玩家{3,4}
选择策略{3,4,5}
,玩家{5}
选择策略{3,4,5}
。选择相同策略的玩家将被分组在一起,形成玩家的最终分区,如下所示:{1,2},{3,4,5}
; 玩家{3,4,5}
选择了相同的策略,所以他们被分组在一起,玩家{1,2}
选择了不同的策略,所以他们独自一人。我将此过程编程为递归函数,以获取所有允许的玩家分区。这里的另一个问题是:我的函数会生成所有可能的分区,而我只得到需要大量时间的可接受的分区。
现在我的问题是是否可以在不使用递归函数的情况下解决这个问题;即以顺序形式使用JCUDA 的并行性,尤其是当我们有很多玩家和如此多的分区时。这里的理想解决方案是 MPI 还是 JCUDA?
import java.util.ArrayList;
import java.util.Hashtable;
public class Partitions {
public Hashtable<ArrayList<Integer>, ArrayList<ArrayList<Integer>>> HashTab = new Hashtable<ArrayList<Integer>,ArrayList<ArrayList<Integer>>>(); // The key is the chosen strategy(coalition) and the value is the group of players have chosen the same coalition(strategy).
// create partitions combination
public void CalculStrategiesCombination (int index, ArrayList<ObjectsCoalitions> PlayerCoalitions, int K,int L) {
index = index +1;
if(index < PlayerCoalitions.size()) {
for(int j =0; j< PlayerCoalitions.get(index).Coaltions.size(); j++) {
if(!this.HashTab.containsKey(PlayerCoalitions.get(index).Coaltions.get(j))) {
ArrayList<ArrayList<Integer>> e = new ArrayList<ArrayList<Integer>>();
e.add(PlayerCoalitions.get(index).Objects);
this.HashTab.put(PlayerCoalitions.get(index).Coaltions.get(j), e);
} else {
this.HashTab.get(PlayerCoalitions.get(index).Coaltions.get(j)).add(PlayerCoalitions.get(index).Objects);
}
if(this.HashTab.size()<K) {
CalculStrategiesCombination (index, PlayerCoalitions,K,L);
}
if(this.HashTab.get(PlayerCoalitions.get(index).Coaltions.get(j)).size()==1) {
this.HashTab.remove(PlayerCoalitions.get(index).Coaltions.get(j));
} else {
this.HashTab.get(PlayerCoalitions.get(index).Coaltions.get(j)).remove(this.HashTab.get(PlayerCoalitions.get(index).Coaltions.get(j)).size()-1);
}
}
} else {
// Treatment.......
}
}
}
public class ObjectsCoalitions {
public ArrayList<Integer>Objects = new ArrayList<Integer>(); // for example Objects = {1,2}
public ArrayList<ArrayList<Integer>> Coaltions = new ArrayList<ArrayList<Integer>> (); // coalitions (strategis)={{1,2};{1,2,3,4}}
}