Главная страница
Навигация по странице:

  • Государственное образовательное учреждение высшего профессионального образования ГОУ ВПО “Пермский государственный научно-исследовательский университет”

  • Решение задачи коммивояжера приближенно с помощью «жадного» алгоритма”

  • Выполнил

  • Постановка задачи Задание

  • Выходные данные

  • Язык программирования

  • Тестирование программы input.txt

  • Полный текст исходного кода

  • Отчёт по графам. 12 вариант Бердников ИТС. Отчёт о выполнении Индивидуального задания 1 " Решение задачи коммивояжера приближенно с помощью жадного алгоритма" По дисциплине "Дискретная математика"


    Скачать 0.62 Mb.
    НазваниеОтчёт о выполнении Индивидуального задания 1 " Решение задачи коммивояжера приближенно с помощью жадного алгоритма" По дисциплине "Дискретная математика"
    АнкорОтчёт по графам
    Дата01.07.2022
    Размер0.62 Mb.
    Формат файлаdocx
    Имя файла12 вариант Бердников ИТС.docx
    ТипРешение
    #621962

    Министерство науки и высшего образования Российской Федерации

    Государственное образовательное учреждение

    высшего профессионального образования

    ГОУ ВПО “Пермский государственный научно-исследовательский университет”

    Кафедра математического обеспечения вычислительных систем

    Отчёт

    О выполнении

    Индивидуального задания №1

    Решение задачи коммивояжера приближенно с помощью «жадного» алгоритма”

    По дисциплине “Дискретная математика”

    Выполнил:

    Студент 1-го курса механико-математического ф-та

    Бердников Вадим, группа ИТС-1.

    Проверил:

    Преподаватель ПГНИУ,

    Кетова В. Д.










    Пермь 2022

    Постановка задачи

    Задание: Решение задачи коммивояжера приближенно с помощью «жадного» алгоритма.

    Входные данные: В первой строке записано одно число n – количество вершин в графе. Далее располагается матрица расстояний графа (n строк по n чисел в каждой). Граф полный, все расстояния – натуральные числа.

    Выходные данные: в первой строке – длина найденного цикла, во второй строке – сам гамильтонов цикл, найденный «жадным» алгоритмом (в виде последовательности номеров вершин).

    Язык программирования: С++.

    Алгоритм решения задачи

    1. Считываем данные из файла input.txt.

    2. Динамически выделяем память для массивов.

    3. Заполняем матрицу смежности и массив со степенями вершин заполняет нулями.

    4. Из неотмеченных ребер выбрать ребро минимальной длины проверить что выбранное ребро вместе с ранее отмеченным не образует циклов не образует вершины степени больше 2 если оба условия выполнены отметить ребро иначе удалить если отмеченные ребра еще не образуют Гамильтонов цикл, то переходим в начало алгоритма.

    5. Выводим длину кратчайшего пути в файл.

    6. Выводим кратчайший путь в файл.

    7. Удаляем все массивы.

    Тестирование программы

    input.txt

    Граф

    output.txt

    3

    0 3 5

    3 0 5

    5 5 0



    13

    1 2 3

    4

    0 8 4 5

    8 0 7 9

    4 7 0 3

    5 9 3 0



    24

    1 3 4 2

    5

    0 7 5 3 8

    7 0 3 5 11

    5 3 0 4 4

    3 5 4 0 9

    8 11 4 9 0



    23

    1 4 2 3 5

    7

    0 12 8 4 5 6

    12 0 6 5 8 15

    8 6 0 11 0 2

    4 5 11 0 12 0

    5 8 0 12 0 3

    6 15 2 0 3 0



    25

    1 4 2 3 6 5

    8

    0 7 7 12 8 6 5 3

    7 0 11 8 5 2 15 9

    7 11 0 13 4 7 17 10

    12 8 13 0 6 18 14 8

    8 5 4 6 0 16 4 7

    6 2 7 18 16 0 8 12

    5 15 17 14 4 8 0 15

    3 9 10 8 7 12 15 0



    41

    1 8 4 2 6 3 5 7

    15

    0 5 6 3 9 1 3 8 6 4 7 8 4 1 6

    5 0 13 3 7 4 5 1 6 8 4 2 5 8 1

    6 13 0 8 7 4 2 6 2 8 1 7 6 9 11

    3 3 8 0 21 16 3 7 9 5 8 16 4 14 9

    9 7 7 21 0 16 9 12 11 9 17 14 8 6 8

    1 4 4 16 16 0 4 12 18 6 4 3 6 9 13

    3 5 2 3 9 4 0 7 7 16 18 12 8 3 22

    8 1 6 7 12 12 7 0 3 16 4 15 7 26 11

    6 6 2 9 11 18 7 3 0 2 5 8 9 17 7

    4 8 8 5 9 6 16 16 2 0 7 6 9 6 12

    7 4 1 8 17 4 18 4 5 7 0 6 14 12 8

    8 2 7 16 14 3 12 15 8 6 6 0 18 13 12

    4 5 6 4 8 6 8 7 9 9 14 18 0 7 6

    1 8 9 14 6 9 3 26 17 6 12 13 7 0 16

    6 1 11 9 8 13 22 11 7 12 8 12 6 16 0




    57

    1 6 12 5 13 4 10 9 8 2 15 11 3 7 14

    Полный текст исходного кода

    #include

    #include

    #include

    #include
    struct edge

    {

    int v1, v2, d;

    };
    bool edgeComp(edge e1, edge e2)

    {

    return e1.d > e2.d;

    }
    int findNextVert(std::vector cycle, int cur, int prev)

    {

    for (edge e : cycle)

    {

    if (e.v1 == cur && e.v2 != prev) return e.v2;

    if (e.v2 == cur && e.v1 != prev) return e.v1;

    }

    return -1;

    }
    int main() {

    int n;

    std::ifstream f("input.txt", std::ios_base::in);

    f >> n;

    std::cout << n;

    int** a = new int* [n];

    for (int i = 0; i < n; ++i)

    a[i] = new int[n];
    int* colors = new int[n];

    for (int i = 0; i < n; ++i) colors[i] = i;
    int* deg = new int[n];

    for (int i = 0; i < n; ++i) deg[i] = 0;
    std::vector edges;

    for (int i = 0; i < n; ++i)

    for (int j = 0; j < n; ++j)

    {

    f >> a[i][j];

    if (j > i)

    {

    edge e{ i, j, a[i][j] };

    edges.push_back(e);

    }

    }

    f.close();
    std::sort(edges.begin(), edges.end(), edgeComp);

    int len = 0;

    std::vector cycle;

    while (cycle.size() < n)

    {

    edge e = edges.back();

    edges.pop_back();

    if (deg[e.v1] < 2 && deg[e.v2] < 2 && (cycle.size() == n - 1 || colors[e.v1] != colors[e.v2]))

    {

    cycle.push_back(e);

    len += e.d;

    ++deg[e.v1];

    ++deg[e.v2];

    int colorToChange = colors[e.v2];

    for (int i = 0; i < n; ++i)

    if (colors[i] == colorToChange) colors[i] = colors[e.v1];

    }

    }
    std::ofstream z("output.txt", std::fstream::out);

    z << len << std::endl;

    int prev = -1;

    int cur = 0;

    z << 1;

    for (int i = 1; i < n; ++i)

    {

    int next = findNextVert(cycle, cur, prev);

    z << ' ' << (next + 1);

    prev = cur;

    cur = next;

    }
    z.close();

    for (int i = 0; i < n; ++i)

    delete[] a[i];

    delete[] a;

    delete[] colors;

    delete[] deg;

    return 0;

    }


    написать администратору сайта