Алгоритм, эвристически строящий оптимальный граф для задачи децентрализованного поиска
Задача об оптимальном графе для децентрализованного поиска. Жадный алгоритм. Модель Клайнберга. Математическая модель. Алгоритмы решения. Алгоритм локального поиска. Табу алгоритм. Метод ветвей и границ. Выбор между одинаковыми соседями. Стартовый граф.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 23.10.2016 |
Размер файла | 4,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
if (this->O >= t_o && p != 0){
return best;
}
else{
t_o = this->O;
best = *this;
}
p++;
cout << "Bla = " << this->O << endl;
for(int i = 0; i < v; i++){
for(int j = 0; j < v; j++){
cout << edges[i][j] << " ";
}
cout << endl;
}
cout << endl;
for(int i = 0; i < v; i++){
for(int j = 0; j < v; j++){
cout << edges[i][j] << " ";
}
cout << endl;
}
cout << endl;
int min = INFINITY;
for (int i = 0; i < v; i++) {
for (int j = i; j < v; j++){
if (edges[i][j] != 0 && arr[i][j] == 2){
if (min > edges[i][j])
min = edges[i][j];
}
}
}
for (int i = 0; i < v; i++) {
for (int j = 0; j < v; j++){
if (edges[i][j] == min && arr[i][j] == 2){
deleteSymEdges(i, j);
}
}
}
}
}
//bab
void Graph::addEdge(int a, int b){
if (a >= 0 && b >= 0 && a < v && b < v){
if (arr[a][b] == 0){
arr[a][b] = 2;
arr[b][a] = 2;
degree[a]++;
degree[b]++;
}
}
}
void Graph::strictEdge(int a, int b){
if (a >= 0 && b >= 0 && a < v && b < v){
if (arr[a][b] == 0){
arr[a][b] = -1;
arr[b][a] = -1;
}
}
}
void Graph::unstrictEdge(int a, int b){
if (a >= 0 && b >= 0 && a < v && b < v){
if (arr[a][b] == -1){
arr[a][b] = 0;
arr[b][a] = 0;
}
}
}
void Graph::deleteEdge(int a, int b){
if (a >= 0 && b >= 0 && a < v && b < v){
if (arr[a][b] == 2){
arr[a][b] = 0;
arr[b][a] = 0;
degree[a]--;
degree[b]--;
}
}
}
void Graph::FindPathForBound(int a, int b){
inPath[a] = true;
if (a == b){
inSearch[a] = true;
return;
}
inSearch[a] = true;
int t = 0;
double* paths = new double[v];
int* indexes = new int[v];
for (int i = 0; i < v; i++){
if (arr[a][i] != -1){
if (arr[a][i] > 0)
inSearch[i] = true;
paths[t] = Distance(i, b);
indexes[t] = i;
t++;
}
else{
paths[t] = INFINITY;
indexes[t] = i;
t++;
}
}
int minI = 0;
double minV = paths[0];
for (int i = 1; i < v; i++){
if (paths[i] < minV && inPath[indexes[i]] == false){
minV = paths[i];
minI = i;
}
else{
switch(TYPE_V){
case 0:
if (paths[i] == minV && inPath[indexes[i]] == false){
if (degree[indexes[i]] < degree[indexes[minI]]){
minV = paths[i];
minI = i;
}
}
break;
case 1:
if (paths[i] == minV && inPath[indexes[i]] == false){
if (degree[indexes[i]] > degree[indexes[minI]]){
minV = paths[i];
minI = i;
}
}
break;
case 2:
if (paths[i] == minV && inPath[indexes[i]] == false){
if (rand()%2 == 0){
minV = paths[i];
minI = i;
}
}
break;
}
}
}
int next_vertix = indexes[minI];
delete[] paths;
delete[] indexes;
FindPathForBound(next_vertix, b);
return;
}
double Graph::LowBound(){
int* sum = new int[v];
for (int i = 0; i < v; i++){
sum[i] = 0;
for (int j = 0; j < v; j++){
FindPathForBound(i, j);
for (int t = 0; t < v; t++){
sum[i] += inSearch[t];
inSearch[t] = false;
inPath[t] = false;
}
}
}
int s = 0;
for (int i = 0; i < v; i++){
s += sum[i];
}
delete[] sum;
//O = s / v;
return s;
}
void Graph::BranchAndBoundAddOne(Graph* bestBB, int step, double* bestO){
double lb = LowBound();
// for (int c = 0; c < step-1; c++){
// cout << "\t";
// }
// cout << "LB = " << lb << endl;
if (lb > (*bestO)){
return;
}
// if (step == 0){
// calculateO();
// if (O <= *bestO){
//
// if (O < *bestO){
// bestest.clear();
// }
// (*bestBB) = (*this);
// (*bestO) = O;
// bestest.push_back(*bestBB);
//
//
// }
// }
int start = -1;
int finish = -1;
for (int i = 0; i < v; i++){
for (int j = i + 1; j < v; j++){
//if ((i <= n*m / 2) && (i <= n/ 2 + i / n)){
if (arr[i][j] == 0){
start = i;
finish = j;
break;
}
}
if (start == -1)
break;
}
if (start == -1){
calculateO();
/*if(O == 869){
bestBB->save("Dir_For_BaB_" + to_string(n) + "_" + to_string(m), "Out_" + to_string(int(bestBB->getO()))+"_" + to_string(counter) + ".txt");
counter++;
}*/
//calculateO();
// for (int c = 0; c < step; c++){
// cout << "\t";
// }
// cout << "Current O = " << O << endl;
if (O <= *bestO){
if (O < *bestO){
//cout << "OOOOOO = " << O << " BO = "<< bestO << endl;
bestest.clear();
}
(*bestBB) = (*this);
(*bestO) = O;
bestest.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;
}
return;
}
// 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;
addEdge(start, finish);
BranchAndBoundAddOne(bestBB, step + 1, bestO);
// for (int c = 0; c < step; c++){
// cout << "\t";
// }
// cout << "STRICT - " << start << " " << finish << endl;
deleteEdge(start, finish);
strictEdge(start, finish);
BranchAndBoundAddOne(bestBB, step + 1, bestO);
unstrictEdge(start, finish);
//return bestO;
}
Graph::~Graph()
{
delete[] degree;
for (int i = 0; i < v; i++)
delete arr[i];
delete[] arr;
delete[] inSearch;
delete[] inPath;
strict.clear();
}
Размещено на Allbest.ru
Подобные документы
Описание алгоритма сортировки с двоичным включением, выбор структур данных. Пример сортировки массива, отсортированного случайным образом. Алгоритм покрытия по методу "Построение одного кратчайшего покрытия". Волновой алгоритм поиска длиннейшего пути.
курсовая работа [78,2 K], добавлен 24.09.2010Алгоритм сортировки Шейкер: математическое описание задачи и описание алгоритма. Алгоритм покрытия: построение одного кратчайшего покрытия. Описание схемы и работы алгоритма на графах: нахождение кратчайшего пути. Контрольные примеры работы алгоритмов.
курсовая работа [43,8 K], добавлен 19.10.2010Алгоритм поиска по первому наилучшему совпадению на графе. Основные классы для поиска пути в лабиринте. Тестирование нахождения кратчайшего пути в лабиринте. Порядок обхода вершин. Тестирование поведения программы при отсутствии пути в лабиринте.
курсовая работа [888,7 K], добавлен 19.12.2013Классы задач P и NP, их сводимость. Примеры NP-полных и NP-трудных задач. Сущность метода поиска с возвратом. Алгоритмы решения классических задач комбинаторного поиска. Решение задачи о восьми ферзях. Поиск оптимального решения методом ветвей и границ.
презентация [441,5 K], добавлен 19.10.2014Задача о кратчайшем пути как одна из важнейших классических задач теории графов. Общий обзор трех наиболее популярных алгоритмов для решения задачи о кратчайшем пути. Написание программы, которая реализует алгоритм Дейкстры и алгоритм Форда-Беллмана.
курсовая работа [2,1 M], добавлен 23.06.2014Представление задач в виде графов AND/OR, примеры. Задача с ханойской башней. Формулировка процесса игры в виде графа. Основные процедуры поиска по заданному критерию. Эвристические оценки и алгоритм поиска. Пример отношений с определением задачи.
лекция [154,6 K], добавлен 17.10.2013Понятие алгоритма как набора инструкций, описывающего порядок действий. Поиск в ширину - метод обхода графа и поиска пути в нем. Пример работы алгоритма поиска в ширину, его неформальное и формальное описание. Реализация с помощью структуры "очередь".
курсовая работа [684,8 K], добавлен 05.04.2015Разработка программного продукта для поиска максимально удалённых вершин в графе. Характеристика ориентированного, смешанного и изоморфного графов. Обзор способов представления графа в информатике. Алгоритм поиска пути. Графический интерфейс программы.
курсовая работа [384,0 K], добавлен 10.01.2015Разработка алгоритма реализации на ЭВМ процесса поиска кратчайшего пути в графе методом Дейкстры. Программная реализация алгоритма поиска кратчайшего пути между двумя любыми вершинами графа. Проверка работоспособности программы на тестовых примерах.
реферат [929,8 K], добавлен 23.09.2013Графы: определения, примеры, способы изображения. Смежные вершины и рёбра. Путь в ориентированном и взвешенном графе. Матрица смежности и иерархический список. Алгоритм Дейкстры - алгоритм поиска кратчайших путей в графе. Работа в программе "ProGraph".
презентация [383,8 K], добавлен 27.03.2011