КАТЕГОРИИ: Архитектура-(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) |
Контрольная работа
по дисциплине «_____________________________________________________»
на тему______________________________________________________________ ____________________________________________________________________ ____________________________________________________________________ ____________________________________________________________________
Студент_____________________________________________________________
Группа________________________
Оценка ________________________ (зачтено/незачтено)
Проверил ________________________ _____________________ (подпись и дата подписания) (долж., инициалы и фамилия)
Нормоконтролер ______________________________ _____________________________ (подпись, дата подписания) (инициалы и фамилия)
Волжский, 2014 г. Задание 1. Разработка управленческой информационной системы для осуществления оптимального руководства компанией
Компания "Лотос" занимается реализацией видео и аудио продукции. Имеет разветвлённую сеть магазинов и оптовых складов, как в Москве, так и в регионах. Необходимо разработать управленческую информационную систему для осуществления оптимального руководства данной компанией. Работы, которые необходимо выполнить для реализации проекта, непосредственно им предшествующие работы (1) и время (в неделях) выполнения работ (2). 1. Построить сетевой график. 2. Выполнить нумерацию вершин сетевого графика. 3. Рассчитать параметры сетевого графика: · ранние и поздние сроки начал и окончаний работ, · критическое время, · ранние и поздние сроки наступления событий,
· полные и свободные резервы времени выполнения работ. 4. Указать критический путь.
Результаты работы программы (исходные данные).
Результаты работы программы (таблица связей). Результаты работы программы (сетевой график).
Результаты работы программы (критический путь). Расчет параметров сетевого графика.
Данный сетевой график не нуждается в оптимизации. Сроки наступления событий:
Таким обрзом, длина критического пути — 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 (штрафу) за каждую единицу времени задержки. Найти оптимальный план обработки деталей, для которого суммарный штраф будет минимальным.
Вычислим сумму штрафов до изменения плана: Математическая постановка. Пусть Tj (σni) – время ожидания j -детали в случае использования σni -й перестановки для запуска деталей, где n – количество деталей; i – текущий номер перестановки, тогда:
Критерий: . Решающее правило: для определения оптимальной последовательности запуска деталей необходимо вычислить коэффициент, равный отношению величины штрафа к времени обработки, и упорядочить значения полученных коэффициентов в порядке их убывания. Вычисляем коэффициенты : Сортируем столбцы матрицы по строке с коэффициентами в порядке убывания и вычисляем новый суммарный штраф:
Оптимальный план обработки деталей:
Задание 3. Задача о транспортном предприятии
Транспортное предприятие должно определить уровень своих возможностей (оснащённости), чтобы удовлетворить потребности клиентов в услугах на планируемый период. Потребности клиентов в транспортных услугах (спрос) в течение планируемого периода заранее неизвестны. Специалисты предприятия считают, что объём этих потребностей может принять одно из четырёх значений: S1, S2, S3 или S4 тысяч тонн. Для каждого уровня потребностей существует наилучший уровень P1, P2, P3 или P4 оснащённости предприятия с точки зрения затрат (потерь). Используя критерии Вальда, Сэвиджа, Гурвица определить оптимальный вариант оснащённости предприятия. Замечание. При использовании критерия Гурвица считать, что ЛПР (лицо, принимающее решение) использует значение коэффициента оптимизма: · λ = 0.25 – для вариантов с чётными номерами,
Результаты работы программы (три Критерия).
Код основной части программы (три критерия).
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, которым (в силу особенностей их подготовки) требуется разное время на выполнение этих работ. Как следует распределить программистов по работам, чтобы суммарное время выполнения всех работ было наименьшим? Замечание. Считать, что каждая работа выполняется только одним программистом.
Результаты работы программы.
Код основной части программы, решающий задачу об оптимальных назначениях венгерским методом.
// Приведение матрицы 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 мест. Считая, процесс обслуживания автомобилей марковским процессом с пуассоновским потоком заявок и показательным распределением времени обслуживания, выбрать оптимальный вариант развития СТО по критерию максимума пропускной способности.
Результаты работы программы.
Код основной части программы, выполняющий решение.
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(); } } }
Заключение
В контрольной работе выполнены следующие задания: - разработана управленческая информационная систему для осуществления оптимального руководства компанией; - решена задача одного станка с помощью решающего правила; - решена задача двух станков при помощи алгоритма Джонсона; - решена задача о транспортном предприятии тремя способами (критерий Вальда, Сэвиджа, Гурвица); - решена задача матричной игры; - решена задача об оптимальных назначениях с помощью венгерского способа; - выбрать оптимальный вариант решения развития станции технического обслуживания при помощи марковских процессов.
Дата добавления: 2014-12-24; Просмотров: 452; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |