Реферат по предмету "Информатика, программирование"


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

Содержание
Введение
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)
xÎXl
где через Xi обозначено множество неотрицательныхвекторов х, отвечающих раскроям, в которых общая длина заготовок не превосходитдлины l. Пусть l0 = min li, где i =1…m.
Тогда при всех lÎ[0,l0] соответствующие множества Xl состоят из одного нулевого элементаи, следовательно, f(l) = 0 для всех таких l. Для lÎ[0,L0], справедливы следующие рекуррентные соотношения:
/>,(5)
iÎIl

где через Il обозначено множество тех i, при которых li£l.
Опираясь на рекуррентныесоотношения (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), для которого выполняется равенство m(x) = f(L), в раскрой в первую очередь включаются заготовка с номером i(l1), гдеl1 = L, и подсчитывается значение l2= l1-li(l1).
Если l2³l0, то в раскрой включается заготовка с номером i(l2) и подсчитывается значение l3=l2-li(l2) и т.д. Так как при каждом k³1 очевидно, что lk+1£lk-l0, то через конечное число описанных шагов окажется, что lk+1

3. Описание алгоритма
1. Определяется текущеезначение длины раскроя l отминимальной длины детали до длины материала.
2. Вычисляетсямаксимальный индекс (номер) детали, добавление которой возможно.
3. Если нет деталей,которые можно добавить в раскрой, то проверяется не достигнут ли максимум ценыраскроя для текущего значения длины раскроя l.
Если максимум достигнут,то он запоминается. Последняя добавленная деталь удаляется из раскроя идобавляется следующая (п. 4). Если нет деталей которые можно добавить враскрой, происходит выход из цикла.
4. Запоминается текущийраскрой. Длина раскроя уменьшается на длину детали. Цена раскроя увеличиваетсяна цену детали. Определяются детали, добавление которых в раскрой возможно (п.2).
5. Берется начальнаядлина раскроя, равная длине материала. Берется деталь, на которой был достигнутмаксимум для данной длины материала. Из длины материала вычитается длинадетали, к стоимости раскроя прибавляется цена детали. П.5 повторяется, покаесть детали, добавление которых к раскрою не превысит длины материала.
6. Зная количестводеталей для каждого их вида, составляющих рациональный раскрой, формируетсяискомый вектор х.
//процедура вычислениярационального раскроя
proceduresearchRationalCut(
materialLength:integer;
detailAmount:integer;
var details:array of TDetail;
var x: arrayof 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 tomaterialLength 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
ifcurrCut.max_i=-1 then
begin
for i1:=0 todetailAmount-1 do
begin
ifdetails[i1].l
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 j10then
begin
ifcurrCut.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
ifcutRecords[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 todetailAmount-1 do
begin
x[i]:=0;
end;
l:=materialLength;
whilel>=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.
Рассмотрим более подробнопоследовательное заполнение таблицы на примере шагов
l = 7…14, 22.
1) l = 7
Выбираем первую деталь: i = 1. Длина детали 7, оценка 9.
Вычисляем остаток отраскроя: 7 – 7 = 0. Поскольку остаток нулевой, то деталей, которые можнодобавить в раскрой, нет. Следовательно, максимальная оценка текущего раскрояравна f = 9. Заносим в таблицу значения i(7) = 1, f(7) =9 и переходим кследующему шагу раскроя.
2) l = 8
Снова берём первуюдеталь: i = 1. Длина детали 7, оценка 9.
Остаток: 8 – 7 = 1. Таккак деталей с такой длиной нет, максимальная оценка раскроя f = 9.Заносим в таблицу i(8) = 1, f(8) = 9.
3) l = 9
i = 1, остаток 9 – 7 = 2, f = 9.
Заносим в таблицу i(9) = 1, f(9) =9.
4) l = 10
i = 1, остаток 10 – 7 = 3, f = 9.
Заносим в таблицу i(10) = 1, f(10) = 9.
5) l = 11
i = 1, остаток 11 – 7 = 4, f = 9.
Учитывая, что в текущийраскрой также уместится деталь i = 2 c длиной 11, получим: i = 2, остаток 11 – 11 = 0, f = 14.
Сравним оценки раскроев.Выберем максимальную оценку (f = 14) и соответствующую ей деталь (i = 2).
Заносим в таблицу i(11) = 2, f(11) = 14.
6) l = 12
i = 1, остаток 12 – 7 = 5, f = 9.
i = 2, остаток 12 – 11 = 1, f = 14 (максимум)
Заносим в таблицу i(12) = 2, f(12) = 14.
7) l = 13
i = 1, остаток 13 – 7 = 6, f = 9.
i = 2, остаток 13 – 11 = 2, f = 14.
i = 3, остаток 13 – 13 = 0, f = 16 (максимум)
Заносим в таблицу i(13) = 3, f(13) = 16.
8) l = 14
i = 1, остаток 14 – 7 = 7.
Если мы видим, что длинаостатка раскроя больше или равна начальному значению длины раскроя (l0= 7), т.е. в остаток может поместиться какая-либодеталь (в данном случае с индексом i = 1), из таблицы считываем значение оценки раскроя f(i) при i,равном значению остатка:f(7) = 9, тогда суммарная оценка раскроя f = f(7) +9 = 9 + 9 = 18 (максимум)
i = 2, остаток 14 – 11 = 3, f = 14.
i = 3, остаток 14 – 13 = 1, f = 16.
Заносим в таблицу i(14) = 1, f(14) = 18.
…16) l = 22
i = 1, остаток 22 – 7 = 15, f (15) = 18, f = 18 + 9 = 27.
i = 2, остаток 22 – 11 = 11, f(11) = 14, f = 14 + 14 = 28 (максимум)
i = 3, остаток 22 – 13 = 9, f(9) = 9, f = 9 + 16 = 25.
i = 4, остаток 22 – 17 = 5, f = 22.
Заносим в таблицу i(22) = 2, f(22) = 28. и т.д., пока не достигнут конецпроката.
Выполняем обратный ход(начинаем двигаться с конца таблицы):
1) l = 40
Из таблицы получаеминдекс детали, добавленной в текущий раскрой: i(40) = 1.
Находим длину детали сполученным индексом: l1 = 7.
Вычисляем остатокраскроя: 40 — 7 = 33. Этот остаток используем для следующего шага обратного хода.
2) l = 33
Индекс детали: i(33) = 2.
Длина детали: l2 = 11.
Остаток раскроя: 33 — 11= 22.
3) l = 22
Индекс детали: i(22) = 2.
Длина детали: l2 = 11.
Остаток раскроя: 22 — 11= 11.
4) l = 11
Индекс детали: i(11) = 2.
Длина детали: l2 = 11.
Остаток раскроя: 11 — 11= 0. Обратный ход закончен.
Теперь подсчитываемколичество деталей каждого типа, которые мы получили при обратном ходе. Детальс индексом i = 1 встретилась 1 раз, деталь с индексом i = 2 встретилась 3 раза.
Таким образом, искомыйоптимальный раскрой характеризуется следующим четырёхмерным вектором x = (1; 3; 0; 0).
В вышеприведённой таблицес результатами прямого хода выделены номера заготовок, которые при обратномходе последовательно включались в оптимальный раскрой.
Результат работыпрограммы (проверкаалгоритма):
Исходные данные
Длина проката: 40
Количество типов деталей:4
Длина детали №1….: 7 Ценадетали №1….: 9
Длина детали №2….: 11       Ценадетали №2….: 14
Длина детали №3….: 13       Ценадетали №3….: 16
Длина детали №4….: 17       Ценадетали №4….: 22
Результат
/>
Оптимальное количестводеталей каждого типа:
Деталь №1….: 1 шт.
Деталь №2….: 3 шт.
Деталь №3….: 0 шт.
Деталь №4….: 0 шт.
Оценка раскроя: 51денежных единиц
Остаток материала: 0
Результаты ручного имашинного вычислений совпадают, что говорит о работоспособности разработанногоалгоритма для ЭВМ.

Вывод
В данной работепоставленная задача была решена с помощью сеточного метода. Как показалапроделанная работа, этот метод эффективен и прост для программной реализации наЭВМ. Результат, полученный с помощью этого метода, является оптимальным. В нёмреализуется целенаправленный перебор за конечное число шагов, в результате чегонаходится рациональный раскрой с максимумом прибыли.
В работе были произведеныручные вычисления и по ним проверена работа запрограммированного алгоритма наЭВМ. Разработанная программа и сеточный метод оптимизации раскроя достаточноуниверсальны. Они могут применяться в различных отраслях промышленности примассовом производстве, при этом в алгоритм следует вносить коррективы,связанные с учетом технологии производства и применяемого оборудования.

Текст программы
unit Unit1;
interface
uses
Windows,Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,Grids, ComCtrls, ExtCtrls;
type
//деталь
TDetail=record
l: integer;//длина
c: integer;//цена
end;
//запись раскроя
TCutRecord=record
l: integer;//длина
c: integer;//цена
i: integer;//индексдетали
max_i:integer;//максимальный индекс детали для текущей длины материала
end;
TForm_Main =class(TForm)
GroupBox1:TGroupBox;
Edit_MaterialLength:TEdit;
Label_MaterialLength:TLabel;
UpDown_MaterialLength:TUpDown;
Label_DetailAmount:TLabel;
UpDown_DetailAmount:TUpDown;
Edit_DetailAmount:TEdit;
StringGrid_In:TStringGrid;
GroupBox2:TGroupBox;
StringGrid_Out1:TStringGrid;
Button_Calculate:TButton;
Button_Exit:TButton;
GroupBox3:TGroupBox;
Image_Cut:TImage;
Edit1: TEdit;
Edit2: TEdit;
Label1:TLabel;
Label2:TLabel;
Button1:TButton;
procedureButton_ExitClick(Sender: TObject);
procedureEdit_DetailAmountChange(Sender: TObject);
procedureFormCreate(Sender: TObject);
procedureEdit_MaterialLengthChange(Sender: TObject);
procedureButton_CalculateClick(Sender: TObject);
procedureButton1Click(Sender: TObject);
private
{ Privatedeclarations }
public
{ Publicdeclarations }
end;
const
MAX_DETAIL_AMOUNT=10;//максимальное кол-во деталей
MAX_CUTRECORD_AMOUNT=10000;//максимальное кол-во записейраскроя
MAX_MATERIAL_LENGTH=10000;//максимальнаядлина материала
var
Form_Main:TForm_Main;
materialLength:integer;//длина материала
detailAmount:integer;//кол-во деталей
details:array[1..MAX_DETAIL_AMOUNT] of TDetail;//детали
x:array[1..MAX_DETAIL_AMOUNT] of integer;//результат
implementation
uses Unit2;
{$R *.DFM}
//процедура вычислениярационального раскроя
proceduresearchRationalCut(
materialLength:integer;
detailAmount:integer;
var details:array of TDetail;
var x: arrayof 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 tomaterialLength 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
ifcurrCut.max_i=-1 then
begin
for i1:=0 todetailAmount-1 do
begin
ifdetails[i1].l
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 j10then
begin
ifcurrCut.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
ifcutRecords[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 todetailAmount-1 do
begin
x[i]:=0;
end;
l:=materialLength;
whilel>=details[0].l do
begin
x[cutRecords[l].i]:=x[cutRecords[l].i]+1;
l:=l-details[cutRecords[l].i].l;
end;
end;
//ввод данныхпользователя из таблицы
procedureupdateData;
var
i: integer;
begin
materialLength:=strToInt(Form_Main.Edit_MaterialLength.Text);
detailAmount:=strToInt(Form_Main.Edit_DetailAmount.Text);
for i:=1 todetailAmount do
begin
details[i].l:=strToInt(Form_Main.StringGrid_In.Cells[1,i]);
details[i].c:=strToInt(Form_Main.StringGrid_In.Cells[2,i]);
end;
end;
//графическое отображениерационального раскроя
proceduredrawRationalCut(
image: TImage;
materialLength:integer;
detailAmount:integer;
details: arrayof TDetail;
x: array ofinteger);
var
i, j: integer;
sum: integer;
k_x: real;
curr_x:integer;
curr_x_scr:real;
begin
sum:=0;
for i:=0 todetailAmount-1 do
begin
sum:=sum+x[i]*details[i].l;
end;
k_x:=image.width/materialLength;
withimage.Canvas do
begin
brush.Style:=bsSolid;
brush.Color:=clBtnFace;
fillRect(rect(0,0, image.width, image.height));
brush.Color:=clGray;
pen.Color:=clGray;
rectangle(trunc(k_x*sum),0, trunc(k_x*materialLength), 50);
brush.Color:=clWhite;
pen.Color:=clGray;
rectangle(0,0, trunc(k_x*sum), 50);
pen.Color:=clRed;
brush.Style:=bsClear;
textOut(0,51,'0');
curr_x:=0;
curr_x_scr:=0;
for i:=0 todetailAmount-1 do
begin
for j:=0 tox[i]-1 do
begin
curr_x:=curr_x+details[i].l;
curr_x_scr:=curr_x_scr+k_x*details[i].l;
ifcurr_xmaterialLength then
begin
moveTo(trunc(curr_x_scr),0);
lineTo(trunc(curr_x_scr),50);
textOut(trunc(curr_x_scr),51, intToStr(curr_x));
// textOut(trunc(curr_x_scr-15),21, '('+intToStr(i+1)+')');
end;
end;
end;
end;
end;
//выход из программы
procedureTForm_Main.Button_ExitClick(Sender: TObject);
begin
close;
end;
//изменение кол-вадетеалей
procedureTForm_Main.Edit_DetailAmountChange(Sender: TObject);
var
new_d_a:integer;
i: integer;
begin
new_d_a:=strToInt(Form_Main.Edit_DetailAmount.Text);
if(new_d_a>=1) then
begin
if(new_d_a
begin
Form_Main.StringGrid_In.RowCount:=new_d_a+1;
for i:=1 tonew_d_a do
begin
Form_Main.StringGrid_In.Cells[0,i]:=intToStr(i);
end;
end
else
begin
Form_Main.Edit_DetailAmount.Text:=intToStr(MAX_DETAIL_AMOUNT);
end;
end
else
begin
Form_Main.Edit_DetailAmount.Text:=intToStr(1);
end;
end;
//инициализация программы
procedureTForm_Main.FormCreate(Sender: TObject);
begin
Form_Main.UpDown_MaterialLength.Min:=1;
Form_Main.UpDown_MaterialLength.Max:=MAX_MATERIAL_LENGTH;
Form_Main.UpDown_DetailAmount.Min:=1;
Form_Main.UpDown_DetailAmount.Max:=MAX_DETAIL_AMOUNT;
Form_Main.StringGrid_In.Cells[0,0]:='№детали';
Form_Main.StringGrid_In.Cells[1,0]:='Длина';
Form_Main.StringGrid_In.Cells[2,0]:='Цена';
Form_Main.StringGrid_In.Cells[0,1]:='1';
Form_Main.StringGrid_Out1.Cells[0,0]:='№детали';
Form_Main.StringGrid_Out1.Cells[1,0]:='Количество';
end;
//изменение длиныматериала
procedureTForm_Main.Edit_MaterialLengthChange(Sender: TObject);
var
new_m_l:integer;
begin
new_m_l:=strToInt(Form_Main.Edit_MaterialLength.Text);
if(new_m_l>=1) then
begin
if not(new_m_l
begin
Form_Main.Edit_MaterialLength.Text:=intToStr(MAX_MATERIAL_LENGTH);
end;
end
else
begin
Form_Main.Edit_MaterialLength.Text:=intToStr(1);
end;
end;
//сортировка данных повозрастанию длины детали
procedureStrGridSort;
var
i: integer;
do_next:boolean;
begin
do_next:=true;
while do_nextdo
begin
do_next:=false;
for i:=1 toForm_Main.StringGrid_In.RowCount-2 do
begin
ifstrToInt(Form_Main.StringGrid_In.Cells[1,i])>
strToInt(Form_Main.StringGrid_In.Cells[1,i+1])then
begin
Form_Main.StringGrid_In.cols[1].Exchange(i,i+1);
Form_Main.StringGrid_In.cols[2].Exchange(i,i+1);
do_next:=true;
end;
end;
end;
end;
//вычислениерационального раскроя и отображение результата
procedureTForm_Main.Button_CalculateClick(Sender: TObject);
var
i,sum,cost:integer;
begin
strGridSort;
updateData;
searchRationalCut(materialLength,detailAmount, details, x);
Form_Main.StringGrid_Out1.RowCount:=detailAmount+1;
sum:=0;cost:=0;
for i:=1 todetailAmount do
begin
Form_Main.StringGrid_Out1.Cells[0,i]:=intToStr(i);
Form_Main.StringGrid_Out1.Cells[1,i]:=intToStr(x[i]);
sum:=sum+x[i]*details[i].l;
cost:=cost+x[i]*details[i].c;
end;
Form_Main.Edit1.Text:=intToStr(cost);
Form_Main.Edit2.Text:=intToStr(materialLength-sum);
drawRationalCut(Form_Main.Image_Cut,materialLength, detailAmount, details, x);
end;
procedureTForm_Main.Button1Click(Sender: TObject);
begin
Form2.Show;
end;
end.

Литература
1. Э.А. Мухачева «Рациональный раскрой промышленных материалов».Москва, Машиностроение, 1984 г.
2. Э.А. Мухачева, Г.Ш. Рубинштейн «Математическоепрограммирование». Новосибирск, Наука, 1977 г.


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.