Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/79: Рейтинг темы: голосов - 79, средняя оценка - 4.71
3 / 3 / 5
Регистрация: 18.11.2013
Сообщений: 118

Задача коммивояжера

11.04.2015, 21:12. Показов 15107. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Необходимо решить задачу коммивояжера с помощью жадных алгоритмов. Разбирался вообще с самой задачей и алгоритмами, но везде всегда один пример - двумерный массив с какими-то числами и я не могу спроецировать решение тех задач на свое условие.
На вход мне подается массив размерности (n x 2), где каждая строчка - это координата города (x; y) на плоскости. Мне нужно считать расстояние между городами и найти самый выгодный путь и выводить индексы городов, по которым я иду. Но из-за того, что у меня именно массив координат, а не расстояний или чего-то подобного как в примерах, не совсем понимаю, как мне запоминать путь и не совсем улавливаю логику жадных алгоритмов в этом случае.
Разъясните что к чему, пожалуйста.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2015, 21:12
Ответы с готовыми решениями:

Задача коммивояжёра
Написать программу для решения задачи коммивояжёра с помощью алгоритма Литтла. Интерфейс должен позволять вводить количество городов...

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

Задача коммивояжера (метод ветвей и границ)
Написать программу для решения задачи коммивояжёра с помощью метода ветвей и границ. Интерфейс должен позволять вводить количество городов...

2
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
11.04.2015, 23:52
Пусть есть город А(х,у) и город В(х1,у1)

Тогда расстояние х - х1 и у - у1- єто катеті прямоугольного треугольника, а гипотенуза следовательно расстояние между городами.

Странно что не дана связь между городами, но тем легче, значит из каждого города есть путь в другой. Можно составить матрицу расстояний и рассчитать.
0
518 / 410 / 188
Регистрация: 08.04.2013
Сообщений: 1,750
12.04.2015, 00:43
Лучший ответ Сообщение было отмечено d3vn как решение

Решение

Я вот тоже не пойму как он их находит? Разбирайся
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
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
//listing 1
// Search for a route. 
#include <iostream> 
#include <stack> 
#include <string> 
#include <vector> 
 
using namespace std; 
  
// Flight information.  
struct FlightInfo {  
  string from;  // departure city 
  string to;    // destination city 
  int distance; // distance between from and to 
  bool skip;    // used in backtracking  
  
  FlightInfo() { 
    from = ""; 
    to = ""; 
    distance = 0; 
    skip = false; 
  } 
 
  FlightInfo(string f, string t, int d) {  
    from = f;  
    to = t;  
    distance = d;  
    skip = false;  
  }  
};  
 
// Find connections using a depth-first search.  
class Search {  
  // This vector holds the flight information.  
  vector<FlightInfo> flights; 
 
  // This statck is used for backtracking.  
  stack<FlightInfo> btStack;  
 
  // If there is a flight between from and to,  
  // store the distance of the flight in dist. 
  // Return true if the flight exists and, 
  // false otherwise. 
  bool match(string from, string to, int &dist); 
 
  // Given from, find any connection.  
  // Return true if a connection is found, 
  // and false otherwise. 
  bool find(string from, FlightInfo &f); 
 
public:  
 
  // Put flights into the database.  
  void addflight(string from, string to, int dist) {  
    flights.push_back(FlightInfo(from, to, dist));  
  }  
 
  // Show the route and total distance.  
  void route();  
 
  // Determine if there is a route between from and to.   
  void findroute(string from, string to); 
 
  // Return true if a route has been found. 
  bool routefound() { 
    return !btStack.empty(); 
  } 
  //=================================================//
  void resetSkip(FlightInfo);
  //=====================================================//
};  
 
// Show the route and total distance.  
void Search::route()  
{  
  stack<FlightInfo> rev;  
  int dist = 0;  
  FlightInfo f;  
  
  // Reverse the stack to display route.  
  while(!btStack.empty()) { 
    f = btStack.top(); 
    rev.push(f); 
    btStack.pop(); 
  } 
  
  // Display the route. 
  while(!rev.empty()) { 
    f = rev.top(); 
    rev.pop();  
    cout << f.from << " to ";  
    dist += f.distance;  
  }  
  
  cout << f.to << endl;  
  cout << "Distance is " << dist << endl;  
}  
  
// If there is a flight between from and to,  
// store the distance of the flight in dist. 
// Return true if the flight exists and, 
// false otherwise. 
bool Search::match(string from, string to, int &dist)  
{  
  for(unsigned i=0; i < flights.size(); i++) {  
    if(flights[i].from == from &&  
       flights[i].to == to && !flights[i].skip)  
    {  
      flights[i].skip = true; // prevent reuse  
      dist = flights[i].distance; 
      return true; 
    }  
  }  
  
  return false; // not found   
}  
    
