Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Контрольная работа

 
 
Теория принятия решений


по дисциплине «_____________________________________________________»

 
 
Практическое решение задач по курсу «Теория принятия решений» (вариант № 6)    


на тему______________________________________________________________

____________________________________________________________________

____________________________________________________________________

____________________________________________________________________

 
 
Икленков Алексей Андреевич


Студент_____________________________________________________________

ВИЗ-375
(имя, отчество, фамилия)

Группа________________________

 

Оценка ________________________

(зачтено/незачтено)

 
 
доц. В.В. Киселев


Проверил ________________________ _____________________

(подпись и дата подписания) (долж., инициалы и фамилия)

 

 
 
Н.А.Билялова


Нормоконтролер ______________________________ _____________________________

(подпись, дата подписания) (инициалы и фамилия)

 

 

Волжский, 2014 г.

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

 

Компания "Лотос" занимается реализацией видео и аудио продукции.

Имеет разветвлённую сеть магазинов и оптовых складов, как в Москве, так и в регионах. Необходимо разработать управленческую информационную систему для осуществления оптимального руководства данной компанией.

Работы, которые необходимо выполнить для реализации проекта, непосредственно им предшествующие работы (1) и время (в неделях) выполнения работ (2).

1. Построить сетевой график.

2. Выполнить нумерацию вершин сетевого графика.

3. Рассчитать параметры сетевого графика:

· ранние и поздние сроки начал и окончаний работ,

· критическое время,

· ранние и поздние сроки наступления событий,

· полные и свободные резервы времени выполнения работ.

4. Указать критический путь.

 

 

  Работа Вариант 6
   
  -  
  -  
  -  
  -  
     
     
     
  1,2  
  1,2  
  1,2  
  3,6  
     
     
  5,8  
     
  10,11, 12,15  
     
  - -

Результаты работы программы (исходные данные).

 

 

Результаты работы программы (таблица связей).

Результаты работы программы (сетевой график).

 

Результаты работы программы (критический путь).

Расчет параметров сетевого графика.

 

Данный сетевой график не нуждается в оптимизации.

Сроки наступления событий:

Номер события Ранний срок Поздний срок Резерв времени
       
       
       
       
       
       
       
       
       
       
       

 

Таким обрзом, длина критического пути — 31. Критический путь состоит из работ: 4(4), 7(7), 13(7), 15(5), 17(8).

 

Работа Продолж. Ранн. нач. Ранн. оконч. Позд. Нач. Поздн. Оконч. Полный резерв Своб. резерв
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               

 

Код основной части программы.

 

// Проверить, нет ли имён с таким же названием, как у изменяемой работы

// (добавляемой). Регистрируется в TWorkEditForm.FormCreate

function TMainForm.CheckInformationOfWork(const Name: ANSIString;

const Duration: extended;

const Index: integer;

out ErrStr: ANSIString): cardinal;

var

I: integer;

begin

Result:= 1;

 

ErrStr:= err3;

if WorksEditor.RowCount > Index then

begin

For I:= 1 to Index - 1 do

if Name = WorksEditor.Keys[I] then

exit;

 

For I:= Index + 1 to WorksEditor.RowCount - 1 do

if Name = WorksEditor.Keys[I] then

exit;

end

else

For I:= 1 to WorksEditor.RowCount - 1 do

if Name = WorksEditor.Keys[I] then

exit;

 

 

Result:= 0;

end;

 

// Добавить работу

procedure TMainForm.AddWorkBtnClick(Sender: TObject);

var

NameWork: ANSIString;

DurationWork: extended;

Data: TWorkData;

begin

if WorkEditForm.ShowModalSet(NameWork, DurationWork, WorksEditor.RowCount)

<> mrOk then exit;

WorksEditor.InsertRow(NameWork, FloatToStr(DurationWork), true);

 

Data.Name:= NameWork;

Data.Duration:= DurationWork;

WorkList.Add(Data);

end;

 

// Модификация названия работы по двойному щелчку мыши

procedure TMainForm.WorksEditorDblClick(Sender: TObject);

var

NameWork: ANSIString;

DurationWork: extended;

begin

// Если щелчок на пустой работе

if (WorksEditor.Row >= WorksEditor.RowCount) or

(WorksEditor.Keys[WorksEditor.Row] = '') then

begin

AddWorkBtnClick(Sender);

exit;

end;

 

NameWork:= WorksEditor.Keys[WorksEditor.Row];

DurationWork:= StrToFloat(WorksEditor.Values[NameWork]);

 

if WorkEditForm.ShowModalChange(NameWork, DurationWork,

WorksEditor.Row) <> mrOk then exit;

 

WorksEditor.Strings[WorksEditor.Row - 1]:=

NameWork + '=' + FloatToStr(DurationWork);

WorkList.Items[WorksEditor.Row - 1].Name:= NameWork;

WorkList.Items[WorksEditor.Row - 1].Duration:= DurationWork;

// Сообщить об изменении работы другим компонентам

WorkList.ModifyEvent(WorksEditor.Row - 1, MODIFY_EVENT);

end;

 

procedure TMainForm.WorksEditorKeyUp(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

 

// Удалить работу по нажатию кнопки Delete

// Не реализовано в самом графе

{ if Key = VK_DELETE then

begin

if (WorksEditor.Row >= WorksEditor.RowCount) or

(WorksEditor.Keys[WorksEditor.Row] = '') then exit;

 

WorksEditor.DeleteRow(WorksEditor.Row);

WorkList.Delete(WorksEditor.Row - 1);

end;}

 

end;

 

// Показать таблицу зависимостей работ

procedure TMainForm.DependenceBtnClick(Sender: TObject);

begin

if WorkList.Count > 0 then

begin

WorksTableForm.Visible:= true;

WorksTableForm.SetFocus;

end

else MessageDlg(warn1, mtInformation, [mbOk], 0);

end;

 

procedure TMainForm.ExitMenuClick(Sender: TObject);

begin

close;

end;

 

// Сохранить

procedure TMainForm.FileSaveMenuClick(Sender: TObject);

begin

if WorkList.Count <= 0 then

begin

MessageDlg(warn3, mtInformation, [mbOk], 0);

exit;

end;

 

if NOT SaveDialog.Execute then exit;

WorkList.Save(SaveDialog.FileName);

end;

 

// Загрузить

procedure TMainForm.FileLoadMenuClick(Sender: TObject);

var

I: integer;

begin

if (WorksEditor.Strings.Count > 0) and (WorkList.Modified) then

if MessageDlg(warn6, mtConfirmation, [mbYes, mbNo], 0) = mrYes

then FileSaveMenuClick(self);

 

if NOT OpenDialog.Execute then exit;

WorksEditor.Strings.Clear;

// WorkList очищается самостоятельно

WorkList.Load(OpenDialog.FileName);

SaveDialog.FileName:= OpenDialog.FileName;

 

for I:= 0 to WorkList.Count -1 do

WorksEditor.InsertRow(WorkList[I].Name, FloatToStr(WorkList[I].Duration),

true);

WorkList.Modified:= false;

end;

 

// Просмотр графика

procedure TMainForm.N3Click(Sender: TObject);

begin

if WorkList.Count > 0 then

begin

CircuitForm.Visible:= true;

CircuitForm.SetFocus;

end

else MessageDlg(warn2, mtInformation, [mbOk], 0);

 

 

end;

 

// Очистить область задач

procedure TMainForm.N4Click(Sender: TObject);

begin

if (WorksEditor.Strings.Count > 0) and (WorkList.Modified) then

if MessageDlg(warn5, mtConfirmation, [mbYes, mbNo], 0) = mrYes

then FileSaveMenuClick(self);

WorksEditor.Strings.Clear;

WorkList.Clear;

SaveDialog.FileName:= '';

end;

 

procedure TMainForm.N6Click(Sender: TObject);

begin

DebugForm.Visible:= true;

DebugForm.SetFocus;

end;

 

procedure TMainForm.FormResize(Sender: TObject);

begin

WorksEditor.Height:= self.ClientHeight - 1;

end;

 

procedure TMainForm.CrtFastPathMenuClick(Sender: TObject);

begin

if CrtFastPathMenu.Checked then

Critical_Fast_Path:= -1

else Critical_Fast_Path:= 1;

 

WorkList.ModifyEvent(0,Refresh_EVENT);

end;

 

function ErrorToStr: ANSIString;

var

lpMsgBuf: PAC;

I: cardinal;

begin

FormatMessage(

FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,

nil,

GetLastError(),

LANG_NEUTRAL,

@lpMsgBuf,

0,

nil);

 

I:= 0;

while byte(lpMsgBuf[I]) <> 0 do

begin

Result:= Result + lpMsgBuf[I];

inc(I);

end;

 

LocalFree(cardinal(lpMsgBuf));

end;

 

procedure TMainForm.N9Click(Sender: TObject);

begin

WinHelp(self.Handle, 'SCAPMIT.HLP', HELP_CONTENTS, 0);

end;

 

 

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

CanClose:= true;

if (WorksEditor.Strings.Count > 0) and (WorkList.Modified) then

if MessageDlg(warn6, mtConfirmation, [mbYes, mbNo], 0) = mrYes

then FileSaveMenuClick(self);

end;

 

end.

 

 

Задание № 2

Тема "Планирование технологических процессов на основе теории расписаний"

Задание 2a. "Задача одного станка"

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

Вариант № 6 Номер детали
№1 №2 №3 №4 №5 №6 №7 №8
t i                
Si                

Вычислим сумму штрафов до изменения плана:

Математическая постановка. Пусть Tj (σni) – время ожидания j -детали в случае использования σni -й перестановки для запуска деталей, где n – количество деталей; i – текущий номер перестановки, тогда:

Критерий: .

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

Вычисляем коэффициенты :

Сортируем столбцы матрицы по строке с коэффициентами в порядке убывания и вычисляем новый суммарный штраф:

 

 

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

Вариант № 6 Номер детали
№4 №7 №3 №1 №6 №2 №8 №5
t i                
Si                

 

Задание 3. Задача о транспортном предприятии

 

Транспортное предприятие должно определить уровень своих возможностей (оснащённости), чтобы удовлетворить потребности клиентов в услугах на планируемый период.

Потребности клиентов в транспортных услугах (спрос) в течение планируемого периода заранее неизвестны. Специалисты предприятия считают, что объём этих потребностей может принять одно из четырёх значений: S1, S2, S3 или S4 тысяч тонн.

Для каждого уровня потребностей существует наилучший уровень P1, P2, P3 или P4 оснащённости предприятия с точки зрения затрат (потерь).

Используя критерии Вальда, Сэвиджа, Гурвица определить оптимальный вариант оснащённости предприятия.

Замечание. При использовании критерия Гурвица считать, что ЛПР (лицо, принимающее решение) использует значение коэффициента оптимизма:

· λ = 0.25 – для вариантов с чётными номерами,

Вариант 6
Уровень оснащённости Варианты спроса
S1 S2 S3 S4
P1        
P2        
P3        
P4        

 

 

 

Результаты работы программы (три Критерия).

 

Код основной части программы (три критерия).

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace zadacha_o_transportnom_predpiyatii

{

class Program

{

static void Main(string[] args)

{

//исходный массив с данными

int[,] matrix = new int[,] { { 7,14,20,25 }, { 10,8,14,18 }, { 20,17,12,22 }, { 27,23,21,17 } };

 

Console.WriteLine("Исходная матрица:");

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

{

Console.Write(matrix[i, j] + " ");

}

Console.WriteLine();

}

Console.WriteLine();

 

//решение по критерию Вальда

int[] max = new int[4];

 

//ищем максимальные элементы в каждой строке

for (int i = 0; i < 4; i++)

{

max[i] = matrix[i, 0];

for (int j = 0; j < 4; j++)

{

if (max[i] < matrix[i, j]) max[i] = matrix[i, j];

}

}

 

Console.WriteLine("КРИТЕРИЙ ВАЛЬДА");

Console.WriteLine("MAX (наибольшие элементы каждой строки): ");

for (int i = 0; i < 4; i++)

{

Console.WriteLine(max[i] + " ");

}

 

int[] supply = new int[4];

for (int i = 0; i < 4; i++)

{

supply[i] = max[i];

}

 

//выводим минимальный элемент среди максимальных

Array.Sort(max);

Console.WriteLine(Environment.NewLine + "Выбираем среди них наименьший: " + max[0]);

 

//определяем номер стратегии

for (int i = 0; i < 4; i++)

{

if (max[0] == supply[i])

{

Console.WriteLine(Environment.NewLine + "Оптимальной является стратегия под номером: " + Convert.ToInt32(i + 1));

i = 5;

}

}

 

//критерий Сэвиджа

int[] min = new int[4];

 

//ищем минимальные элементы в каждом столбце

for (int j = 0; j < 4; j++)

{

min[j] = matrix[0, j];

for (int i = 0; i < 4; i++)

{

if (min[j] > matrix[i, j]) min[j] = matrix[i, j];

}

}

 

Console.WriteLine();

Console.WriteLine("КРИТЕРИЙ СЭВИДЖА");

Console.WriteLine("MIN (минимальные элементы каждого столбца): ");

for (int i = 0; i < 4; i++)

{

Console.Write(min[i] + " ");

}

 

int[,] supply1 = new int[4, 4];

//вычитаем минимальные элементы из столбцов, которым они принадлежат и переписываем их в новую матрицу

for (int j = 0; j < 4; j++)

for (int i = 0; i < 4; i++)

{

supply1[i, j] = matrix[i, j] - min[j];

}

 

Console.WriteLine("Матрица рисков: " + Environment.NewLine);

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

{

Console.Write(supply1[i, j] + " ");

}

Console.WriteLine();

}

Console.WriteLine();

 

 

//ищем максимальные элементы в каждой строке - максимальные риски

for (int i = 0; i < 4; i++)

{

max[i] = supply1[i, 0];

for (int j = 0; j < 4; j++)

{

if (max[i] < supply1[i, j]) max[i] = supply1[i, j];

}

}

 

Console.WriteLine("Риски (наибольшие элементы каждой строки): ");

for (int i = 0; i < 4; i++)

{

Console.Write(max[i] + " ");

}

 

int[] supply11 = new int[4];

for (int i = 0; i < 4; i++)

{

supply11[i] = max[i];

}

 

Console.WriteLine();

//выводим минимальный элемент среди максимальных

Array.Sort(max);

Console.WriteLine("Нужно минимизировать риск со значением: " + max[0]);

 

//определяем номер стратегии

for (int i = 0; i < 4; i++)

{

if (max[0] == supply11[i])

{

Console.WriteLine("Оптимальной является стратегия под номером: " + Convert.ToInt32(i + 1));

i = 5;

}

}

 

 

//КРИТЕРИЙ ГУРВИЦА

Console.WriteLine();

Console.WriteLine("КРИТЕРИЙ РУРВИЦА (λ=0,25)");

 

int[] max1 = new int[4];

//ищем максимальные элементы в каждой строке

for (int i = 0; i < 4; i++)

{

max1[i] = matrix[i, 0];

for (int j = 0; j < 4; j++)

{

if (max1[i] < matrix[i, j]) max1[i] = matrix[i, j];

}

}

 

int[] min1 = new int[4];

//ищем минимальные элементы в каждой строке

for (int i = 0; i < 4; i++)

{

min1[i] = matrix[i, 0];

for (int j = 0; j < 4; j++)

{

if (min1[i] > matrix[i, j]) min1[i] = matrix[i, j];

}

}

 

for (int i = 0; i < 4; i++)

{

Console.WriteLine("Строка " + Convert.ToString(i + 1) + ": min1=" + min1[i] + " max1=" + max1[i]);

}

 

Console.WriteLine(Environment.NewLine + "Потери по критерию Гурвица: ");

double[] helpus = new double[4];

for (int i = 0; i < 4; i++)

{

helpus[i] = 0.25 * max1[i] + 0.75 * min1[i];

Console.WriteLine(helpus[i]);

}

 

double[] supply2 = new double[4];

for (int i = 0; i < 4; i++)

{

supply2[i] = helpus[i];

}

 

//выводим минимальный элемент

Array.Sort(supply2);

Console.WriteLine(Environment.NewLine + "Минимальные потери: " + supply2[0]);

 

//определяем номер стратегии

for (int i = 0; i < 4; i++)

{

if (helpus[0] == supply2[i])

{

Console.WriteLine(Environment.NewLine + "Оптимальной является стратегия под номером: " + Convert.ToInt32(i + 1));

i = 5;

}

}

 

 

Console.ReadKey();

}

}

}

 

 

Задание 4. Матричные игры

 

Определить нижнюю и верхнюю цену игры, заданной платёжной матрицей, где k – номер варианта.

Используя графическую интерпретацию, найти решение игры.

 

Имея вариант №6, получаем платежную матрицу.

 

Результаты работы программы.

 

 

Код основной части программы.

 

m: Integer; // Общее количество строк

n: Integer; // Общее количество столбцов

 

A: array[1..MaxSize, 1..MaxSize] of Real; // Платежная матрица игры

 

X: array[1..MaxSize] of Real; // Вероятность стратегии для строки

Y: array[1..MaxSize] of Real; // Вероятность стратегии для столбца

 

Z1: array[1..MaxSize] of Real; // Коэффициенты для итерации

Z2: array[1..MaxSize] of Real;

 

procedure UpDateMatrix;

 

public

end;

 

var

MainForm: TMainForm;

 

implementation

 

procedure TMainForm.UpDateMatrix;

 

var

 

I: Integer;

 

begin

 

for I:= 1 to Matrix.RowCount do

begin

Matrix.Cells[0, I]:= 'A' + IntToStr(I);

end;

 

for I:= 1 to Matrix.ColCount do

begin

Matrix.Cells[I, 0]:= 'B' + IntToStr(I);

end;

 

end;

 

// Процедура поиска наименьшего элемента в массиве

 

function Min(var Buf; n: Integer): Integer;

 

var

 

r: Real;

i, Index: Integer;

 

begin

 

Index:= 1;

r:= TRealArray(Buf)[1];

 

for i:= 2 to n do

begin

 

if TRealArray(Buf)[i] < r then

begin

Index:= i;

r:= TRealArray(Buf)[i];

end;

 

end;

 

Result:= Index;

 

end;

 

// Процедура поиска наибольшего элемента в массиве

 

function Max(var Buf; n: Integer): Integer;

 

var

 

r: Real;

i, Index: Integer;

 

begin

 

Index:= 1;

r:= TRealArray(Buf)[1];

 

for i:= 2 to n do

begin

 

if TRealArray(Buf)[i] > r then

begin

Index:= i;

r:= TRealArray(Buf)[i];

end;

 

end;

 

Result:= Index;

 

end;

 

procedure TMainForm.FormCreate(Sender: TObject);

begin

 

m:= 3;

n:= 2;

 

UpDateMatrix;

 

end;

 

procedure TMainForm.ExitBitBtnClick(Sender: TObject);

begin

Close;

end;

 

procedure TMainForm.PlayerBChange(Sender: TObject);

 

var

 

temp: Integer;

 

begin

 

temp:= 0;

 

try

 

temp:= StrToInt(PlayerB.Text) + 1;

 

except

Matrix.ColCount:= 2;

PlayerB.Text:= '1';

end;

 

if not ((temp > 1) and (temp < 102)) then

begin

Matrix.ColCount:= 6;

PlayerB.Text:= '5';

 

m:= 5;

 

end else

begin

m:= temp - 1;

Matrix.ColCount:= temp;

UpDateMatrix;

end;

 

end;

 

procedure TMainForm.PlayerAChange(Sender: TObject);

 

var

 

temp: Integer;

 

begin

 

try

 

temp:= StrToInt(PlayerA.Text) + 1;

 

except

Matrix.RowCount:= 2;

PlayerB.Text:= '1';

Exit;

end;

 

if not ((temp > 1) and (temp < 102)) then

begin

Matrix.RowCount:= 6;

PlayerB.Text:= '5';

n:= 5;

end else

begin

n:= temp - 1;

Matrix.RowCount:= temp;

UpDateMatrix;

end;

 

end;

 

procedure TMainForm.FindBitBtnClick(Sender: TObject);

 

var

 

C1, C2, CSUM, temp: Real;

i, j, k: Integer;

 

 

begin

 

temp:= 0;

 

for i:= 1 to n do

for j:= 1 to m do

begin

 

try

 

if String(Matrix.Cells[j, i]) = '' then

begin

ShowMessage('Введите значения матрицы!');

Exit;

end;

 

