Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/160: Рейтинг темы: голосов - 160, средняя оценка - 4.60
1 / 1 / 2
Регистрация: 12.05.2015
Сообщений: 313

Задача коммивояжера (метод ветвей и границ)

13.06.2016, 17:35. Показов 33115. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написать программу для решения задачи коммивояжёра с помощью метода ветвей и границ. Интерфейс должен позволять вводить количество городов (вершин графа) и значения
элементов матрицы расстояний между городами (матрицы смежности).
Буду признателен если поможете, алгоритм решения мне ясен а вот на язык я перевести не смогу.
Миниатюры
Задача коммивояжера (метод ветвей и границ)  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.06.2016, 17:35
Ответы с готовыми решениями:

Метод ветвей и границ (задача об экспериментаторе)
Добрый день. Не получается написать программу на метод ветвей и границ. Задача: профессор поднимается по очереди на каждый этаж некоего...

Метод ветвей и границ для задачи теории расписаний
Добрый день. Стоит задача распределить методом ветвей и границ несколько объектов (в программе называются модули), имеющие свою...

Решение задачи целочисленного программирования методом ветвей и границ
На развитие трех предприятий выделено 5 млн руб. Известная эффективность капитальных вложений в каждое предприятие, заданная значением...

11
1 / 1 / 2
Регистрация: 12.05.2015
Сообщений: 313
13.06.2016, 19:21  [ТС]
Помогите пожалуйста, на сайте нет простой реализации, на c++ без подключения текстового файла, а в гугле я искал не нашел что нужно.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
15.06.2016, 11:13
Лучший ответ Сообщение было отмечено mordol как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
///////////////////////////////////////////////////////////////////////////////
//5.
///////////////////////////////////////////////////////////////////////////////
//Написать программу для решения задачи коммивояжёра с помощью метода ветвей и границ.
//Интерфейс должен позволять вводить количество городов (вершин графа) и значения
//элементов матрицы расстояний между городами (матрицы смежности).
///////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <limits>
#include <set>
#include <vector>
///////////////////////////////////////////////////////////////////////////////
typedef size_t                          T_town;
typedef std::vector     < T_town    >   T_path_val;
typedef int                             T_dist;
typedef std::vector     < T_dist    >   T_row;
typedef std::vector     < T_row     >   T_matr;
typedef std::set        < T_town    >   T_towns;
///////////////////////////////////////////////////////////////////////////////
class   T_path
{
    //-------------------------------------------------------------------------
    T_matr      dist_matr_;
 
    T_path_val  path_cur_;
    T_dist      path_cur_len_;
 
    T_path_val  shortest_path_;
    T_dist      shortest_path_len_;
 
    T_towns     free_towns_;
    //-------------------------------------------------------------------------
public:
    //-------------------------------------------------------------------------
    T_path( T_matr  const   &   dist_matr )
        :
        dist_matr_          ( dist_matr ),
 
        shortest_path_len_  (
                                std::numeric_limits< T_dist >::max()
                            )
    {
        for( T_town  t{}; t < dist_matr.size(); ++t )
        {
            free_towns_.insert(t);
        }
 
        push_town_with_delta_dist(0);
    }
    //-------------------------------------------------------------------------
    void    find_and_print_shortest()
    {
        find_shortest   ();
        print_shortest  ();
    }
    //-------------------------------------------------------------------------
private:
    //-------------------------------------------------------------------------
    void    push_town_with_delta_dist
        (
            T_town  town,
            T_dist  delta_dist  =   0
        )
    {
        path_cur_   .emplace_back   ( town );
        free_towns_ .erase          ( town );
        path_cur_len_   +=  delta_dist;
    }
    //-------------------------------------------------------------------------
    void    find_shortest()
    {
        do
        {
            if  (
                    successfully_fill_better_path()
                )
            {
                shortest_path_      =   path_cur_;
                shortest_path_len_  =   path_cur_len_;
            }//if
        }
        while   (
                    successfully_inc_back_town()
                );
    }
    //-------------------------------------------------------------------------
    bool    successfully_fill_better_path()
    {
        while   (
                        !path_is_full                       ()
                    &&  successfully_push_min_good_town     ()
                );
 
        return  path_is_full();
    }
    //-------------------------------------------------------------------------
    bool    path_is_full()
    {
        return      path_cur_   .size()
                >=  dist_matr_  .size() + 1;
    }
    //-------------------------------------------------------------------------
    bool    successfully_push_min_good_town()
    {
        return      path_cur_   .size()
                ==  dist_matr_  .size()
                    ?   successfully_push_good_town                         (0)
                    :   successfully_push_good_min_free_town_not_less_than  (0);
    }
    //-------------------------------------------------------------------------
    bool    successfully_push_good_town( T_town     town )
    {
        auto    delta_dist  =   dist_matr_  [ path_cur_.back()  ]
                                            [ town              ];
 
 
        bool    bool_res    =           path_cur_len_
                                    +   delta_dist
 
                                <   shortest_path_len_;
 
        if( bool_res )
        {
            push_town_with_delta_dist
                (
                    town,
                    delta_dist
                );
        }
 
        return  bool_res;
    }
    //-------------------------------------------------------------------------
    bool    successfully_push_good_min_free_town_not_less_than( T_town  town_start )
    {
        return      std::find_if
                        (
                            free_towns_.lower_bound     ( town_start ),
                            free_towns_.end             (),
 
 
                            [&]                         ( auto  town )
                            {
                                return  this->successfully_push_good_town( town );
                            }
                        )
 
                !=  free_towns_.end();
    }
    //-------------------------------------------------------------------------
    bool    successfully_inc_back_town()
    {
        return          path_cur_.size()
                    >   1
 
                &&  (
                            successfully_push_good_min_free_town_not_less_than
                                (
                                    pop_and_get_town() + 1
                                )
 
                        ||  successfully_inc_back_town()
                    );
    }
    //-------------------------------------------------------------------------
    T_town  pop_and_get_town()
    {
        auto    back_town           =   path_cur_.back();
        path_cur_.pop_back();
 
        if( back_town )
        {
            free_towns_.insert( back_town );
        }
 
        auto    penultimate_town    =   path_cur_.back();
 
        path_cur_len_               -=  dist_matr_  [ penultimate_town  ]
                                                    [ back_town         ];
 
        return  back_town;
    }
    //-------------------------------------------------------------------------
    void    print_shortest()
    {
        std::cout   <<  std::endl;
 
        for( auto   town    :   shortest_path_ )
        {
            std::cout   <<  town + 1
                        <<  '\t';
        }//for
 
        std::cout   <<  std::endl;
    }
    //-------------------------------------------------------------------------
};
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::ios::sync_with_stdio(false);
    int     towns_total{};
 
    do
    {
        std::cout   <<  "Towns total (>= 2): ";
        std::cin    >>  towns_total;
    }
    while( towns_total < 2 );
 
    std::cout   <<  "Enter distances between towns:"
                <<  std::endl;
 
    T_matr          dist_matr   (
                                    towns_total,
                                    T_row( towns_total )
                                );
 
    for( T_town L{}; L < T_town( towns_total ); ++L )
    {
        for( T_town R{}; R < T_town( towns_total ); ++R )
        {
            if( L == R )
            {
                continue;
            }
 
            std::cout   <<  L + 1
                        <<  " - "
                        <<  R + 1
                        <<  "\t: ";
 
            std::cin    >>  dist_matr[L][R];
        }//for
    }//for
 
    T_path  path                    ( dist_matr );
    path.find_and_print_shortest    ();
}
2
0 / 0 / 0
Регистрация: 20.12.2018
Сообщений: 1
12.01.2019, 09:32
добрый день, может кто нибудь сможет помочь в написании данной задачи на php? заранее спасибо
0
90 / 125 / 28
Регистрация: 17.10.2010
Сообщений: 1,321
12.01.2019, 17:51
Mr.X, в каком формате вводить расстояние? У меня программа ругается?
Миниатюры
Задача коммивояжера (метод ветвей и границ)  
0
1 / 1 / 0
Регистрация: 03.06.2018
Сообщений: 19
04.04.2019, 15:36
isaak, решили эту проблему как то ? , у меня та же ситуация
0
1 / 1 / 0
Регистрация: 03.06.2018
Сообщений: 19
06.04.2019, 21:39
Mr.X, Помогите с решением проблемы с вашей программой , буду очень признателен.
0
1 / 1 / 0
Регистрация: 30.09.2020
Сообщений: 3
02.06.2021, 01:44
Проблема решена, алгоритм вроде бы рабочий.
С итераторами там непонятно что.
Исправьте код функции successfully_push_good_min_free_town_not _less_than(int town_start)
на for (auto i = free_towns_.lower_bound(town_start); i != free_towns_.end(); i++)
{
if(successfully_push_good_town(*i))
return true;
}
return false;
1
0 / 0 / 0
Регистрация: 27.06.2021
Сообщений: 2
26.06.2023, 18:31
Помогите чайнику. Как вывести полученную длину короткого пути ?
0
1 / 1 / 0
Регистрация: 30.09.2020
Сообщений: 3
26.06.2023, 19:00
Там же метод find_and_print_shortest();
0
0 / 0 / 0
Регистрация: 27.06.2021
Сообщений: 2
26.06.2023, 19:07
он выводит сам путь, например результат 1-2-3-4-5-6, а длину этого пути не выводит т.е общую длинну от 1 до 6
0
1 / 1 / 0
Регистрация: 30.09.2020
Сообщений: 3
28.06.2023, 02:40
Dobbi4, ой помню писал что-то тоже дополнительно для лабы в унике, а щас ее уже не найду и запускать естественно не буду. Начни с того что попробуй в print_shortest() засунуть shortest_path_len_. Может надо будет суммировать а может и нет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.06.2023, 02:40
Помогаю со студенческими работами здесь

Какова временная сложность метода ветвей и границ, и генетического алгоритма, которые решают задачу о рюкзаке?
Всем привет!Не подскажете какова временная сложность метода ветвей и границ,и генетического алгоритма,которые решают задачу о рюкзаке? и...

Задача коммивояжера
Всем привет! Необходимо решить задачу коммивояжера с помощью жадных алгоритмов. Разбирался вообще с самой задачей и алгоритмами, но везде...

Метод ближайшего соседа в задаче коммивояжера
Всем привет, столкнулся со сложностями в реализации алгоритма ближайшего соседа по теории графов. Его описание: &quot;Пункты обхода...

Задача коммивояжера - выход за пределы массива
Бьет ошибку! Я так понимаю где-то выход за пределы массива! Народ гляньте кто, а то я уже ничего не вижу! Может свежий взгляд увидит как...

Задача коммивояжера методом динамического программирования
Помогите пожалуйста переделать коммивояжера методом динамического программирования. Пусть n - это количество вершин графа. Тогда в цикле...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru