Простые однопроходные эвристики
Постановка одномерной задачи максимального покрытия. Графическое представление для задачи одномерного раскроя и максимального покрытия. Суть однопроходных простых эвристик, на примере задачи упаковки. Метод решения, структограмма и пошаговый алгоритм.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 26.12.2012 |
Размер файла | 126,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Простые однопроходные эвристики для решения одномерной задачи покрытия
1. Постановка и математическая модель задачи
Постановка одномерной задачи максимального покрытия.
Задачи покрытия являются разновидностью задач упаковки, в которых условие непересечения заготовок заменяется на условие пересечения друг с другом и с границами области упаковки.
Для проблемы одномерного максимального покрытия имеем следующую задачу:
Задана: длинна L покрываемого материала (формы) и имеется m исходных элементов (деталей) заданной длинны li, и в заданном количестве bi, .
Требуется найти план покрытия максимального количества форм исходными деталями, т.е. найти матрицу А=[], компоненты которой указывают число i-х предметов j-ой упаковке и максимизирующую количество N покрытых форм:
, , ,
,
, .
Эта задача была сформулирована Е. Заком на встрече международной группы по интересам раскроя-упаковки (SICUP) в 2002 году.
На рисунках 1.4 и 1.5 показаны отличия между задачей одномерного раскроя и задачей покрытия:
Размещено на http://www.allbest.ru/
Графическое представление для задачи одномерного раскроя
Размещено на http://www.allbest.ru/
Графическое представление одномерной задачи максимального покрытия
2. Однопроходные простые эвристики
Рассмотрим суть однопроходных простых эвристик, на примере задачи упаковки.
Выделяют два основных класса алгоритмов. Они определяются порядком упаковки предметов в корзины. Он-лайн алгоритмы рассматривают предметы в заданном порядке и упаковывают их в корзину, выбираемую с помощью некоторой стратегии. Офф-лайн алгоритмы вначале упорядочивают предметы. Как правило, офф-лайн процедура сортирует предметы в порядке невозрастания их весов (длин). Для офф-лайн алгоритмов важно, чтобы задачи были статическими, он-лайн алгоритмы могул применятся, когда предметы динамически прибывают на место упаковки или имеют случайные параметры веса (длины).
Как правило, в обоих классах используются следующие основные стратегии выбора.
· Следующий подходящий (Next-Fit, NF). Первый предмет упаковывается в корзину №1. Каждый следующий предмет упаковывается в ту же корзину, если позволяет ее остаточная емкость. В противном случае он упаковывается в новую корзину. Он-лайн версия (NF) имеет временную сложность O(m), а версия офф-лайн (Next-Fit-Decreasing, NFD) занимает O (m*logm) времени из-за необходимости сортировки предметов.
Пример 2.4. В контейнере емкости L=100 требуется упаковать 7 предметов, веса которых заданы вектором w=(40, 9, 21, 37, 20, 53, 17).Определить с помощью алгоритма NF необходимое количество контейнеров для размещения всех предметов.
Определим вначале нижнюю границу . При этом резерв (неиспользованная вместимость) равен 100*2-97=3.
NF алгоритм. Будем укладывать предметы в заданном порядке, пользуясь стратегией «следующий подходящий». Для загрузки предметов потребуется 3 контейнера с планом загрузки ={(1; 2; 3) (4; 5) (6; 7)},
После загрузки 1-го контейнера предметами 1,2 и 3 остается свободная емкость, равная 30. Согласно стратегии NF следующим должен укладываться 4 предмет. Его вес равен 37 и в 1-й контейнер он не войдет. Во 2-м контейнере размещается 4-й и 5-й предметы, остается свободная емкость, равная 43. Следующий 6-й предмет размещается в 3-м контейнере. Там же размещается 7-й предмет. План загрузки ={(1; 2; 3) (4; 5) (6; 7)}.
покрытие раскрой эвристика структограмма
3. Метод решения, структограмма и пошаговое описание алгоритма
На входе мы имеем длину формы и длины деталей, которыми мы будем покрывать формы. Далее в зависимости от выбранной эвристики мы следуем алгоритмам и покрываем форму деталями, в последовательностях определенных выбранной эвристикой. На выходе мы получаем покрытые формы. Количество форм не ограничено, главное, чтобы все детали были использованы. И для каждой эвристики у нас получатся разные списки покрытий. В процессе анализа мы выберем наиболее удачное и оптималь-ное покрытие.
Входные данные: (W, m, , Эвристика)
Выходные данные: (N, , )
В зависимости от выбранной Эвристики упорядочить или не упорядочить длины деталей.
Покрывать последовательно (согласно списку) деталями форму, пока длина формы не будет перекрыта.
Перейти к следующей форме и повторять предыдущий шаг, пока детали не закончатся.
Вывести результат, где отразить размещение деталей и количество используемых форм.
4. Листинг программы
#pragma once
#include «resource.h»
#include «Form_d.h»
kusok *c;
kusok *b;
kusok *m; // инициализация и заполнение масcива заготовок
list<mqueue> glist; // глобальный список контейнеров
double v;
namespace KA_2_4
{
using namespace System;
using namespace System: ComponentModel;
using namespace System: Collections;
using namespace System: Windows: Forms;
using namespace System: Data;
using namespace System: Drawing;
public ref class Form1: public System: Windows: Forms: Form
{
public:
Form1 (void)
{
InitializeComponent();
}
protected:
~Form1 ()
{
if (components)
{
delete components;
}
}
private: System: Void Form1_Load (System: Object^ sender, System: EventArgs^ e)
{
srand (unsigned(time(NULL)));
list_is_ready=0;
}
private: System: Void button1_Click (System: Object^ sender, System: EventArgs^ e)
{
list_is_ready=1;
switch(evr)
{
case0: {upakovka(m);
break;}
case 1: {
quick1 (b, num);
c=new kusok[num];
for (int i=0; i<num; i++)
c[i]=b[i];
for (int i=0; i<num/2; i++)
{
b [2*i]=c[i];
b [2*i+1]=c [num-i-1];
}
upakovka(b);
break;}
case 2: {quick1 (b, num);
c=new kusok[num];
for (int i=0; i<num; i++)
{c[i]=b[i];
}
switch(num)
{
case 20:
{
for (int i=0; i<18; i++)
{b[i]=c [i - (i/3)];
b [i+1]=c [i - (i/3)+1];
b [i+2]=c [num - ((i/3)+1)];
i=i+2;
}
b[18]=c[12];
b[19]=c[13];
break;}
case 50:
{
for (int i=0; i<48; i++)
{b[i]=c [i - (i/3)];
b [i+1]=c [i - (i/3)+1];
b [i+2]=c [num - (i/3) - 1];
i=i+2;
}
b[48]=c[32];
b[49]=c[33];
break;}
case 100:
{
for (int i=0; i<99; i++)
{b[i]=c [i - (i/3)];
b [i+1]=c [i - (i/3)+1];
b [i+2]=c [num - (i/3) - 1];
i=i+2;
}
b[99]=c[66];
break;}
}
upakovka(b);
break;}
case 3: {quick1 (b, num);
c=new kusok[num];
for (int i=0; i<num; i++)
{c[i]=b[i];
}
switch(num)
{
case 20:
{
for (int i=0; i<18; i++)
{b[i]=c [num - ((i/3)+1)];
b [i+1]=c [num - ((i/3)+2)];
b [i+2]=c [i - (i/3)];
i=i+2;}
b[18]=c[13];
b[19]=c[12];
break;}
case 50:
{
for (int i=0; i<48; i++)
{b[i]=c [num - ((i/3)+1)];
b [i+1]=c [num - ((i/3)+2)];
b [i+2]=c [i - (i/3)];
i=i+2;}
b[48]=c[33];
b[49]=c[32];
break;}
case 100:
{
for (int i=0; i<99; i++)
{b[i]=c [num - ((i/3)+1)];
b [i+1]=c [num - ((i/3)+2)];
b [i+2]=c [i - (i/3)];
i=i+2;}
b[99]=c[66];
break;}
}
upakovka(b);
break;}
case 4: {quick1 (b, num);
c=new kusok[num];
for (int i=0; i<num; i++)
{c[i]=b[i];
}
switch(num)
{
case 20:
{
for (int i=0; i<18; i++)
{b[i]=c [num - ((i/3)+1)];
b [i+1]=c [i - (i/3)];
b [i+2]=c [i - (i/3)+1];
i=i+2;}
b[18]=c[13];
b[19]=c[12];
break;}
case 50:
{
for (int i=0; i<48; i++)
{b[i]=c [num - ((i/3)+1)];
b [i+1]=c [i - (i/3)];
b [i+2]=c [i - (i/3)+1];
i=i+2;}
b[48]=c[33];
b[49]=c[32];
break;}
case 100:
{
for (int i=0; i<99; i++)
{b[i]=c [num - ((i/3)+1)];
b [i+1]=c [i - (i/3)];
b [i+2]=c [i - (i/3)+1];
i=i+2;}
b[99]=c[66];
break;}
}
upakovka(b);
break;}
case 5: {quick1 (b, num);
c=new kusok[num];
for (int i=0; i<num; i++)
{c[i]=b[i];
}
switch(num)
{
case 20:
{
for (int i=0; i<18; i++)
{
b[i]=c [num - ((2*i/3)+1)];
b [i+1]=c [num - ((2*i/3)+2)];
b [i+2]=c [i - (2*i/3)];
i=i+2;}
b[18]=c[7];
b[19]=c[6];
break;}
case 50:
{
for (int i=0; i<48; i++)
{b[i]=c [num - ((2*i/3)+1)];
b [i+1]=c [num - ((2*i/3)+2)];
b [i+2]=c [i - (2*i/3)];
i=i+2;}
b[48]=c[17];
b[49]=c[16];
break;}
case 100:
{for (int i=0; i<99; i++)
{b[i]=c [num - ((2*i/3)+1)];
b [i+1]=c [num - ((2*i/3)+2)];
b [i+2]=c [i - (2*i/3)];
i=i+2;}
b[99]=c[23];
break;}
}
upakovka(b);
break;}
case 6: {quick1 (b, num);
c=new kusok[num];
for (int i=0; i<num; i++)
{c[i]=b[i];
}
switch(num)
{
case 20:
{
for (int i=0; i<18; i++)
{b[i]=c [i - (i/3)];
b [i+1]=c [num - ((i/3)+1)];
b [i+2]=c [i - (i/3)+1];
i=i+2;}
b[18]=c[12];
b[19]=c[13];
break;}
case 50:
{
for (int i=0; i<48; i++)
{b[i]=c [i - (i/3)];
b [i+1]=c [num - ((i/3)+1)];
b [i+2]=c [i - (i/3)+1];
i=i+2;}
b[48]=c[32];
b[49]=c[33];
break;}
case 100:
{
for (int i=0; i<99; i++)
{b[i]=c [i - (i/3)];
b [i+1]=c [num - ((i/3)+1)];
b [i+2]=c [i - (i/3)+1];
i=i+2;}
b[99]=c[66];
break;}
}
upakovka(b);
break;}
}
this->Invalidate();
textBox1->Text=v. ToString();
}
void quick1 (kusok* a, int N)
{
int i = 0, j = N; // поставить указатели на исходные места
kusok temp, p;
p = a [N>>1]; // центральный элемент
// процедура разделения
do {while (a[i].l < p.l) i++;
while (a[j].l > p.l) j -;
if (i <= j)
{
temp = a[i]; a[i] = a[j]; a[j] = temp;
i++; j -;
}
} while (i<=j);
// рекурсивные вызовы, если есть, что сортировать
if (j > 0) quick1 (a, j);
if (N > i) quick1 (a+i, N-i);
}
void upakovka (kusok* m) // функция упаковки
{
while (! glist.empty())
glist.clear(); // очистка глобального списка
mqueue std_set; // стандартная очередь
std_set.len=con;
glist.push_back (std_set);
for (int j=0; j<num; j++)
{
if((glist.back().len)>=0)
{
glist.back().Q.push (m[j]);
glist.back().len-=m[j].l;
}
else
{
glist.push_back (std_set);
glist.back().Q.push (m[j]);
glist.back().len-=m[j].l;
}
}
}
private: System: Void Form1_Paint (System: Object^ sender, System: Windows: Forms: PaintEventArgs^ e) {
if (list_is_ready) // рисование стержней с заготовками (из списка)
{
int w=int (ClientSize. Width);
int h=int (ClientSize. Height);
array<Pen^>^ pens=gcnew array<Pen^>(2); // массив карандашей
pens[0]=gcnew Pen (Color: Green);
pens[1]=gcnew Pen (Color: Red);
Drawing: Font^shrift=gcnew System: Drawing: Font («Courier New», 10); // шрифт для строкового вывода
Drawing: Brush^pencil1=gcnew System: Drawing: SolidBrush (Color: Black); // крандаш для строкового вывода
Drawing: Brush^pencil2=gcnew System: Drawing: SolidBrush (Color: Blue);
Drawing: Point oxy (240,10); // точка начала для стержня
int dx=(w-400)/100;
int dy=(h-20)/(glist.size());
int n1=1, n2=1;
queue<kusok> bufer;
for (list<mqueue>:iterator i=glist.begin(); i!=glist.end(); i++)
{
e->Graphics->DrawString («L»+n1. ToString(), shrift, pencil1, oxy.X-10, oxy.Y);
e->Graphics->DrawLine (pens[0], oxy.X, oxy.Y, oxy.X+100*dx, oxy.Y);
while(! ((*i).Q.empty()))
{bufer.push((*i).Q.front());
oxy.X+=dx*(*i).Q.front().l/10;
e->Graphics->DrawLine (pens[1], oxy.X, oxy.Y-2, oxy.X, oxy.Y+2);
e->Graphics->DrawString («x»+(*i).Q.front().x. ToString(), shrift, pencil2, oxy.X, oxy.Y+2);
(*i).Q.pop();
}
while (! bufer.empty())
{(*i).Q.push (bufer.front());
bufer.pop();
}
oxy.X=240;
oxy.Y+=dy;
n1++;
}
oxy.X=20;
oxy.Y=60;
int k=1;
n1=(int) ceil((double) (h-60)/15.);
n2=(int) ceil((double) num/((double) n1));
for (int i=0; i<n2; i++)
{
for (int j=0; (j<n1)&&(k<=num); j++)
{
e->Graphics->DrawString («x»+b [k-1].x. To String()+ "="+b [k-1].l, shrift, pencil1, oxy.X-10, oxy.Y);
oxy.Y+=15;
k++;
}
oxy.Y=60;
oxy.X+=75;
}
}
}
private: System: Void button3_Click (System: Object^ sender, System: EventArgs^ e)
{
this->Invalidate();
}
private: System: Void button2_Click (System: Object^ sender, System: EventArgs^ e)
{
Close();
}
private: System: Void button4_Click (System: Object^ sender, System: EventArgs^ e)
{
Form_d^ SecondForm;
SecondForm=gcnew Form_d;
SecondForm->Show();
}
private: System: Void button5_Click (System: Object^ sender, System: EventArgs^ e)
{
m=new kusok[num];
v=0;
for (int i=0; i<num; i++)
{m[i].l=v1+rand()%(v2-v1); // случайное заполнение массива заготовок
m[i].x=i+1; // назначение номера заготовке
v=(v+m[i].l);
}
v=v/1000;
b=new kusok[num];
for (int i=0; i<num; i++)
{b[i].l=m[i].l;
b[i].x=i+1;
}
}
};
}
4. Описание параметров программы
Пользователь выбирает количество деталей(m), диапазон длины деталей и эвристику.
Далее генерируются длины деталей в заданном диапазоне.
Рассчитывается идеальное покрытие
И производится покрытие форм:
В результате мы видим, чем больше количество деталей (m) выбирает пользователь, тем больше разница между идеальным покрытием и тем, что мы имеем, при любой эвристике.
Для классов c большими размерами покрывающих деталей лучше работают эвристики NF и NFD (с сортировкой элементов по принципа LLS, LSS и SLS). Для остальных классов все эвристики равноценны между собой.
Размещено на Allbest.ru
...Подобные документы
Описание решения задачи, ее постановка, общий подход к решению. Представление исходных данных, условий задачи и целей ее решения. Составление алгоритма решения поставленной задачи. Написание программного обеспечения и тестирование конечного продукта.
курсовая работа [1,1 M], добавлен 03.07.2011Сущность и назначение основных алгоритмов оптимизации. Линейное программирование. Постановка и аналитический метод решения параметрической транспортной задачи, математическая модель. Метод решения задачи об оптимальных перевозках средствами MS Excel.
курсовая работа [465,6 K], добавлен 24.04.2009Оптимизация решения задачи с помощью алгоритма отжига. Анализ теории оптимизации как целевой функции. Метод градиентного спуска. Переменные и описание алгоритма отжига. Представление задачи коммивояжера через граф. Сведение задачи к переменным и решение.
курсовая работа [784,0 K], добавлен 21.05.2015Общее понятие графа, его виды и сущность вершинного покрытия. Написание точного алгоритма решения задачи о надежности сети, нахождение минимального покрытия. Реализация данного алгоритма на языке TurboC++. Код программы, решающий поставленную задачу.
курсовая работа [1,3 M], добавлен 27.06.2014Содержательная и формальная (математическая) постановка задачи. Разработка алгоритма решения задачи. Структуры программы и алгоритмы программных модулей, их описание. Решение задачи на конкретном примере. Разработка системы тестов и отладка программы.
курсовая работа [882,1 K], добавлен 24.11.2014Алгоритм сортировки Шейкер: математическое описание задачи и описание алгоритма. Алгоритм покрытия: построение одного кратчайшего покрытия. Описание схемы и работы алгоритма на графах: нахождение кратчайшего пути. Контрольные примеры работы алгоритмов.
курсовая работа [43,8 K], добавлен 19.10.2010Си - это язык программирования общего назначения. Постановка задачи: разработка программы - калькулятора. Метод решения задачи. Алгоритм работы программы. Технические данные для использования. Описание основных функций.
курсовая работа [14,1 K], добавлен 23.05.2002Описание генетических алгоритмов. Применение генетического алгоритма для решения задачи коммивояжера. Постановка задачи безусловной оптимизации. Изучение распространения генетических алгоритмов на модель с несколькими взаимодействующими популяциями.
дипломная работа [979,1 K], добавлен 30.05.2015Графическое изображение последовательности технологического процесса. Описание метода решения задачи на математическом языке. Общий алгоритм решения задачи и структура программы. Основные понятия сетевых моделей. Разработка программы на языке С++.
курсовая работа [1,3 M], добавлен 23.05.2013Критерий эффективности и функции в системе ограничений. Общая постановка задачи линейного программирования. Составление математической модели задачи. Алгоритмы решения задачи симплексным методом. Построение начального опорного решения методом Гаусса.
курсовая работа [232,4 K], добавлен 01.06.2009Создание алгоритма для построения синтаксического анализатора полиномов и его реализация в среде Visual Studio 2005 на языке программирования C#. Программное решение задачи поиска максимального числа единиц в бинарном представлении простых чисел.
курсовая работа [723,5 K], добавлен 04.10.2010Задачи, решаемые методом динамического программирования. Основные этапы нахождения деревянного алгоритма решения задачи. Выполнение алгоритма Прима. Построение Эйлерового цикла. Решение задач средствами Excel. Алгоритм основной программы - Derevo.
курсовая работа [586,3 K], добавлен 04.04.2015Описание предметной области решаемой задачи. Входные документы, необходимые для решения задачи, ее функции. Разработка информационного обеспечения задачи и реквизиты входной информации. Технология и алгоритмов решения задачи и их машинная реализация.
контрольная работа [15,1 K], добавлен 21.10.2010Математические основы оптимизации. Постановка задачи оптимизации. Методы оптимизации. Решение задачи классическим симплекс методом. Графический метод. Решение задач с помощью Excel. Коэффициенты целевой функции. Линейное программирование, метод, задачи.
реферат [157,5 K], добавлен 21.08.2008Графическое решение задач. Составление математической модели. Определение максимального значения целевой функции. Решение симплексным методом с искусственным базисом канонической задачи линейного программирования. Проверка оптимальности решения.
контрольная работа [191,1 K], добавлен 05.04.2016Постановка задачи конвенкции-диффузии примеси, этапы и принципы параметризации. Модельные примеры для одномерного и двумерного уравнения. Описание программной реализации решения двумерной задачи: выбор среды, описание программы, анализ результатов.
дипломная работа [232,4 K], добавлен 17.02.2015Определение наиболее выгодного соотношения сортов сырой нефти, используемой для производства бензина. Математическая постановка задачи. Выбор метода решения задачи. Описание алгоритма решения задачи (симплекс-метода) и вычислительного эксперимента.
курсовая работа [1,1 M], добавлен 08.12.2010Процесс и порядок написания программы, реализующей графическое решение логической задачи (игры). Обзор аналогичных продуктов. Описание и алгоритм решения задачи. Структура программы, ее процедуры и функции. Настройка и руководство для пользователя.
курсовая работа [35,7 K], добавлен 29.06.2010Основные этапы решения транспортной задачи, использование метода потенциалов. Алгоритм решения методом аппроксимации Фогеля. Процедура построения цикла. Планирование перевозок из конечного числа пунктов отправления в конечное число пунктов назначения.
контрольная работа [32,6 K], добавлен 26.04.2011Описание алгоритма решения транспортной задачи по планированию перевозки зерна. Ход решения задачи вручную, в программе TORA методом наименьшего элемента, с помощью MS Excel. Разработка программы для решения задачи в общем виде средствами Delphi.
курсовая работа [2,5 M], добавлен 22.11.2012