ExecuteInfo multipleRuns(){  //the process which is called by the main function of SingleSourceKDiverseShortPath
		long timeStart = System.currentTimeMillis();
		int numItr = 0;
		long maxHeap = 0;
		long timeToReadMem = 0;
		
		Random aRandom = new Random();

		while(numNodesFoundKDivPath < numNodes){  
			int numDeletedEdges = 0;
			ExecuteInfo stats = this.flowStart();  //start K shortest paths algorithm
			maxHeap = Math.max(stats.maxHeap, maxHeap);
			timeToReadMem += stats.timeToReadMem;
			
			for(int i=0; i < numNodes ; i++){
				importances[i].initialize(); 
			}
			//delete edges according to the counts of edges
			for(int i=0; i<numNodes; i++)
				for(int j=0; j < directEdges[i].size(); j++){
					int count = directEdges[i].elementAt(j).count;
					if(count > SingleSourceKDiverseShortPaths.KShortestPaths / 2){  //only count / SingleSourceKDiverseShortPaths.KShortestPaths > 1/2 would be deleted
						float prob = (float)count / SingleSourceKDiverseShortPaths.KShortestPaths;
						if(aRandom.nextFloat() < prob){
							this.deleteDirectEdge(i,j);
							j--;
							numDeletedEdges++;
						}
					}
				}
			//System.out.println("number of delete edges:"+numDeletedEdges);
			//the count of each node is initialized to 0;
			for(int i=0; i<numNodes; i++)
				for(int j=0; j < directEdges[i].size(); j++)
					directEdges[i].elementAt(j).count = 0;
			
			numItr++;
			if( numDeletedEdges < (double)numEdges/numNodes)  //if there are no deleted edges in this iteration, convergence and so stop the iteration
				break;

		}
//		System.out.println("total iterations:"+numItr);
		ExecuteInfo result = new ExecuteInfo((System.currentTimeMillis()-timeStart-timeToReadMem)/1000F, numItr);
		result.maxHeap = maxHeap;
		return result;
	}