temp:= StrToFloat(String(Matrix.Cells[j, i]));

 

except

ShowMessage('Неправилный формат числа: "' + String(Matrix.Cells[j, i]) + '"');

Exit;

end;

 

A[i, j]:= temp;

 

end;

 

 

// Решение матрицы

 

// Обнуляем массивы

 

FillChar(X, SizeOf(X), 0);

FillChar(Y, SizeOf(X), 0);

FillChar(Z1, SizeOf(X), 0);

FillChar(Z2, SizeOf(X), 0);

 

k:= 0;

i:= 1;

 

repeat

 

Inc(k);

 

for j:= 1 to n do Z1[j]:= Z1[j] + A[i, j]; // Расчет элементов строки

 

j:= Min(Z1, n); // Поиск наименьшего в строке

 

Y[j]:= Y[j] + 1;

C1:= Z1[j] / k; // Нижняя цена игры

 

for i:= 1 to m do Z2[i]:= Z2[i] + a[i, j]; // Расчет элементов столбца

 

i:= Max(Z2, n); // Поиск наибольшего в столбце

X[i]:= X[i] + 1;

C2:= Z2[i] / K; // Верхняя цена игры

CSUM:= (C1 + C2) / 2; // Среднее значение цены игры

 

until k = IterationCount;

 

// Определение оптимальных смешанных стратегий

 

for i:= 1 to m do X[i]:= X[i] / k; // Для строк

 

for j:= 1 to n do Y[j]:= Y[j] / k; // для столбцов

 

Memo.Clear;

 

Memo.Lines.Add('Цена игры: ' + FloatToStr(CSUM));

Memo.Lines.Add('');

 

for i:= 1 to m do Memo.Lines.Add('P(A'+ IntToStr(i) + ') = ' + FloatToStr(x[i]));

 

Memo.Lines.Add('');

Memo.Lines.Add('----------');

Memo.Lines.Add('');

 

for i:= 1 to n do Memo.Lines.Add('P(B'+ IntToStr(i) + ') = ' + FloatToStr(y[i]));

 

end;

Задание 5. Задача об оптимальных назначениях

 

Фирма получила заказ на разработку пяти программных продуктов Z1,.., Z5. Эти работы могут выполнить пять программистов P1,…, Р5, которым (в силу особенностей их подготовки) требуется разное время на выполнение этих работ. Как следует распределить программистов по работам, чтобы суммарное время выполнения всех работ было наименьшим?

Замечание. Считать, что каждая работа выполняется только одним программистом.

Вариант 6
Программисты Работы
Z1 Z2 Z3 Z4 Z5
P1          
P2          
P3          
P4          
P5          

 

Результаты работы программы.

 

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

 

// Приведение матрицы

void privod(BOOL ToMax){

int i,j,umin;

for(i=0; i<n; i++)

for(j=0; j<n; j++)

vmax = vmax > v[i][j]? vmax: v[i][j];

if(ToMax){

for(i=0; i<n; i++)

for(j=0; j<n; j++)

u[i][j] = vmax-v[i][j];

}

else{

for(i=0; i<n; i++)

for(j=0; j<n; j++)

u[i][j] = v[i][j];

}

for(i=0; i<n; i++){ // Приведение по строкам.

umin=u[i][0];

for(j=1; j<n; j++) // Минимум в строке.

umin = umin < u[i][j]? umin: u[i][j];

for(j=0; j<n; j++)

u[i][j]-=umin;

}

for(j=0; j<n; j++){ // Приведение по столбцам.

umin=u[0][j];

for(i=1; i<n; i++) // Минимум в столбце.

umin = umin < u[i][j]? umin: u[i][j];

for(i=0; i<n; i++)

u[i][j]-=umin;

}

}

 

void mark0(){ // Отмечаем и зачеркиваем нули.

int i,j;

for(i=0; i<n; i++)

for(j=0; j<n; j++)

cross0[i][j]=0;

for(i=0; i<n; i++)

str0[i]=col0[i]=0;

for(i=0; i<n; i++)

for(j=0; j<n; j++)

if(u[i][j]==0)

if(str0[i]==0 && col0[j]==0){

cross0[i][j]=1;

str0[i]=col0[j]=1;

}

else

cross0[i][j]=-1;

}

 

int findcouple(int i){

int i1,j=0;

while(cross0[i][j]!=1) j++;

for(i1=0; i1<n; i1++)

// Если ноль зачеркнут и в этой строке еще не были

if(cross0[i1][j]==-1 &&!usestr[i1]){

// Если строка не помечена

if(!str0[i1]){

str0[i1]=1;

cross0[i1][j]=1;

cross0[i][j]=-1;

return 1;

}

else{

usestr[i1]=1;

if(findcouple(i1)){

cross0[i1][j]=1;

cross0[i][j]=-1;

return 1;

}

}

}

return 0;

}

 

// Нахождение паросочетания.

int upcouple(){

int i,j;

for(i=0; i<n; i++)

usestr[i]=0; // В какой строке побывали.

for(j=0; j<n; j++)

if(!col0[j])

for(i=0; i<n; i++)

if(cross0[i][j]==-1){ // Зачеркнутый ноль в непомеченном столбце.

usestr[i]=1;

if(findcouple(i)){

col0[j]=1;

cross0[i][j]=1;

return 1;

}

else

usestr[i]=0;

}

return 0;

}

 

// Нахождение максимального паросочетания.

void maxcouple(){

while(upcouple());

}

 

// Проверка на решенность задачи.

int fin(){

int i;

for(i=0; i<n; i++)

if(!str0[i])

return 0;

return 1;

}

 

// Нахождение минимальной опоры.

void minsupport(){

int i,j,b;

for(i=0; i<n; i++)

strround[i]=colround[i]=0;

for(i=0; i<n; i++)

strround[i]=1-str0[i];

b=1;

while(b){

b=0;

for(i=0; i<n; i++)

if(strround[i])

for(j=0; j<n; j++)

if(cross0[i][j]==-1)

colround[j]=1;

for(j=0; j<n; j++)

if(colround[j])

for(i=0; i<n; i++)

if(cross0[i][j]==1 &&!strround[i]){

b=1;

strround[i]=1;

}

}

}

 

// Перестановка нулей.

void rotate0(){

int i,j,min=vmax;

for(i=0; i<n; i++)

if(strround[i])

for(j=0; j<n; j++)

if(!colround[j])

if(min>u[i][j])

min=u[i][j];

for(i=0; i<n; i++)

if(!strround[i])

for(j=0; j<n; j++)

u[i][j]+=min;

for(j=0; j<n; j++)

if(!colround[j])

for(i=0; i<n; i++)

u[i][j]-=min;

}

 

 

Задание 6. Выбор оптимального варианта решения развития станции технического обслуживания

 

Станция технического обслуживания (СТО) выполняет ремонт и обслуживание автомобилей. В среднем в час на СТО прибывает λ автомобилей. СТО имеет m боксов для ремонта и гараж, в котором могут ожидать обслуживания v автомобилей. Среднее время ремонта автомобиля составляет t часов.

Руководство СТО может выбрать одно из двух решений по развитию, затраты на реализацию которых приблизительно равны:

· построить и оборудовать ещё один бокс для ремонта,

· увеличить гараж для ожидающих ремонта автомобилей ещё на k мест.

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

 

Парамет- ры СТО Номер варианта
№ 6
λ 1.0
m  
v  
t 3.5
k  

 

 

Результаты работы программы.

 

Код основной части программы, выполняющий решение.

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace sto_station