// Given from, find any connection.  
// Return true if a connection is found, 
// and false otherwise. 
bool Search::find(string from, FlightInfo &f)  
{  
  for(unsigned i=0; i < flights.size(); i++) {  
    if(flights[i].from == from && !flights[i].skip) {  
      f = flights[i]; 
      flights[i].skip = true; // prevent reuse  
  
      return true;  
    }  
  }  
  
  return false;  
} 
//___________________________________________________________________//
//listing 3
// Reset the skip fields in flights vector. 
void Search::resetSkip(FlightInfo f) { 
  for(unsigned i=0; i < flights.size(); i++)  
    if(flights[i].from == f.from &&  
       flights[i].to == f.to)  
         flights[i].skip = false;  
}
 
//_____________________________________________________________________//
 
 
/*  
// Depth-first version. 
// Determine if there is a route between from and to. 
void Search::findroute(string from, string to)  
{  
  int dist;  
  FlightInfo f;  
  
  // See if at destination.  
  if(match(from, to, dist)) { 
    btStack.push(FlightInfo(from, to, dist));  
    return;  
  }  
  
  // Try another connection.  
  if(find(from, f)) { 
    btStack.push(FlightInfo(from, to, f.distance));  
    findroute(f.to, to);  
  }  
  else if(!btStack.empty()) {  
    // Backtrack and try another connection.  
    f = btStack.top(); 
    btStack.pop();  
    findroute(f.from, f.to);  
  }  
} */
//-------------------------------------------------------------------------------------//
//listing 2
// Breadth-first version. 
// Determine if there is a route between from and to. 
void Search::findroute(string from, string to)  
{  
  int dist;  
  FlightInfo f;  
  
  // This stack is needed by the breadth-first search.  
  stack<FlightInfo> resetStck; 
  
  // See if at destination.  
  if(match(from, to, dist)) {  
    btStack.push(FlightInfo(from, to, dist));  
    return;  
  }  
  
  // Following is the first part of the breadth-first  
  // modification.  It checks all connecting flights  
  // from a specified node. 
  while(find(from, f)) {  
    resetStck.push(f);  
    if(match(f.to, to, dist)) {  
      resetStck.push(FlightInfo(f));  
      btStack.push(FlightInfo(from, f.to, f.distance));  
      btStack.push(FlightInfo(f.to, to, dist));  
      return;  
    }  
  }  
  
  // The following code resets the skip fields set by  
  // preceding while loop. This is also part of the  
  // breadth-first modifiction. 
  while(!resetStck.empty()) { 
    resetSkip(resetStck.top()); 
    resetStck.pop(); 
  }  
  
  // Try another connection.  
  if(find(from, f)) {  
    btStack.push(FlightInfo(from, to, f.distance));  
    findroute(f.to, to);  
  }  
  else if(!btStack.empty()) {  
    // Backtrack and try another connection.  
    f = btStack.top(); 
    btStack.pop();  
    findroute(f.from, f.to);  
  }  
}
//____________________________________________________________________________________// 
int main() {  
  char to[40], from[40]; 
  Search ob; 
 
  // Add flight connections to database. 
  ob.addflight("New York", "Chicago", 900);  
  ob.addflight("Chicago", "Denver", 1000);  
  ob.addflight("New York", "Toronto", 500);  
  ob.addflight("New York", "Denver", 1800);  
  ob.addflight("Toronto", "Calgary", 1700);  
  ob.addflight("Toronto", "Los Angeles", 2500);  
  ob.addflight("Toronto", "Chicago", 500);  
  ob.addflight("Denver", "Urbana", 1000);  
  ob.addflight("Denver", "Houston", 1000);  
  ob.addflight("Houston", "Los Angeles", 1500);  
  ob.addflight("Denver", "Los Angeles", 1000);  
 
  // Get departure and destination cities.  
  cout << "From? ";  
 
  cin.getline(from, 40); 
  cout << "To? ";  
 
  cin.getline(to, 40); 
 
  // See if there is a route between from and to. 
  ob.findroute(from, to);  
  
  // If there is a route, show it. 
  if(ob.routefound())  
      ob.route();  
 
  return 0; 
}
Добавлено через 16 минут
Алгоритм правда не жадный а поиск в глубину или в ширину
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.04.2015, 00:43
Помогаю со студенческими работами здесь

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

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

Метод коммивояжера
Нужно реализовать метод коммивояжера. Ответ выводит странный, помогите пожалуйста исправить #include &lt;stdio.h&gt; //printf(),...

Алгоритм Коммивояжера
кто может помочь с прогой на С или С++?

Алгоритм GTS коммивояжёра
Помогите построить Алгоритм GTS коммивояжёра в С++ По схеме с рисунка:


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru