在不递归的情况下解析此函数以使用并行性

时间:2015-05-29 14:38:08

标签: recursion mpi jcuda

我试图优化一个过程,即计算所有可能的玩家组合以形成分区。为了解我的问题,我使用以下示例。

例如,我们有一组玩家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}}
   }

0 个答案:

没有答案