Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/65: Рейтинг темы: голосов - 65, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 03.06.2018
Сообщений: 19

Реализация метода ветвей и границ на основе задачи коммивояжера

16.04.2019, 17:21. Показов 14469. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть в том что выводит результат правильный но , мне нужно что бы последовательно показать в консоли этапы сокращения матрицы. Если кто может подсказать

Java
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
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
package vetki;
 
import java.io.*;
import java.util.*;
 
 
public class bbstatic {
 
    /*
    Main Function
    Main - Input - Pathname of Input data
    Return - Void - Prints results on screen
    */
 
    public static void main(String[] args) throws FileNotFoundException {
        // Запуск отсчета для времени выполнения
        long start_time = System.currentTimeMillis();
        // Открытие файла данных и определение количества городов
        String filename = "input.txt";
        if (args.length > 0) {
            filename = args[0];
        }
        File f1 = new File(filename);
        System.out.println(f1.getAbsolutePath());
        BufferedReader input = new BufferedReader(new FileReader(f1));
        BufferedReader input1 = new BufferedReader(new FileReader(f1));
        int NUMBER_CITIES = 0;
        try {
            while (input1.readLine() != null) {
                NUMBER_CITIES++;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("Количество городов: " + NUMBER_CITIES);
 
        // Чтение данных из открытого файла
        int[][] array = new int[NUMBER_CITIES][NUMBER_CITIES];
        int i = 0;
        try {
            String line;
            while ((line = input.readLine()) != null) {
                StringTokenizer st = new StringTokenizer(line);
                int j = 0;
                while (st.hasMoreTokens()) {
                    array[i][j] = Integer.parseInt(st.nextToken());
                    j++;
                }
                i++;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // Выполнение первого сокращения матрицы затрат
        int x = 0;
        x = reduce(array, x, 9999, 9999);
        lobject l1 = new lobject(NUMBER_CITIES);
 
        //Корень дерева начинается с города 0.
        l1.city = 0;
        l1.cost = x;
        l1.matrix = array;
        l1.st.push(0);
        l1.remainingcity = new int[NUMBER_CITIES - 1];
        l1.city_left_to_expand = NUMBER_CITIES - 1;
 
        for (int o = 0; o < NUMBER_CITIES - 1; o++) {
            l1.remainingcity[o] = o + 1;
        }
        //переменная для отслеживания количества развернутых узлов
        int count = 0;
        //Стек DS для ведения узлов в дереве
        Stack<lobject> s = new Stack<>();
        //Толкая корень в стек
        s.push(l1);
        //Временная переменная для хранения лучшего решения, найденного до сих пор
        lobject temp_best_solution = new lobject(NUMBER_CITIES);
        int current_best_cost = 100000;
        //Итерации стека, включая возврат
        // Запуск обхода дерева - обходы до тех пор, пока стек не станет пустым, т.е. все узлы были расширены
        while (!s.empty()) {
            // Инициализация переменной
            List main = new LinkedList();
            main = new ArrayList();
            lobject hell = s.pop();
            //Расширяйте стек только в том случае, если узел не является конечным узлом и если его стоимость лучше, чем лучшая на данный момент
            if (hell.city_left_to_expand == 0) {
                //Сравнивая стоимость этого узла с лучшими и обновляя при необходимости
                if (hell.cost <= current_best_cost) {
                    temp_best_solution = hell;
                    current_best_cost = temp_best_solution.cost;
                }
            } else {
                if (hell.cost <= current_best_cost) {
                    count++;
                    // Расширение последнего узла, извлеченного из стека
                    expand(main, hell);
                    //Определение порядка, в котором расширенные узлы должны быть помещены в стек
                    int[] arrow = new int[main.size()];
                    for (int pi = 0; pi < main.size(); pi++) {
                        lobject help = (lobject) main.get(pi);
                        arrow[pi] = help.cost;
                    }
                    // Сортировка узлов в порядке убывания на основе их стоимости
                    int[] tempppp = decreasing_sort(arrow);
                    for (int pi = 0; pi < tempppp.length; pi++) {
                        // Помещение узловых объектов в стек в порядке убывания
                        s.push((lobject) main.get(tempppp[pi]));
                    }
                    for (lobject lobject : s) {
                        output(lobject);
                    }
                }
            }
        }
        // Расчет времени остановки для времени выполнения
        long stop_time = System.currentTimeMillis();
        long run_time = stop_time - start_time;
 
        // Проверка, найдено ли решение
        if (temp_best_solution.st.size() == NUMBER_CITIES & temp_best_solution.cost < 9000) {
            // Стоимость печатного тура
            System.out.println();
            System.out.println("cost: " + current_best_cost);
            System.out.println();
            // Печать оптимального тура
            System.out.print("[ ");
            for (int st_i = 0; st_i < temp_best_solution.st.size(); st_i++) {
                Integer k = temp_best_solution.st.get(st_i);
                System.out.print(k + 1);
                System.out.print(" -> ");
            }
            System.out.print("1 ]");
            System.out.println();
            System.out.println();
            // Printing Running Time
            System.out.println(run_time + "ms");
            System.out.println();
            //Количество узлов, расширенных в алгоритме
            System.out.println("nodes expanded: " + count);
            System.out.println();
        } else {
            System.out.println("\nNo Solution.\n");
            // Printing Running Time
            System.out.println(run_time+ "ms");
            System.out.println();
        }
    }
 
    private static void toConsole(Stack<lobject> s) {
        StringBuilder str = new StringBuilder();
        str.append("[");
        for (lobject lobject : s) {
            str.append(toString(lobject)).append(",\n");
        }
        str.append("]");
        System.out.println(str);
    }
 
    private static void toConsole(int[][] array) {
        System.out.println(toString(array));
    }
 
    private static String toString(int[][] array) {
        StringBuilder str = new StringBuilder();
        str.append("[\n");
        for (int[] ints : array) {
            for (int anInt : ints) {
                if (anInt > 4500) {
                    str.append(9999-anInt);
                } else {
                    str.append(anInt);
                }
                str.append(",");
            }
            str.append("\n");
        }
        str.append("]");
        return str.toString();
    }
 
    public static String toString(lobject o) {
        return "lobject{" +
                "city=" + o.city +
                ", cost=" + o.cost +
                ", matrix=" + toString(o.matrix) +
                ", remainingcity=" + Arrays.toString(o.remainingcity) +
                ", city_left_to_expand=" + o.city_left_to_expand +
                ", st=" + o.st +
                '}';
    }
 
 
    /*
    Min Function - Reduced the passed array with the value passed
    Input - Array to be reduced, minimum value with which to reduce
    Return - Reduced array
    */
 
    public static int[] min(int[] array, int min) {
        // Recurse through array and reduce with the passed "min" value
        for (int j = 0; j < array.length; j++) {
            array[j] = array[j] - min;
        }
        // Return reduced array
        return array;
    }
 
    /*
    Minimum Function - Calculates the minimum value with which a matrix can be reduced
    Input - Array for which minimum value is to be calculated
    Return - Minimum value
    */
 
    public static int minimum(int[] array) {
        // Объявление по умолчанию как нечто меньшее, чем бесконечность, но выше, чем допустимые значения
        int min = 9000;
        // Рекурсивно через массив найти минимальное значение
        for (int i = 0; i < array.length; i++) {
            // Если значение действительно, т. Е. Меньше бесконечности, сбросьте мин с этим значением
            if (array[i] < min) {
                min = array[i];
            }
        }
        // Проверьте, не изменилось ли минимальное значение, то есть мы встретили бесконечный массив
        if (min == 9000) {
            // Вернуть 0 как ничто, чтобы уменьшить
            return 0;
        }
        // Иначе вернуть минимальное значение
        else {
            return min;
        }
    }
 
    /*
    lobject - класс, в котором хранятся необходимые данные
    */
 
    public static class lobject implements Cloneable {
        int city;
        int cost;
        int[][] matrix;
        int[] remainingcity;
        int city_left_to_expand;
        Stack<Integer> st;
 
        lobject(int number) {
            matrix = new int[number][number];
            st = new Stack<Integer>();
        }
    }
 
    /*
    Method to print the contents of object on screen
    Return - Void
    */
 
    public static void output(lobject l1) {
        System.out.println("============================================");
        System.out.println("============================================");
        System.out.println("This city is :" + l1.city);
        System.out.println("The node cost function:" + l1.cost);
        // Печать остальных городов
        System.out.println("The remaining cities to be expanded from this node");
        for (int h = 0; h < l1.remainingcity.length; h++) {
            System.out.print(l1.remainingcity[h]);
            System.out.print(" ");
        }
        System.out.println();
        System.out.println("The number of possible remaining expansions from this node are: " + l1.city_left_to_expand);
        System.out.println();
        System.out.println("============================================");
        System.out.println("============================================");
    }
 
    /*
    Expand - Node Expansion Function
    Input - List to return the reduced cost matrix, Object of node to be expanded
    Return - Cost of Reduction
    */
 
    public static void expand(List l, lobject o) {
        // Количество городов для прохождения
        int length = o.remainingcity.length;
        for (int i = 0; i < length; i++) {
            // Инициализация переменной
            if (o.remainingcity[i] == 0) continue;
            int cost;
            cost = o.cost;
            int city = o.city;
            Stack<Integer> st = new Stack<>();
            for (int st_i = 0; st_i < o.st.size(); st_i++) {
                Integer k = o.st.get(st_i);
                st.push(k);
            }
            st.push(o.remainingcity[i]);
            // Извлечение содержимого матрицы во временную матрицу для сокращения
            int[][] temparray = new int[o.matrix.length][o.matrix.length];
            for (int i_1 = 0; i_1 < temparray.length; i_1++) {
                for (int i_2 = 0; i_2 < temparray.length; i_2++) {
                    temparray[i_1][i_2] = o.matrix[i_1][i_2];
                }
            }
            //Добавление значения ребра (i, j) к стоимости
            cost = cost + temparray[city][o.remainingcity[i]];
            //Делая i-й ряд и j-й столбец бесконечным
            for (int j = 0; j < temparray.length; j++) {
                temparray[city][j] = 9999;
                temparray[j][o.remainingcity[i]] = 9999;
            }
            //Делая (j, 0) бесконечностью
            temparray[o.remainingcity[i]][0] = 9999;
            //Сокращение этой матрицы в соответствии с указанными правилами
            int cost1 = reduce(temparray, cost, city, o.remainingcity[i]);
            // Обновление содержимого объекта, соответствующего текущего тура по городу
            lobject finall = new lobject(o.matrix.length);
            finall.city = o.remainingcity[i];
            finall.cost = cost1;
            finall.matrix = temparray;
            int[] temp_array = new int[o.remainingcity.length];
            // Ограничение расширения в случае возврата
            for (int i_3 = 0; i_3 < temp_array.length; i_3++) {
                temp_array[i_3] = o.remainingcity[i_3];
            }
            temp_array[i] = 0;
            finall.remainingcity = temp_array;
            finall.city_left_to_expand = o.city_left_to_expand - 1;
            finall.st = st;
            l.add(finall);
        }
    }
 
    /*
    Reduce - Reduces the passed Matrix with minimum value possible
    Input - 2D Array to be reduced, Previous Step's Cost, Row to be processed, Column to be processed
    Return - Cost of Reduction
    */
 
    public static int reduce(int[][] array, int cost, int row, int column) {
        // Массивы для хранения строк и столбцов, которые будут уменьшены
        int[] array_to_reduce = new int[array.length];
        int[] reduced_array = new int[0];
        // Переменная для хранения обновленной стоимости
        int new_cost = cost;
        // Петля для уменьшения рядов
        for (int i = 0; i < array.length; i++) {
            // Если строка соответствует текущему городу, не уменьшайте
            if (i == row) continue;
            // Если строка не соответствует текущему городу, попробуйте уменьшить
            for (int j = 0; j < array.length; j++) {
                // Выбрать строку, которая будет уменьшена
                array_to_reduce[j] = array[i][j];
            }
            // Проверьте, можно ли уменьшить текущий ряд
            if (minimum(array_to_reduce) != 0) {
                // Обновление новой стоимости
                new_cost = minimum(array_to_reduce) + new_cost;
                // Уменьшение строки
                reduced_array = min(array_to_reduce, minimum(array_to_reduce));
                // Отталкивание уменьшенного ряда обратно в исходный массив
                for (int k = 0; k < array.length; k++) {
                    array[i][k] = reduced_array[k];
                }
            }
        }
        // Петля для уменьшения столбцов
        for (int i = 0; i < array.length; i++) {
            // Если столбец соответствует текущему городу, не уменьшайте
            if (i == column) continue;
            // Если столбец не соответствует текущему городу, попробуйте уменьшить
            for (int j = 0; j < array.length; j++) {
                // Выборка столбца должна быть уменьшена
                array_to_reduce[j] = array[j][i];
            }
            // Проверьте, можно ли уменьшить текущий столбец
            if (minimum(array_to_reduce) != 0) {
                // Обновление текущей стоимости
                new_cost = minimum(array_to_reduce) + new_cost;
                // Уменьшение столбца
                reduced_array = min(array_to_reduce, minimum(array_to_reduce));
                // Отталкивание уменьшенного столбца обратно в исходный массив
                for (int k = 0; k < array.length; k++) {
                    array[k][i] = reduced_array[k];
                }
            }
        }
 
        System.out.println("уменьшенные значения: \n" + toString(reduced_array));
        System.out.println("уменьшенная матрица: \n" + toString(array));
        System.out.println();
        return new_cost;
    }
 
    private static String toString(int[] reduced_array) {
        StringBuilder s = new StringBuilder();
        s.append("[");
        for (int i : reduced_array) {
            if (i > 4500) {
                s.append(9999-i);
            } else {
                s.append(i);
            }
            s.append(",");
        }
        s.append("]");
        return s.toString();
    }
 
    /*
    Decreasing Sort - сортирует переданный массив в порядке убывания и возвращает индекс
    Input - Массив для сортировки в порядке убывания
    Return - отсортированный массив
    */
 
    public static int[] decreasing_sort(int[] temp) {
        int[] y = new int[temp.length];
        // Получение содержимого массива
        for (int j = 0; j < temp.length; j++) {
            y[j] = temp[j];
        }
        int x = 0;
        // Сортировка
        for (int i = 0; i < temp.length - 1; i++) {
            if (temp[i] < temp[i + 1]) {
                x = temp[i];
                temp[i] = temp[i + 1];
                temp[i + 1] = x;
            }
        }
        int[] to_be_returned = new int[temp.length];
        int f = 0;
        // Помещение отсортированного содержимого в массив для возврата
        for (int j = 0; j < temp.length; j++) {
            for (int j1 = 0; j1 < temp.length; j1++) {
                if (temp[j] == y[j1]) {
                    to_be_returned[j] = j1;
                }
            }
        }
        return to_be_returned;
    }
}
Миниатюры
Реализация метода ветвей и границ на основе задачи коммивояжера  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.04.2019, 17:21
Ответы с готовыми решениями:

Решение задачи о коммивояжера методом ветвей и границ.
Решение задачи о коммивояжера методом ветвей и границ.

Решение задачи коммивояжера методом ветвей и границ
Нужна помощь в реализации программы которая будет решать задачу коммивояжера методом ветвей и границ . Количество городов(вершин) и...

Перевести код алгоритма решения задачи коммивояжера методом ветвей и границ из Java в C#
Здравствуйте. Нашел код на JAVA алгоритма решения задачи коммивояжера методом ветвей и границ.Вот он ...

26
1 / 1 / 0
Регистрация: 03.06.2018
Сообщений: 19
22.04.2019, 18:17  [ТС]
Студворк — интернет-сервис помощи студентам
ArtemFM, Не буду врать , это тема моего диплома , а дипрук у меня бабка старая до жути , вот и требует от меня все вот эти приколы
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
22.04.2019, 18:22
прям таки нужно сделать поиск пути в графе с выводом красивого дерева и матриц? )))
Жесть, сочувствую. Но вот даже сейчас поразмыслив, я понимаю, с чем ты столкнёшься:
1. сделать форму с объектами и желательно везде проверки на ввод данных - это просто, но времени отнимет нормально
2. сделать свою реализацию дерева под эту задачу.
3. вывод с позиционированием
4. красивый вывод матриц
5. сами методы решения задачи
6. по мимо этого будет ещё что-то, что я не учёл,думаю
1
1 / 1 / 0
Регистрация: 03.06.2018
Сообщений: 19
22.04.2019, 18:23  [ТС]
ArtemFM, даа попал я , ну ничего придётся разбираться , выбора нету диплом через месяц
0
 Аватар для ArtemFM
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
22.04.2019, 18:33
KASSKADE, вот сколько не смотрю на это дерево, так и не понял, как его визуально читать! Может ты подскажешь,
Миниатюры
Реализация метода ветвей и границ на основе задачи коммивояжера  
1
1 / 1 / 0
Регистрация: 03.06.2018
Сообщений: 19
22.04.2019, 19:22  [ТС]
ArtemFM,1) допустим у нас есть общая стоимость минимальных значений di и dj(соответственно по строке и столбцу),тоесть мы их суммируем и получаем в нашем случае число 35(начальное)
2)Дальше мы определили что путь для ребра (5,2) и делим его на (5*,2*) и (5,2) , нижняя граница циклов имеет сумму 41
3) соответственно 41>35 вот и выбираем дальнейший путь ,
ну и так дальше

