Раскрой профиля

1. Alex_241 29.09.15 15:32 Сейчас в теме
Нужен простенький раскрой, вся загвоздка в том што не могу сообразить как получить все варианты соединения кусков для раскроя, тоесть все варианты. Кусок1 + Кусок2, Кусок1+Кусок2+Кусок3, Кусок2+Кусок3..... и тд. Имею на входе таблицу типа номер куска и его длинна.

Помогитеее.......
По теме из базы знаний
Ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. Xershi 1479 29.09.15 15:37 Сейчас в теме
(1) Alex_241, так в чем конкретно загвоздка. Посчитать сколько нужно метров из кусков, чтобы сшить вещь?
3. гыук320 17 29.09.15 15:38 Сейчас в теме
Если предполагается, что в ряд входят все N элементов, и ни один не повторяется, то это задача о количестве перестановок. Решение можно найти простым рассуждением. На первом месте в ряду может стоять любой из N элементов, следовательно, получается N вариантов. На втором месте — любой, кроме того, который уже был использован для первого места. Следовательно, для каждого из N уже найденных вариантов есть (N - 1) вариантов второго места, и общее количество комбинаций становится N*(N - 1).
Это же рассуждение можно повторить для остальных элементов ряда. Для самого последнего места остается только один вариант — последний оставшийся элемент. Для предпоследнего — два варианта, и так далее.
Следовательно, для ряда из N неповторяющихся элементов число возможных перестановок равно произведению всех целых чисел от 1 до N. Это произведение называется факториалом числа N и обозначается N! (читается «эн факториал»).



2

В предыдущем случае количество возможных элементов и количество мест ряда совпадали, и их число было равно N. Но возможна ситуация, когда в ряду меньше мест, чем имеется возможных элементов. Иными словами, количество элементов в выборке равно некоторому числу M, причем M < N. В этом случае задача определения количества возможных комбинаций может иметь два различных варианта.
Во-первых, может потребоваться сосчитать общее количество возможных способов, которыми можно выстроить в ряд M элементов из N. Такие способы называются размещениями.
Во-вторых, исследователя может интересовать число способов, которыми можно выбрать M элементов из N. При этом порядок расположения элементов уже не важен, но любые два варианта должны различаться между собой хотя бы одним элементом. Такие способы называются сочетаниями.




3

Чтобы найти количество размещений по M элементов из N, можно прибегнуть к такому же способу рассуждений, как и в случае с перестановками. На первом месте здесь по-прежнему может стоять N элементов, на втором (N - 1), и так далее. Но для последнего места количество возможных вариантов равняется не единице, а (N - M + 1), поскольку, когда размещение будет закончено, останется еще (N - M) неиспользованных элементов.
Таким образом, число размещений по M элементов из N равняется произведению всех целых чисел от (N - M + 1) до N, или, что то же самое, частному N!/(N - M)!.



4

Очевидно, что количество сочетаний по M элементов из N будет меньше количества размещений. Для каждого возможного сочетания есть M! возможных размещений, зависящих от порядка элементов этого сочетания. Следовательно, чтобы найти это количество, нужно разделить число размещений по M элементов из N на N!. Иными словами, количество сочетаний по M элементов из N равно N!/(M!*(N - M)!).
4. ildarovich 7861 29.09.15 16:25 Сейчас в теме
Похожая задача обсуждалась здесь: http://www.forum.mista.ru/topic.php?id=745022&page=1

Я предложил такое решение:

У обработки реквизит "Требуется", табличная часть "Метраж" с реквизитами "Имеется" (ваше количество), Коэффициент (коэф), НужноВзять (собственно туда ответ помещается).

Вот код модуля формы:

Процедура КнопкаСформироватьНажатие(Кнопка) 
    РабочаяТаблица = Метраж.Выгрузить(); 
    РабочаяТаблица.ЗаполнитьЗначения(Метраж.Итог("Имеется"), "НужноВзять"); 
    Метраж.ЗагрузитьКолонку(РабочаяТаблица.ВыгрузитьКолонку("НужноВзять"), "НужноВзять"); 
    РабочаяТаблица.ЗаполнитьЗначения(0, "НужноВзять"); 
    РабочаяТаблица.Сортировать("Коэффициент Убыв"); 
    ПодборКусков(РабочаяТаблица, РабочаяТаблица.Количество() - 1, Требуется) 
КонецПроцедуры 


Вот код модуля обработки

Процедура ПодборКусков(РабочаяТаблица, ВГраница, ЗаданнаяСумма, УжеВзяли = 0) Экспорт  
    Если ВГраница < 0 ИЛИ ЗаданнаяСумма < 0 ИЛИ УжеВзяли >= Метраж.Итог("НужноВзять") Тогда //промах  
        Возврат      
    ИначеЕсли ЗаданнаяСумма = 0 Тогда //фиксируем решение  
        Ответ = РабочаяТаблица.Скопировать( , "НомерСтроки, НужноВзять"); 
        Ответ.Сортировать("НомерСтроки"); 
        Метраж.ЗагрузитьКолонку(Ответ.ВыгрузитьКолонку("НужноВзять"), "НужноВзять")  
    КонецЕсли;  
    Курсор = РабочаяТаблица[ВГраница];  
    Для НужноВзять = 0 По Курсор.Имеется Цикл  
        Курсор.НужноВзять = НужноВзять;  
        ПодборКусков(РабочаяТаблица, ВГраница - 1, ЗаданнаяСумма - НужноВзять * Курсор.Коэффициент, УжеВзяли + НужноВзять);          
        Курсор.НужноВзять = 0 
    КонецЦикла 
КонецПроцедуры // ПодборКусков() 
Показать


Это метод ветвей и границ. По ходу обсуждения там еще варианты были.
9. 17121974 10.01.23 22:41 Сейчас в теме
5. Alex_241 15.02.16 13:20 Сейчас в теме
много бился с этой задачей, но придумал интересный метод, работает быстро!!!!))))) если кому интересно напишу
6. Xershi 1479 15.02.16 13:22 Сейчас в теме
(5) Alex_241, ну так пиши чего таить.
7. unoDosTres 15.02.16 14:23 Сейчас в теме
(5) Alex_241,
лучше отдельную публикацию, если действительно рабочий метод, будет наглядней чем размещать тут, а тут просто ссыль кинь на публикацию
8. гыук320 17 17.03.16 12:33 Сейчас в теме
(5) Alex_241, Очень интересно, как раз сейчас начал заниматься оптимизацией резки пвх профиля.
11. user856012 13 11.01.23 00:34 Сейчас в теме
(10) Дочитал до слова "теоритезирование"... и понял всё про отношение автора к школьному образованию: "Ниасилил!"
12. starik-2005 3036 11.01.23 14:14 Сейчас в теме
(11)
Ниасилил
Т.е. ниасиливание с двух сторон? Автор слово с ошибкой написал, а читатель до смысла не сумел через лингвистический барьер прорваться? Сильно!
Какие все стали нежные (с)
17. user1863362 11.01.23 18:20 Сейчас в теме
(12)
Какие все стали нежные
Такие никто чугун суровый
16. user1863362 11.01.23 18:18 Сейчас в теме
(11) Это ты еще не осознал, что в текущей теме "раскрой" - это глагол повелительного наклонения.
18. пользователь 11.01.23 18:25
Сообщение было скрыто модератором.
...
19. user1863362 11.01.23 18:38 Сейчас в теме
(18) Ага. Они в открытую призывают про это еще и кассиру говорить - подходишь такой: "Товарищ кассир! Я у вас сейчас покибердню!" Прямо при всех, да.
20. user856012 13 11.01.23 20:31 Сейчас в теме
(16)
в текущей теме "раскрой" - это глагол повелительного наклонения
Без восклицательного знака? Нифига!
13. пользователь 11.01.23 15:09
Сообщение было скрыто модератором.
...
14. starik-2005 3036 11.01.23 15:25 Сейчас в теме
(13)
Этот алгоритм
Там их как минимум ДВА.
15. пользователь 11.01.23 15:37
Сообщение было скрыто модератором.
...
21. пользователь 10.12.23 11:27
Сообщение было скрыто модератором.
...
22. пользователь 10.12.23 12:23
Сообщение было скрыто модератором.
...
23. пользователь 10.12.23 14:08
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот