Технический форум

Технический форум (http://www.tehnari.ru/)
-   C/C++/С# (http://www.tehnari.ru/f42/)
-   -   Программа C++ (http://www.tehnari.ru/f42/t271872/)

katerina00 23.08.2021 22:15

Программа C++
 
На m одинаковых станках требуется обработать n деталей. Время
обработки детали j на любом из станков равно tj , j=1..n. Разбить
детали на m групп для обработки на m станках так, чтобы время
завершения обработки всех деталей было минимально.

Помогите, пожалуйста, с решением задачи

AlexZir 24.08.2021 08:16

если детали одинаковые, то в каждой группе будет n%m деталей, хотя есть подозрение что всё не так очевидно и детали разные.

Vladimir_S 24.08.2021 09:51

Цитата:

Сообщение от AlexZir (Сообщение 2762424)
если детали одинаковые, то в каждой группе будет n%m деталей, хотя есть подозрение что всё не так очевидно и детали разные.

Да ну, Лёша, кой уж там "одинаковые", не зря же для каждой дается время обработки. Задачка-то из серии "ой-ёй-ёй!". Даже не знаю, в каком направлении искать алгоритм — ну не тупым же перебором действовать (в таком случае счёт будет продолжаться, как выражаются поляки, "до морковкина заговенья"). Не говоря уж и С++, в коем я ни бум-бум. Хоть бы алгоритм найти!

Vladimir_S 24.08.2021 10:13

Впрочем, одна идея есть.

1. Находим время T обработки всех деталей НА ОДНОМ станке путём суммирования элементов массива tj.

2. Упорядочиваем массив tj по убыванию.

3. Идём по массиву "сверху вниз" (от наибольшего времени) до тех пор, пока суммарное время t1 (сумма пройденных элементов массива) не превысит значение T/m. Это будет загрузка первого станка.

4. Дальше повторяем процедуру m-1 раз, находя времена tm, и, таким образом, определим загрузку остальных станков.

Конечно, это может не быть "абсолютным минимумом" из-за самого хвоста (может даже оказаться, что последний станок не загружен вовсе!*) но, по крайней мере, что-то близкое к искомому. Можно, конечно, пытаться отработать и этот момент.
Пока так.
____________________
*Впрочем, в самом по себе таком факте ничего страшного нет. Представим себе, что у нас есть 5 деталей и 3 станка, при этом время обработки первой детали составляет 10 часов, а остальных — 2 часа. Тогда, пока будет обрабатываться первая деталь на первом станке, остальные (с запасом!) могут быть обработаны на втором станке, а третий станок не нужен.

Николай_С 24.08.2021 12:06

М-м-м... Э-э-э...Ничего так задачка с беклнецным количеством неизвестных!
А ничего так, что имеется определённая технологическая последовательность обработки каждой детали? Например, нельзя нарезать внутреннюю резьбу не просверлив отверстие подходящего диаметра. Тут нужно сначала составить технологическую карту обработки каждого типа деталей, а уж потом распределять станки. Хотя... Если мы изучаем программирование, а не технологию... Можно и так, как предложил Владимир Игоревич.

P.s. Катюха, попадёшь к нам на форум, узнаешь много нового. ;)

Fisher 24.08.2021 13:10

АГА! Тяжёлая артиллерия подтянулась!
Цитата:

Сообщение от Николай_С (Сообщение 2762450)
Тут нужно сначала составить технологическую карту обработки

Или, для начала, в условиях оговорить, что все-ли детали одинаковые или столько-то видов деталей, если видов несколько, то, хотя-бы, к примеру, оговорить процентное соотношение по трудоёмкости изготовления этих видов деталей. Думаю - как-то так. Иначе - по воде вилами.

AlexZir 24.08.2021 13:24

Цитата:

Сообщение от Fisher (Сообщение 2762459)
все-ли детали одинаковые или столько-то видов деталей, если видов несколько, то, хотя-бы, к примеру, оговорить процентное соотношение по трудоёмкости изготовления этих видов деталей

Ну а я о чём выше написал-то?
Цитата:

Сообщение от AlexZir (Сообщение 2762424)
если детали одинаковые, то в каждой группе будет n%m деталей, хотя есть подозрение что всё не так очевидно и детали разные


AlexZir 24.08.2021 13:25

Цитата:

Сообщение от Николай_С (Сообщение 2762450)
Ничего так задачка с беклнецным количеством неизвестных

Да не, Николай, с точки зрения программирования "черного ящика" количество неизвестных в этой задаче всё-таки конечное и ограничивается значением n
По условию:
станков m
деталей n
время обработки одной детали tj
j выбирается из списка {1..n}, то есть для каждой детали в списке назначено своё время обработки.
Решение задачи можно свести к сортировке списка (массива) по убыванию и последующему распределению элементов по времени обработки.
Есть ещё идея одна: проссумировать элементы списка, разделить сумму на количество станков, тем самым получаем среднюю нагрузку на 1 станок, потом перебрать значения времени обработки деталей в сравнении с вычисленной средней нагрузкой.

Николай_С 24.08.2021 14:25

Цитата:

Сообщение от Fisher (Сообщение 2762459)
АГА! Тяжёлая артиллерия подтянулась!

И это ещё Македоныча нет снами. Он бы сейчас точно "развернул" на примере курей. ;)

Детали д.б. разнотипные, станки тоже. Иначе задача не имеет смысла. Так вот и надо бы определиться с типами.

Vladimir_S 24.08.2021 16:17

Коля, ну что за трёп, ей-Богу? Задачка всё-таки на программирование, а не на составление реальной технологической карты.
Цитата:

Сообщение от Николай_С (Сообщение 2762472)
Детали д.б. разнотипные

Так и есть. Характеризуются разными (данными!) временами обработки.
Цитата:

Сообщение от Николай_С (Сообщение 2762472)
станки тоже

Это ещё зачем? По условию задачи станки одинаковые, смысл задания — оптимально их загрузить.
Цитата:

Сообщение от Николай_С (Сообщение 2762472)
Иначе задача не имеет смысла.

Очень даже имеет. Условия вполне достаточны для однозначного решения.


Часовой пояс GMT +4, время: 07:12.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.