Добавлено через 39 минут
ArtemFM, https://math.semestr.ru/kom/komm.php вот наглядный пример
1
1 / 1 / 0
Регистрация: 03.06.2018
Сообщений: 19
26.06.2019, 17:53  [ТС]
ArtemFM, добрый день , вы не могли бы показать блок схему вашей программы?
0
 Аватар для Aviz__
2762 / 2069 / 510
Регистрация: 17.02.2014
Сообщений: 9,507
27.06.2019, 08:23
Цитата Сообщение от KASSKADE Посмотреть сообщение
разбираться
http://java-course.ru/begin/ - относительно легкое введение в gui
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.06.2019, 08:23

Реализация метода ветвей и границ
Нужен вменяемый (разложенный по пунктам )алгоритм метода упомянутого в теме. Гугл выдаёт решения задачи коммивояжера, алгоритм Литтла,...

Реализация метода ветвей и границ (задача о рюкзаке)
По работе нужно было реализовать метод ветвей и границ, решающий задачу о рюкзаке. Еле откопал алгоритм реализации этого метода на С++ и...

Задача коммивояжера, метод ветвей и границ
В общем, делаю программу, решающую задачу коммивояжера методом ветвей и границ по плану с этого сайта...

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

Программная реализация "Метода ветвей и границ" или "Метода Гомори"
Здравствуйте. Подскажите, пожалуйста, где можно скачать библиотеки, реализующие какой-нибудь из этих методов? Добавлено через 1 час 16...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru