static void makeGraph(String filename) throws Exception { // the joys of reading files in Java
		System.out.println(filename);
		reader = new LineNumberReader(new FileReader(new File(filename)));
		String line = null;

		{ // on first run, set NUM_AGENTS and NUM_TASKS and perform checks (matrix is rectangular, etc.)
			int num_agents = 0;
			String[] tasks;
			while ((line = reader.readLine()) != null) {
				tasks = line.split("\t");	    
				if (num_agents == 0) { // set NUM_AGENTS and NUM_TASKS
					NUM_TASKS = tasks.length;
				} else {
					if (tasks.length != NUM_TASKS)
						throw new Exception("Matrix in " + filename + " isn't rectangular!");
				}
				// at termination the number of lines read in should reflect the number of agents
				num_agents = reader.getLineNumber();
			}
			NUM_AGENTS = num_agents;

		}

		reader.close();
		graph = new double[NUM_AGENTS][NUM_TASKS][3]; // use innermost array as holding <cost, capacity, pheromone>

		{ // now we actually build the graph
			reader = new LineNumberReader(new FileReader(new File(filename)));
			int i=0;
			while ((line = reader.readLine()) != null && i < NUM_AGENTS) {
				String[] assignment = line.split("\t");
				for (int j=0; j<NUM_TASKS; j++) {
					graph[i][j][0] = Double.parseDouble(assignment[j].split(",")[0]); // cost
					if (verbosity >= 2)
						System.out.println("cost = " + graph[i][j][0] + " (agent " + i + ", at task " + j + ")"); 
					graph[i][j][1] = Double.parseDouble(assignment[j].split(",")[1]); // capacity
					if (verbosity >= 2) 
						System.out.println("capacity = " + graph[i][j][1] + "  (agent " + i + ", task " + j + ")");
					graph[i][j][2] = 0; // pheromone
				}
				i++;
			}
		}

		reader.close();

	}