Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/35: Рейтинг темы: голосов - 35, средняя оценка - 4.66
27 / 19 / 14
Регистрация: 17.09.2011
Сообщений: 113

Реализация метода ветвей и границ (задача о рюкзаке)

25.03.2016, 00:11. Показов 7091. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
По работе нужно было реализовать метод ветвей и границ, решающий задачу о рюкзаке. Еле откопал алгоритм реализации этого метода на С++ и переделал его под С#. Но видимо чего-то не учел. Вот код:
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
public void Mbr(int i, int ac)
        {
            if ((tw + a[i].getWeight()) <= Wmax)
            {
                s.Add(i);
                tw += a[i].getWeight();
                if (i < (n - 1)) Mbr(i + 1, ac);
                else if (ac > Cmax)
                {
                    Cmax = ac;
                    optS = s; 
                }
                s.Remove(i);
                tw -= a[i].getWeight();
            }
            int ac1 = ac - a[i].getPrice();
            if (ac1 > Cmax)
            {
                if (i < (n - 1)) Mbr(i + 1, ac1);
                else 
                {
                    Cmax = ac1;
                    optS = s;
                }
            }
        }
В общем дебажил метод несколько раз. Оказалось, что когда решение уже найдено и пройдены участки кода в строках 10-11 (или 22-23), то это решение потом очищается посредством строки 13 (Remove). А так как я использую HashSet, то если пуст один набор, пуст и второй (optS = s). Может быть нужно сделать метод возвращающим значение? Помогите, пожалуйста, решить эту проблему.

Добавлено через 19 часов 46 минут
Слегка дополню сабж. Множества (наборы) s и optS я объявил так:

C#
1
2
HashSet<int> s = new HashSet<int>();
HashSet<int> optS = new HashSet<int>();
Далее создал массив классов подобный этому:

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
public class Bag {
 
            private int price;
            private int weight;
 
            public void setPrice(int price)
            {
                this.price = price;
            }
 
            public int getPrice()
            {
                return this.price;
            }
 
            public void setWeight(int weight)
            {
                this.weight = weight;
            }
 
            public int getWeight()
            {
                return this.weight;
            }
        }
        int tw, n;
        int Wmax, Cmax;
        Bag[] a = new Bag[100];
Добавлено через 9 часов 9 минут
Сам всё-таки осилил. Вот решение:

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
public void Mbr(int i, int ac)
        {
            if ((tw + a[i].getWeight()) <= Wmax)
            {
                s.Add(i);
                tw += a[i].getWeight();
                if (i < (n - 1)) Mbr(i + 1, ac);
                else if (ac > Cmax)
                {
                    Cmax = ac;
                    optS.Clear();
                    foreach (int j in s)
                    {
                        optS.Add(j);
                    }
                }   
                s.Remove(i);
                tw -= a[i].getWeight();
            }
            int ac1 = ac - a[i].getPrice();
            if (ac1 > Cmax)
            {
                if (i < (n - 1)) Mbr(i + 1, ac1);
                else
                {
                    Cmax = ac1;
                    optS.Clear();
                    foreach (int j in s)
                    {
                        optS.Add(j);
                    }
                }
            }
        }
При присваивании optS = s, происходило присваивание ссылки на объект s, который, в данном случае, затем изменялся, и, как следствие изменялся объект optS. При использовании итератора множества этого не происходит. В принципе это решение первым пришло в голову, но так как я напортачил с выводом элементов набора, не сразу увидел, что оно правильное.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.03.2016, 00:11
Ответы с готовыми решениями:

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

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

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

3
0 / 0 / 0
Регистрация: 05.12.2016
Сообщений: 1
05.12.2016, 16:29
К сожалению, не очень разобрался в вашем коде. Не могли бы вы скинуть проект? Очень нужно
0
0 / 0 / 0
Регистрация: 09.12.2016
Сообщений: 1
09.12.2016, 08:38
Resistor, здравствуйте!
Только-только в ВУЗе началась данная дисциплина (направление мехмат), и преподаватель требует решить задачу именно этим методом. Извините за дерзость, но не осталось ли у вас завершённого проекта этой задачи?
Лабораторная горит, а я совсем не успеваю разобраться даже в среде разработки.
0
0 / 0 / 0
Регистрация: 25.02.2013
Сообщений: 46
15.01.2017, 12:26
Цитата Сообщение от Resistor Посмотреть сообщение
Еле откопал алгоритм реализации этого метода на С++ и переделал его под С#
Пожалуйста, скиньте код на плюсах.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.01.2017, 12:26
Помогаю со студенческими работами здесь

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

Перевести код алгоритма о рюкзаке методом ветвей и границ с С++ на Java
Добрый день, уважаемые форумчане. Есть ответ на вопрос, о написание алгоритма о рюкзаке, используя метод ветвей и границ. ...

Ошибка в алгоритме метода ветвей и границ - на некоторых графах программа зависает
Добрый день! Ошибка в алгоритме, метод ветвей и границ - поиск минимального пути в графе. На некоторых графах работает, на некоторых нет -...

Задача о ранце, метод ветвей и границ
Есть ли у кого реализации метода ветвей и границ именно для решения задачи о ранце(рюкзаке)? Данный метод для каждой конкретной задачи...

Задача о покрытии методом ветвей и границ
В общем мучился, мучился, так ничего и не вышло...В институте дали задание: реализовать задачу о покрытии методом ветвей и границ на C#....


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru