47870 (Оптимальный раскрой материала с максимальной прибылью)

2016-07-30СтудИзба

Описание файла

Документ из архива "Оптимальный раскрой материала с максимальной прибылью", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "47870"

Текст из документа "47870"

Содержание

Введение

1. Постановка и анализ задачи

2. Решение задачи

3. Описание алгоритма

4. Описание программы

5. Контрольный пример

Вывод

Текст программы

Литература

1. Введение

Обычно при производстве изделий материал поступает в виде рулонов, полос, прямоугольных листов, стержней и т. д. Поступающий материал раскраивается на части заданных размеров и определенной конфигурации, представляющие собой в одних случаях заготовки, в других — готовые детали. К задачам раскроя, относятся и задачи плотного размещения совокупности предметов на заданных участках.

Задачи рационального раскроя описываются сходными математическими моделями. Существенное различие этих моделей определяется главным образом двумя факторами:

1) конфигурацией получаемых при раскрое заготовок;

2) объемом выпускаемой продукции.

Задачи раскроя, определяемые первым фактором, подразделяют на два класса. К первому классу относятся задачи фигурного раскроя, ко второму — задачи нефигурного раскроя. При фигурном раскрое материал раскраивается на заготовки самых различных конфигураций. К классу задач нефигурного раскроя относятся задачи линейного и прямоугольного раскроя. В первом случае материал раскраивают на заготовки различной длины, для которых задается только один линейный размер. Во втором случае получают заготовки прямоугольной формы, для которых задаются два размера.

Задачи раскроя, определяемые вторым фактором, также подразделяют на два класса: задачи раскроя в условиях массового (крупносерийного) выпуска изделий и задачи раскроя в условиях единичного (мелкосерийного) производства. К обоим классам могут принадлежать как задачи фигурного, так и задачи нефигурного раскроя. Задачи раскроя в условиях массового производства описываются непрерывными моделями линейного программирования, а в условиях единичного производства — целочисленными. В связи с этим задачи раскроя в указанных условиях часто называют соответственно непрерывными и целочисленными.

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

1. Постановка и анализ задачи

Решить задачу гильотинного раскроя материала (длинномерного проката) с максимальной прибылью: кусок материала длиной L раскраивается на заготовки m наименований, для каждой заготовки с номером i = известны ее длина li и оценка сi. Требуется найти раскрой с максимальной оценкой получаемого набора заготовок.

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

2. Решение задачи

Предположим, что кусок материала длиной L раскраивается на заготовки m наименований. Для каждой заготовки с номером i = известны ее длина li и оценка сi. Требуется найти раскрой с максимальной оценкой получаемого набора заготовок.

Раскрой может содержать любое число каждой из заготовок. Тогда набор заготовок характеризуется m-мерным вектором

X = (x1, x2, … , xm), (1)

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

(2)

набора заготовок (1) при единственном линейном ограничении

.(3)

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

Для решения поставленной задачи рассмотрим функцию

(4)

xXl

где через Xi обозначено множество неотрицательных векторов х, отвечающих раскроям, в которых общая длина заготовок не превосходит длины l. Пусть l0 = min li, где i =1…m.

Тогда при всех l[0,l0] соответствующие множества Xl состоят из одного нулевого элемента и, следовательно, f(l) = 0 для всех таких l. Для l[0,L0], справедливы следующие рекуррентные соотношения:

,(5)

iIl

где через Il обозначено множество тех i, при которых lil.

Опираясь на рекуррентные соотношения (5), можно для решения задачи предложить простой численный метод, представляющий собой перебор всех допустимых раскроев. Реализация всего процесса основывается на двух этапах:

Первый этап

На первом этапе осуществляется так называемый прямой ход: по формулам (5) для всех l = последовательно вычисляются функции f(l) и при этом фиксируются индексы i(l), при которых достигается максимум в выражении (5). Получаемая при этом информация l, f(l) и i(l) запоминается и построчно записывается в таблицу:

l

l0

l0 + 1

l0 + 2

L

f(l)

f(l0)

f(l0 + 1)

f(l0 + 2)

f(L)

i(l)

i(l0)

i(l0 + 1)

i(l0 + 2)

i(L)


Второй этап

На втором этапе осуществляется так называемый обратный ход: для получения искомого вектора х (1), для которого выполняется равенство (x) = f(L), в раскрой в первую очередь включаются заготовка с номером i(l1), где l1 = L, и подсчитывается значение l2= l1-li(l1).

Если l2l0, то в раскрой включается заготовка с номером i(l2) и подсчитывается значение l3=l2-li(l2) и т.д. Так как при каждом k1 очевидно, что lk+1lk-l0, то через конечное число описанных шагов окажется, что lk+1< l0. На этом генерирование искомого раскроя заканчивается и выводится результат.

3. Описание алгоритма

1. Определяется текущее значение длины раскроя l от минимальной длины детали до длины материала.

2. Вычисляется максимальный индекс (номер) детали, добавление которой возможно.

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

Если максимум достигнут, то он запоминается. Последняя добавленная деталь удаляется из раскроя и добавляется следующая (п. 4). Если нет деталей которые можно добавить в раскрой, происходит выход из цикла.

4. Запоминается текущий раскрой. Длина раскроя уменьшается на длину детали. Цена раскроя увеличивается на цену детали. Определяются детали, добавление которых в раскрой возможно (п. 2).

5. Берется начальная длина раскроя, равная длине материала. Берется деталь, на которой был достигнут максимум для данной длины материала. Из длины материала вычитается длина детали, к стоимости раскроя прибавляется цена детали. П.5 повторяется, пока есть детали, добавление которых к раскрою не превысит длины материала.

6. Зная количество деталей для каждого их вида, составляющих рациональный раскрой, формируется искомый вектор х.

//процедура вычисления рационального раскроя

procedure searchRationalCut(

materialLength: integer;

detailAmount: integer;

var details: array of TDetail;

var x: array of integer);

var

l0, l, i: integer;

currCut: TCutRecord;

maxCut: TCutRecord;

cutRecords: array[0..MAX_CUTRECORD_AMOUNT-1] of TCutRecord;

cutRecords1: array[1..MAX_CUTRECORD_AMOUNT] of TCutRecord;

i1, j1: integer;

begin

l0:=details[0].l;

for l:=l0 to materialLength do

begin

currCut.l:=l;

currCut.c:=0;

currCut.i:=0;

currCut.max_i:=-1;

maxCut.l:=0;

maxCut.c:=0;

maxCut.i:=0;

maxCut.max_i:=0;

j1:=0;

while true do

begin

if currCut.max_i=-1 then

begin

for i1:=0 to detailAmount-1 do

begin

if details[i1].l<=currCut.l then

begin

currCut.max_i:=i1;

currCut.i:=0;

end;

end;

end;

if (currCut.max_i=-1) or (currCut.i>currCut.max_i) then

begin

if j1<>0 then

begin

if currCut.c>maxCut.c then

begin

maxCut:=currCut;

end;

currCut:=cutRecords1[j1];

j1:=j1-1;

currCut.i:=currCut.i+1;

end

else

begin

break;

end;

end

else

begin

if (currCut.l>=l0) and (currCut.l

begin

if cutRecords[currCut.l].c+currCut.c>maxCut.c then

begin

maxCut:=cutRecords[currCut.l];

maxCut.c:=maxCut.c+currCut.c;

end;

currCut.i:=currCut.i+1;

continue;

end;

j1:=j1+1;

cutRecords1[j1]:=currCut;

currCut.l:=currCut.l-details[currCut.i].l;

currCut.c:=currCut.c+details[currCut.i].c;

currCut.max_i:=-1;

end;

end;

cutRecords[l]:=maxCut;

cutRecords[l].l:=l;

end;

for i:=0 to detailAmount-1 do

begin

x[i]:=0;

end;

l:=materialLength;

while l>=details[0].l do

begin

x[cutRecords[l].i]:=x[cutRecords[l].i]+1;

l:=l-details[cutRecords[l].i].l;

end;

end;

4. Описание программы

Вид главного окна программы приведено на рисунке:

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

После ввода данных для решения нужно нажать кнопку "Вычислить", программа выдаст результат в виде таблицы с оптимальными значениями количества типов деталей. Также выводится общая оценка раскроя, остаток материала и наглядная карта раскроя проката в графической форме. Белые части раскроя обозначают типы деталей, красные линии – линии отреза материала. В случае остатка, соответствующая часть раскроя отображается серым цветом:

5. Контрольный пример

Пусть в задаче генерирования линейного раскроя заданы следующие параметры: длина проката L = 40, количество типов деталей m = 4, а значения длин li и стоимости ci каждой детали приведены в таблице:

i

1

2

3

4

li

7

11

13

17

ci

9

14

16

22

Решаем задачу сеточным методом: сначала выполняем прямой ход. Выбираем начальное значение длины раскроя, равное минимальной длине детали: l0 = min li = 7 и последовательно "шагаем" до конца проката, т.е. 40.

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

Далее в таблице приведены результаты первого этапа (прямого хода) процесса:

l

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

f(l)

9

9

9

9

14

14

16

18

18

18

22

23

23

25

27

28

28

i(l)

1

1

1

1

2

2

3

1

1

1

4

1

1

1

1

2

2

l

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

f(l)

31

32

32

34

36

37

38

40

41

42

44

45

46

47

49

50

51

i(l)

1

1

1

1

1

1

3

1

1

2

4

1

1

1

1

1

1

Здесь и далее i(l) – номер детали, которой соответствует максимальная оценка раскроя (сумма стоимости всех деталей, входящих в раскрой) f(l) на шаге l.

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5160
Авторов
на СтудИзбе
439
Средний доход
с одного платного файла
Обучение Подробнее