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

Задача об оптимальном графе для децентрализованного поиска. Жадный алгоритм. Модель Клайнберга. Математическая модель. Алгоритмы решения. Алгоритм локального поиска. Табу алгоритм. Метод ветвей и границ. Выбор между одинаковыми соседями. Стартовый граф.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.