Автор работы: Пользователь скрыл имя, 24 Октября 2013 в 22:38, курсовая работа
Задачи рационального раскроя описываются сходными математическими моделями. Существенное различие этих моделей определяется главным образом двумя факторами:
1) конфигурацией получаемых при раскрое заготовок;
2) объемом выпускаемой продукции.
Введение
1. Постановка и анализ задачи
2. Решение задачи
3. Описание алгоритма
4. Описание программы
5. Контрольный пример
Вывод
Текст программы
Литература
Выполняем обратный ход (начинаем двигаться с конца таблицы):
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 раза.
Таким образом, искомый оптимальный
раскрой характеризуется
В вышеприведённой таблице с результатами прямого хода выделены номера заготовок, которые при обратном ходе последовательно включались в оптимальный раскрой.
Результат работы программы (проверка алгоритма):
Исходные данные
Длина проката: 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;
procedure Button_ExitClick(Sender: TObject);
procedure Edit_DetailAmountChange(
procedure FormCreate(Sender: TObject);
procedure Edit_MaterialLengthChange(
procedure Button_CalculateClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
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}
//процедура вычисления рационального раскроя
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-
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<l) then
begin
if cutRecords[currCut.l].c+
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.c:=currCut.c+details[
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[
l:=l-details[cutRecords[l].i].
end;
end;
//ввод данных пользователя из таблицы
procedure updateData;
var
i: integer;
begin
materialLength:=strToInt(Form_
detailAmount:=strToInt(Form_
for i:=1 to detailAmount do
begin
details[i].l:=strToInt(Form_
details[i].c:=strToInt(Form_
end;
end;
//графическое отображение рационального раскроя
procedure drawRationalCut(
image: TImage;
materialLength: integer;
detailAmount: integer;
details: array of TDetail;
x: array of integer);
var
i, j: integer;
sum: integer;
k_x: real;
curr_x: integer;
curr_x_scr: real;
begin
sum:=0;
for i:=0 to detailAmount-1 do
begin
sum:=sum+x[i]*details[i].l;
end;
k_x:=image.width/
with image.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 to detailAmount-1 do
begin
for j:=0 to x[i]-1 do
begin
curr_x:=curr_x+details[i].l;
curr_x_scr:=curr_x_scr+k_x*
if curr_x<>materialLength 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;
//выход из программы
procedure TForm_Main.Button_ExitClick(
begin
close;
end;
//изменение кол-ва детеалей
procedure TForm_Main.Edit_
var
new_d_a: integer;
i: integer;
begin
new_d_a:=strToInt(Form_Main.
if (new_d_a>=1) then
begin
if (new_d_a<=MAX_DETAIL_AMOUNT) then
begin
Form_Main.StringGrid_In.
for i:=1 to new_d_a do
begin
Form_Main.StringGrid_In.Cells[
end;
end
else
begin
Form_Main.Edit_DetailAmount.
end;
end
else
begin
Form_Main.Edit_DetailAmount.
end;
end;
//инициализация программы
procedure TForm_Main.FormCreate(Sender: TObject);
begin
Form_Main.UpDown_
Form_Main.UpDown_
Form_Main.UpDown_DetailAmount.
Form_Main.UpDown_DetailAmount.
Form_Main.StringGrid_In.Cells[
Form_Main.StringGrid_In.Cells[
Form_Main.StringGrid_In.Cells[
Form_Main.StringGrid_In.Cells[
Form_Main.StringGrid_Out1.
Form_Main.StringGrid_Out1.
end;
//изменение длины материала
procedure TForm_Main.Edit_
var
new_m_l: integer;
begin
new_m_l:=strToInt(Form_Main.
if (new_m_l>=1) then
begin
if not (new_m_l<=MAX_MATERIAL_LENGTH) then
begin
Form_Main.Edit_MaterialLength.
end;
end
else
begin
Form_Main.Edit_MaterialLength.
end;
end;
//сортировка данных по возрастанию длины детали
procedure StrGridSort;
var
i: integer;
do_next: boolean;
begin
do_next:=true;
while do_next do
begin
do_next:=false;
for i:=1 to Form_Main.StringGrid_In.
begin
if strToInt(Form_Main.StringGrid_
strToInt(Form_Main.StringGrid_
begin
Form_Main.StringGrid_In.cols[
Form_Main.StringGrid_In.cols[
do_next:=true;
end;
end;
end;
end;
//вычисление рационального
раскроя и отображение
procedure TForm_Main.Button_
var
i,sum,cost: integer;
begin
strGridSort;
updateData;
searchRationalCut(
Form_Main.StringGrid_Out1.
sum:=0; cost:=0;
for i:=1 to detailAmount do
begin
Form_Main.StringGrid_Out1.
Form_Main.StringGrid_Out1.
sum:=sum+x[i]*details[i].l;
cost:=cost+x[i]*details[i].c;
end;
Form_Main.Edit1.Text:=
Form_Main.Edit2.Text:=
drawRationalCut(Form_Main.
end;
procedure TForm_Main.Button1Click(
begin
Form2.Show;
end;
end.
Литература
1. Э.А. Мухачева "Рациональный раскрой промышленных материалов". Москва, Машиностроение, 1984 г.
2. Э.А. Мухачева, Г.Ш. Рубинштейн "Математическое программирование". Новосибирск, Наука, 1977 г.
Информация о работе Задачи рационального раскроя в условиях массового производства