{

class Program

{

static void Main(string[] args)

{

double y=1;

double m=3;

double v=2;

double t=3.5;

double k=3;

 

Console.WriteLine("Исходные данные: " + y + " " + m + " " + v + " " + t + " " + k + Environment.NewLine);

 

Console.WriteLine("РЕШЕНИЕ");

Console.WriteLine("По условию задачи, нужно сравнить два варианта функционирования СТО:");

Console.WriteLine("а) увеличить значение m до " + Convert.ToString(m + 1));

Console.WriteLine("б) увеличить v на k мест, т.е. до v=" + Convert.ToString(v + k));

 

double u;

u = 1 / t;

u = Math.Round(u, 3);

Console.WriteLine("μ = 1 / t =" + "1/" + Convert.ToString(t) + " = " + Convert.ToString(u));

double a;

a = y / u;

a = Math.Round(a, 3);

Console.WriteLine("α = λ / μ = " + Convert.ToString(y) + "/" + Convert.ToString(u) + " = " + Convert.ToString(a));

 

Console.WriteLine(Environment.NewLine + "РАССМОТРИМ ПЕРВЫЙ ВАРИАНТ");

Console.WriteLine("Находим вероятность того, что в системе нет заявок:");

double p0;

 

double summ1 = 0;

double fact = 1;

summ1 = Math.Pow(a, 0) / 1;

 

for (int i = 1; i < m + 1; i++)

{

fact = fact * i;

summ1 = summ1 + ((Math.Pow(a, i)) / fact);

}

 

double summ2;

summ2 = 0;

 

for (int r = 1; r < m + 1 + 1; r++)

{

summ2 = summ2 + Math.Pow((a / (m + 1)), r);

}

 

summ2 = summ2 * Math.Pow(a, m + 1);

 

fact = 1;

for (int i = 1; i < m + +1 + 1; i++)

{

fact = fact * i;

}

summ2 = summ2 / fact;

 

p0 = 1 / (summ1 + summ2);

p0 = Math.Round(p0, 3);

Console.WriteLine("P(0)=" + Convert.ToString(p0));

 

double p_mv;

p_mv = 0;

p_mv = Math.Pow(a, (m + 1 + v)) * p0 / (Math.Pow(m + 1, v) * fact);

p_mv = Math.Round(p_mv, 3);

Console.WriteLine("P(m+v)=" + Convert.ToString(p_mv));

double q1;

q1 = 1 - p_mv;

Console.WriteLine("Относительная пропускная способность составит " + Convert.ToString(q1));

 

Console.WriteLine(Environment.NewLine + "РАССМОТРИМ ВТОРОЙ ВАРИАНТ");

Console.WriteLine("Находим вероятность того, что в системе нет заявок:");

 

double p0_1;

 

fact = 1;

summ1 = Math.Pow(a, 0) / 1;

 

for (int i = 1; i < m + 1; i++)

{

fact = fact * i;

summ1 = summ1 + ((Math.Pow(a, i)) / fact);

}

 

fact = 1;

for (int i = 1; i < m + +1 + 1; i++)

{

fact = fact * i;

}

double fact1 = fact;

fact = fact * (m + 1 - a);

 

p0_1 = 1 / (summ1 + ((Math.Pow(a, m + 1)) * (1 - (Math.Pow(a / (m + 1), v)))) / fact);

p0_1 = Math.Round(p0_1, 5);

Console.WriteLine("P(0)=" + Convert.ToString(p0_1));

double p_mv_1;

p_mv_1 = Math.Pow(a, (m + 1 + v)) * p0_1 / (Math.Pow(m + 1, v) * fact1);

p_mv_1 = Math.Round(p_mv_1, 3);

 

Console.WriteLine("P(m+v)=" + Convert.ToString(p_mv_1));

 

double q2;

q2 = 1 - p_mv_1;

Console.WriteLine("Относительная пропускная способность составит " + Convert.ToString(q2) + Environment.NewLine);

 

if (q1 > q2)

{

Console.WriteLine("q1>q2, поэтому первый вариант предпочтительнее");

}

 

if (q1 < q2)

{

Console.WriteLine("q1<q2, поэтому второй вариант предпочтительнее");

}

 

if (q1 == q2)

{

Console.WriteLine("q1=q2, оба варианта оптимальны");

}

 

Console.ReadKey();

}

}

}

 

 

Заключение

 

В контрольной работе выполнены следующие задания:

- разработана управленческая информационная систему для осуществления оптимального руководства компанией;

- решена задача одного станка с помощью решающего правила;

- решена задача двух станков при помощи алгоритма Джонсона;

- решена задача о транспортном предприятии тремя способами (критерий Вальда, Сэвиджа, Гурвица);

- решена задача матричной игры;

- решена задача об оптимальных назначениях с помощью венгерского способа;

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

 

 

<== предыдущая лекция | следующая лекция ==>
 | Практикум. Создание функциональной модели с помощью BPwin 4.0
Поделиться с друзьями:


Дата добавления: 2014-12-24; Просмотров: 446; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 4.564 сек.