}
}
}
}min = INFINITY;minI = 0;(int i = 0; i <= c_delete; i++){.push_back(Graph(*this));(i != c_delete){.at(graphs.size() - 1).deleteSymEdges(edges_delete[i][0], edges_delete[i][1]);(cfg.takeFirstGood == true && flag == false){.at(graphs.size() - 1).calculateO();
//graphs.at(graphs.size() - 1).calculateApproxO();(graphs.at(graphs.size() - 1).getO() < O){minII = (graphs.size() - 1) + i*(c_add + 1);a = minII % (c_add + 1);b = minII / (c_add + 1);iAdd = -1, jAdd = -1, iDelete = -1, jDelete = -1;(a != 0){= edges_add[a - 1][0];= edges_add[a - 1][1];
}(b != c_delete){= edges_delete[b][0];= edges_delete[b][1];
}(canDoAction(iAdd, jAdd, iDelete, jDelete, bestKnown.getO()) == true){= graphs.at(graphs.size() - 1).getO();= (graphs.size() - 1) + i*(c_add + 1);;
}
}
}
}(min < O && cfg.takeFirstGood == true){;
}index = graphs.size() - 1;(int j = 0; j < c_add; j++){.push_back(Graph(graphs.at(index)));.at(graphs.size() - 1).addSymEdges(edges_add[j][0], edges_add[j][1]);(cfg.takeFirstGood == true && flag == false){.at(graphs.size() - 1).calculateO();
//graphs.at(graphs.size() - 1).calculateApproxO();(graphs.at(graphs.size() - 1).getO() < O){minII = graphs.size() - 1 + i*(c_add + 1);a = minII % (c_add + 1);b = minII / (c_add + 1);iAdd = -1, jAdd = -1, iDelete = -1, jDelete = -1;(a != 0){= edges_add[a - 1][0];= edges_add[a - 1][1];
}(b != c_delete){= edges_delete[b][0];= edges_delete[b][1];
}(canDoAction(iAdd, jAdd, iDelete, jDelete, bestKnown.getO()) == true){= graphs.at(graphs.size() - 1).getO();= graphs.size() - 1 + i*(c_add + 1);;
}
}
}
}
/*if (cfg.takeFirstGood == false || flag == true){::parallel_for(size_t(0), size_t(graphs.size()), [&](size_t ind1){.at(ind1).calculateO();
});(flag == false){(int ind = 0; ind < graphs.size(); ind++){(graphs.at(ind).getO() < min){minII = ind + i*(c_add + 1);a = minII % (c_add + 1);b = minII / (c_add + 1);iAdd = -1, jAdd = -1, iDelete = -1, jDelete = -1;(a != 0){= edges_add[a - 1][0];= edges_add[a - 1][1];
}(b != c_delete){= edges_delete[b][0];= edges_delete[b][1];
}(canDoAction(iAdd, jAdd, iDelete, jDelete, bestKnown.getO()) == true){= graphs.at(ind).getO();= ind + i*(c_add + 1);
}
}
}
}{(int ind = 0; ind < graphs.size(); ind++){(graphs.at(ind).getO() < min && ((ind + i*(c_add + 1)) != (c_add + c_delete)) && O < graphs.at(ind).getO()){minII = ind + i*(c_add + 1);a = minII % (c_add + 1);b = minII / (c_add + 1);iAdd = -1, jAdd = -1, iDelete = -1, jDelete = -1;(a != 0){= edges_add[a - 1][0];= edges_add[a - 1][1];
}(b != c_delete){= edges_delete[b][0];= edges_delete[b][1];
}(canDoActionInTabu(iAdd, jAdd, iDelete, jDelete) == true){= graphs.at(ind).getO();= ind + i*(c_add + 1);
}
}
}
}
}*/(min < O && cfg.takeFirstGood == true){;
}
//cout << "step " << i << "/" << c_delete << endl;.clear();
}
//cout << "FLAG =" << flag << endl;(flag == true){a = minI % (c_add + 1);b = minI / (c_add + 1);(a != 0){t = addSymEdges(edges_add[a - 1][0], edges_add[a - 1][1]);
//cout << "ADD TABU - " << edges_add[a - 1][0] << "-" << edges_add[a - 1][1] << endl;ed;.start = edges_add[a - 1][0];.finish = edges_add[a - 1][1];.action = false;.numberOfSteps = cfg.numberOfTabuStep;(ed);_for_delete += t;_for_add -= t;
}(b != c_delete){t = deleteSymEdges(edges_delete[b][0], edges_delete[b][1]);
//cout << "DELETE TABU - " << edges_delete[b][0] << "-" << edges_delete[b][1] << endl;ed;.start = edges_delete[b][0];.finish = edges_delete[b][1];.action = true;.numberOfSteps = cfg.numberOfTabuStep;(ed);_for_delete -= t;_for_add += t;
}= false;();
//calculateApproxO();
//cout << "Current opt = " << O << endl;(int i = 0; i < c_add; i++)edges_add[i];[] edges_add;(int i = 0; i < c_delete; i++)edges_delete[i];[] edges_delete;
}{(min == INFINITY){();
//calculateApproxO();= true;(O < bestKnown.getO()){= (*this);
//cout << "Best was found at " << fails << " step!" << endl;= 0;
}{++;
}(int i = 0; i < c_add; i++)edges_add[i];(int i = 0; i < c_delete; i++)edges_delete[i];[] edges_add;[] edges_delete;.clear();
//cout << "Current opt = " << O << " Current number of fails = " << fails << endl;(fails == cfg.numberOfFails){
//cout << "FINISH ALL" << endl;
//bestKnown.save("Dir_" + to_string(bestKnown.getO()) + to_string(n) + "_" + to_string(m), "Out_RT_START_FROM_EMPTY.txt");
(*this) = bestKnown;;
}
}{= false;a = minI % (c_add + 1);b = minI / (c_add + 1);(a != 0){t = addSymEdges(edges_add[a - 1][0], edges_add[a - 1][1]);
//cout << "ADD - " << edges_add[a - 1][0] << "-" << edges_add[a - 1][1] << endl;(edges_add[a - 1][0], edges_add[a - 1][1], true);_for_delete += t;_for_add -= t;
}(b != c_delete){t = deleteSymEdges(edges_delete[b][0], edges_delete[b][1]);
//cout << "DELETE - " << edges_delete[b][0] << "-" << edges_delete[b][1] << endl;(edges_delete[b][0], edges_delete[b][1], false);_for_delete -= t;_for_add += t;
}(min);
//cout << "Current opt = " << O << endl;(int i = 0; i < c_add; i++)edges_add[i];[] edges_add;(int i = 0; i < c_delete; i++)edges_delete[i];[] edges_delete;
}
}.clear();
}
}Graph::deleteIfExist(int a, int b, bool flag){(int i = 0; i < strict.size(); i++){(strict[i].start == a && strict[i].finish == b && strict[i].action == flag){.erase(strict.begin() + i);;
}
}
}Graph::Algorithm(std::string config, int number_of_edges_add, int number_of_edges_delete, bool flag){file(config);(!file){<< "Error opening file! We will use standart configuration!" << endl;
}{trash;>> trash;>> trash;>> cfg.numberOfFails;>> trash;>> trash;>> cfg.numberOfTabuStep;>> trash;>> trash;>> cfg.takeFirstGood;
}n_of_ed = number_of_edges_add;number_of_adds = number_of_edges_delete;_of_ed = number_of_edges_add;_of_adds = number_of_edges_delete;
//cout << "Start tabu" << endl;(n_of_ed, number_of_adds);
//cout << "Finish tabu" << endl;<< "BEST = " << getO() << endl;(TYPE == -1){(flag == false){("new_Dir_" + to_string(n) + "_" + to_string(m), "Out_RT_START_FROM_EMPTY_" + to_string((int)getO()) + "WITH_L INFINITY_AND_TYPE_V_"+to_string(TYPE_V)+".txt");
}{("new_Dir_" + to_string(n) + "_" + to_string(m), "Out_RT_START_FROM_FULL_" + to_string((int)getO()) + "WITH_L INFINITY_AND_TYPE_V_"+to_string(TYPE_V)+".txt");
}
}{(flag == false){("new_Dir_" + to_string(n) + "_" + to_string(m), "Out_RT_START_FROM_EMPTY_" + to_string((int)getO()) + "WITH_L " + to_string(TYPE)+"_AND_TYPE_V_"+to_string(TYPE_V)+".txt");
}{("new_Dir_" + to_string(n) + "_" + to_string(m), "Out_RT_START_FROM_FULL_" + to_string((int)getO()) + "WITH_L " + to_string(TYPE)+"_AND_TYPE_V_"+to_string(TYPE_V)+".txt");
}
}.close();
}Graph::FindPathWithEdges(int a, int b){[a] = true;(a == b){[a] = true;;
}[a] = true;t = 0;* paths = new double[degree[a]];* indexes = new int[degree[a]];(int i = 0; i < v; i++){(arr[a][i] > 0){[i] = true;[t] = Distance(i, b);[t] = i;++;(t == degree[a]);
}
}minI = 0;minV = paths[0];(int i = 1; i < degree[a]; i++){(paths[i] < minV && inPath[indexes[i]] == false){= paths[i];= i;
}{(TYPE_V){0:(paths[i] == minV && inPath[indexes[i]] == false){(degree[indexes[i]] < degree[indexes[minI]]){= paths[i];= i;
}
};1:(paths[i] == minV && inPath[indexes[i]] == false){(degree[indexes[i]] > degree[indexes[minI]]){= paths[i];= i;
}
};2:(paths[i] == minV && inPath[indexes[i]] == false){(rand()%2 == 0){= paths[i];= i;
}
};
}
}
}[a][indexes[minI]] += 1;c = indexes[minI];[] paths;[] indexes;(c, b);;
}Graph::calculateOwithEdges(){* sum = new int[v];(int i = 0; i < v; i++){[i] = 0;(int j = 0; j < v; j++){(int t = 0; t < v; t++){[t] = false;
}(i, j);count = 0;(int t = 0; t < v; t++){[i] += inSearch[t];+= inSearch[t];[t] = false;
}
//cout << "For v = " << i << " serch to " << j << " = " << count << endl;
}
}s = 0.0;(int i = 0; i < v; i++){
//cout<<"i = "<< i << " sum = " << sum[i] << endl;+= sum[i];
}[] sum;= s;s;
}Graph::generateNewEdges(){s = 0;(int i = 0; i < v; i++)+= degree[i];p = (v*(v-1)/2-s/2)/2;::random_device rd; // only used once to initialise (seed) engine::mt19937 rng(rd()); // random-number engine used (Mersenne-Twister in this case)::uniform_int_distribution<int> uni(0,p); // guaranteed unbiasednum = uni(rng);(num > 0){i = rand()%v;j = rand()%v;(arr[i][j] != 0){= rand()%v;= rand()%v;
}t = addSymEdges(i, j);-= t;
}
}Graph::AlgorithmWithDeleteEdges(){= new int*[v];(int i = 0; i < v; i++) {[i] = new int[v];
}();t_o = this->O;best(*this);p = 0;(true){(int i = 0; i < v; i++){(int j = 0; j < v; j++){[i][j] = 0;
}
}();(this->O >= t_o && p != 0){best;
}{_o = this->O;= *this;
}++;<< "Bla = " << this->O << endl;(int i = 0; i < v; i++){(int j = 0; j < v; j++){<< edges[i][j] << " ";
}<< endl;
}<< endl;(int i = 0; i < v; i++){(int j = 0; j < v; j++){<< edges[i][j] << " ";
}<< endl;
}<< endl;min = INFINITY;(int i = 0; i < v; i++) {(int j = i; j < v; j++){(edges[i][j] != 0 && arr[i][j] == 2){(min > edges[i][j])= edges[i][j];
}
}
}(int i = 0; i < v; i++) {(int j = 0; j < v; j++){(edges[i][j] == min && arr[i][j] == 2){(i, j);
}
}
}
}
}
//babGraph::addEdge(int a, int b){(a >= 0 && b >= 0 && a < v && b < v){(arr[a][b] == 0){[a][b] = 2;[b][a] = 2;[a]++;[b]++;
}
}
}Graph::strictEdge(int a, int b){(a >= 0 && b >= 0 && a < v && b < v){(arr[a][b] == 0){[a][b] = -1;[b][a] = -1;
}
}
}Graph::unstrictEdge(int a, int b){(a >= 0 && b >= 0 && a < v && b < v){(arr[a][b] == -1){[a][b] = 0;[b][a] = 0;
}
}
}Graph::deleteEdge(int a, int b){(a >= 0 && b >= 0 && a < v && b < v){(arr[a][b] == 2){[a][b] = 0;[b][a] = 0;[a]--;[b]--;
}
}
}Graph::FindPathForBound(int a, int b){[a] = true;(a == b){[a] = true;;
}[a] = true;t = 0;* paths = new double[v];* indexes = new int[v];(int i = 0; i < v; i++){(arr[a][i] != -1){(arr[a][i] > 0)[i] = true;[t] = Distance(i, b);[t] = i;++;
}{[t] = INFINITY;[t] = i;++;
}
}minI = 0;minV = paths[0];(int i = 1; i < v; i++){(paths[i] < minV && inPath[indexes[i]] == false){= paths[i];= i;
}{(TYPE_V){0:(paths[i] == minV && inPath[indexes[i]] == false){(degree[indexes[i]] < degree[indexes[minI]]){= paths[i];= i;
}
};1:(paths[i] == minV && inPath[indexes[i]] == false){(degree[indexes[i]] > degree[indexes[minI]]){= paths[i];= i;
}
};2:(paths[i] == minV && inPath[indexes[i]] == false){(rand()%2 == 0){= paths[i];= i;
}
};
}
}
}next_vertix = indexes[minI];[] paths;[] indexes;(next_vertix, b);;
}Graph::LowBound(){* sum = new int[v];(int i = 0; i < v; i++){[i] = 0;(int j = 0; j < v; j++){(i, j);(int t = 0; t < v; t++){[i] += inSearch[t];[t] = false;[t] = false;
}
}
}s = 0;(int i = 0; i < v; i++){+= sum[i];
}[] sum;
//O = s / v;s;
}Graph::BranchAndBoundAddOne(Graph* bestBB, int step, double* bestO){lb = LowBound();
// for (int c = 0; c < step-1; c++){
// cout << "\t";
// }
// cout << "LB = " << lb << endl;(lb > (*bestO)){;
}
// if (step == 0){
// calculateO();
// if (O <= *bestO){
//
// if (O < *bestO){
// bestest.clear();
// }
// (*bestBB) = (*this);
// (*bestO) = O;
// bestest.push_back(*bestBB);
//
//
// }
// }start = -1;finish = -1;(int i = 0; i < v; i++){(int j = i + 1; j < v; j++){
//if ((i <= n*m / 2) && (i <= n/ 2 + i / n)){(arr[i][j] == 0){= i;= j;;
}
}(start == -1);
}(start == -1){();
/*if(O == 869){>save("Dir_For_BaB_" + to_string(n) + "_" + to_string(m), "Out_" + to_string(int(bestBB->getO()))+"_" + to_string(counter) + ".txt");++;
}*/
//calculateO();
// for (int c = 0; c < step; c++){
// cout << "\t";
// }
// cout << "Current O = " << O << endl;(O <= *bestO){(O < *bestO){
//cout << "OOOOOO = " << O << " BO = "<< bestO << endl;.clear();
}
(*bestBB) = (*this);
(*bestO) = O;.push_back(*bestBB);
//if(O == 869){
// bestBB->save("Dir_For_BaB_" + to_string(n) + "_" + to_string(m), "Out_" + to_string(int(bestBB->getO()))+"_" + to_string(bestest.size()) + ".txt");
//}
//bestBB->save("Dir_" + to_string(n) + "_" + to_string(m), "Out_" + to_string(int(bestBB->getO()))+".txt");
//cout << "Best O = " << bestBB->getO() << endl;
};
}
// for (int c = 0; c < step; c++){
// cout << "\t";
// }
// cout << "Best O = " << bestBB->getO() << endl;
// for (int c = 0; c < step; c++){
// cout << "\t";
// }
// cout << "ADD - " << start << " " << finish << endl;(start, finish);(bestBB, step + 1, bestO);
// for (int c = 0; c < step; c++){
// cout << "\t";
// }
// cout << "STRICT - " << start << " " << finish << endl;(start, finish);(start, finish);(bestBB, step + 1, bestO);(start, finish);
//return bestO;
}::~Graph()
{[] degree;(int i = 0; i < v; i++)arr[i];[] arr;[] inSearch;[] inPath;.clear();
}