public String[] runGibbs(String[][] labels, double[][][] adiacMaps)
	{
		//Build initial alignment
		int[] alignment=new int[labels.length];
		int i=0, j=0;
		for(i=0;i<alignment.length;i++)
		{
			int row=random.nextInt(labels[i].length);
			alignment[i]=row;
		}
		
		//Start gibbs sampling
		int indIter=0;
		double bestScoreAlign=getScoreAlignment(alignment,labels,adiacMaps);
		int[] bestAlign=new int[alignment.length];
		for(i=0;i<alignment.length;i++)
			bestAlign[i]=alignment[i];
		for(indIter=0;indIter<numIter;indIter++)
		{
			int indexSost=random.nextInt(alignment.length);
			double[] probs =computeLR(alignment, indexSost, labels, adiacMaps);
			int[] probs_ids=new int[probs.length];
			for(i=0;i<probs_ids.length;i++)
				probs_ids[i]=i;
			insertionSort(probs, probs_ids);
			alignment[indexSost]=sample(probs,probs_ids);
			double scoreAlign=getScoreAlignment(alignment,labels,adiacMaps);
			if(scoreAlign>bestScoreAlign)
			{
				bestScoreAlign=scoreAlign;
				for(i=0;i<alignment.length;i++)
					bestAlign[i]=alignment[i];
			}
		}
		//Return the final alignment
		String[] finalAlign=new String[alignment.length];
		for(i=0;i<finalAlign.length;i++)
			finalAlign[i]=labels[i][bestAlign[i]];
		return finalAlign;
	}