Материал: Алгоритм, эвристически строящий оптимальный граф для задачи децентрализованного поиска

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

}

}

}

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

}