Пример #1
0
// Read and create transportation network
void ReadTrans(vector<Node>& Nodes, vector<Arc>& Arcs, const char* fileinput) {
	// Create default nodes and arcs
	vector<string> DefNodes(0), DefFrom(0), DefTo(0), DefInf(0);
	Node TempNode;
	Arc TempArc;
	int NInfra = TransInfra.size(), NFleet = 0, NComm = TransComm.size(), k = 0;
	string Infra = "", Fleet = "", FleetInf = "", Comm = "", Coal = "";
	
	// Determine the number of fleet
	for (unsigned int i = 0; i < NInfra; ++i)
		NFleet += TransInfra[i].size()-1;
	
	vector< vector<bool> > NodeTable(0), ArcTable(0);
	vector<bool> TableColumn(NFleet, false);
	
	// For each line in the definition of infrastructures
	for (unsigned int i = 0; i < NInfra; ++i) {
		Infra.push_back(TransInfra[i][0]);
		
		// Create an arc (for infrastructure capacity constraints)
		DefFrom.push_back(TransInfra[i].substr(0,1) + TransInfra[i].substr(0,1));
		DefTo.push_back("XX");
		DefInf.push_back("");
		ArcTable.push_back(TableColumn);
		
		// For each fleet within that infrastructure
		for (unsigned int j = 1; j < TransInfra[i].size(); ++j) {
			// Create an arc (for fleet capacity constraints)
			DefFrom.push_back(TransInfra[i].substr(j,1) + TransInfra[i].substr(j,1));
			DefTo.push_back("XX");
			DefInf.push_back("");
			ArcTable.push_back(TableColumn);
			
			Fleet.push_back(TransInfra[i][j]);
			FleetInf.push_back(TransInfra[i][0]);
			
			ArcTable[ArcTable.size()-1][k] = true;
			ArcTable[ArcTable.size()-j-1][k] = true;
			k++;
		}
	}
	
	// For each commodity
	for (unsigned int i = 0; i < NComm; ++i) {
		Comm.push_back(TransComm[i][0]);
		DefNodes.push_back(TransComm[i].substr(0,1) + "T");
		NodeTable.push_back(TableColumn);
		
		for (unsigned int j = 1; j < TransComm[i].size(); ++j) {
			// Find for each fleet that the commodity can use
			k = Fleet.find(TransComm[i][j]);
			if (k >= 0) {
				// Create arc
				DefFrom.push_back(Fleet.substr(k,1) + Fleet.substr(k,1));
				DefTo.push_back(TransComm[i].substr(0,1) + "T");
				DefInf.push_back(FleetInf.substr(k,1) + FleetInf.substr(k,1));
				ArcTable.push_back(TableColumn);
				
				ArcTable[ArcTable.size()-1][k] = true;
				NodeTable[NodeTable.size()-1][k] = true;
			}
		}
	}
	
	char* t_read;
	char line[CHAR_LINE];
	int i = 0;
	
	TempNode.Set("Step", TransStep);
	TempArc.Set("FromStep", TransStep);
	TempArc.Set("ToStep", TransStep);
	
	FILE *file = fopen(fileinput, "r");
	if (file != NULL) {
		for (;;) {
			// Read a line from the file and finish if empty is read
			if (fgets(line, sizeof line, file) == NULL)
				break;
			
			// Remove comments and end of line characters
			CleanLine(line);
			
			// Skip first line, then read the rest
			if (i!=0) {
				string from, to, fleetlist, swap;
				vector<bool> ShowNode(NodeTable.size(), false), ShowArc(ArcTable.size(), false);
				int kk, swapindex;
				
				// Read from and to codes
				t_read = strtok(line,",");
				from = string(t_read);
				t_read = strtok(NULL,",");
				to = string(t_read);
				
				// Distance
				t_read = strtok(NULL,",");
				TempArc.Set("Distance", string(t_read));
				
				// Read allowed fleet and determine what nodes and arcs will be appropriate
				t_read = strtok(NULL,",");
				if (t_read == '\0') {
					fleetlist = "";
					
					for (unsigned int k1 = 0; k1 < ShowNode.size(); ++k1) ShowNode[k1] = true;
					for (unsigned int k1 = 0; k1 < ShowArc.size(); ++k1) ShowArc[k1] = true;
				} else {
					fleetlist = string(t_read);
					
					for (unsigned int k1 = 0; k1 < ShowNode.size(); ++k1) ShowNode[k1] = false;
					for (unsigned int k1 = 0; k1 < ShowArc.size(); ++k1) ShowArc[k1] = false;
					for (unsigned int k2 = 0; k2 < fleetlist.size(); ++k2) {
						kk = Fleet.find(fleetlist[k2]);
						if (kk >=0) {
							for (unsigned int k1 = 0; k1 < ShowNode.size(); ++k1) ShowNode[k1] = ShowNode[k1] || NodeTable[k1][kk];
							for (unsigned int k1 = 0; k1 < ShowArc.size(); ++k1) ShowArc[k1] = ShowArc[k1] || ArcTable[k1][kk];
						}
					}
				}
				
				// To account for both directions and avoid repetitions
				swapindex = 0;
				
				while ((swapindex==0) || ((swapindex==1) && (from!=to))) {
					for (unsigned int k1 = 0; k1 < ShowNode.size(); ++k1) {
						if (ShowNode[k1]) {
							TempNode.Set("ShortCode", DefNodes[k1] + from + to);
							Nodes.push_back(TempNode);
							
							//Coal to transportation
							if ((swapindex==0) && (from!=to) && (DefNodes[k1]!=TransDummy) && (DefNodes[k1][1]=='T')) {
								kk = TransCoal.find(DefNodes[k1][0]);
								if (kk >= 0) {
									// Check if nodes exist, if not it creates it
									bool fromexists = false, toexists = false;
									for (unsigned int k2 = 0; k2 < Nodes.size(); ++k2) {
										if (Nodes[k2].Get("ShortCode") == DefNodes[k1] + from)
											fromexists = true;
										else if (Nodes[k2].Get("ShortCode") == DefNodes[k1] + to)
											toexists = true;
									}
									if (!fromexists) {
										TempNode.Set("ShortCode", DefNodes[k1] + from);
										Nodes.push_back(TempNode);
									}
									if (!toexists) {
										TempNode.Set("ShortCode", DefNodes[k1] + to);
										Nodes.push_back(TempNode);
									}
									
									// Create arcs for coal transportation
									TempArc.Set("Energy2Trans", true);
									TempArc.Set("From", DefNodes[k1] + from);
									TempArc.Set("To", DefNodes[k1] + to);
									Arcs.push_back(TempArc);
									TempArc.Set("From", DefNodes[k1] + to);
									TempArc.Set("To", DefNodes[k1] + from);
									Arcs.push_back(TempArc);
									TempArc.Set("Energy2Trans", false);
								}
							}
						}
					}
					
					for (unsigned int k1 = 0; k1 < ShowArc.size(); ++k1) {
						if (ShowArc[k1]) {
							TempArc.Set("From", DefFrom[k1] + from + to);
							TempArc.Set("To", DefTo[k1] + from + to);
							TempArc.Set("TransInfr", DefInf[k1]);
							Arcs.push_back(TempArc);
						}
					}
					swap = from;
					from = to;
					to = swap;
					swapindex++;
				}
			}
			i++;
		}
		fclose(file);
	} else { printError("error", fileinput); }
}