// 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); } }