Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Основы теории расписаний


Автор: MrDmitry 12.10.2015, 15:42
Здравствуйте, возник такой вопрос. У меня есть задание


Цитата

Разработать приложение для составления расписания системы конвейерного типа (задача Джонсона). 
Входными данными являются количество машин и работ. Результат выполнения программы: расписание в форме таблицы, суммарное время простоев по каждой машине и время завершения всех работ.


На сколько я понимаю задача Джонсона решается для 2 машин. Но если выходными данными является кол-во машин и работ, то это подразумевает что машин может быть больше 2 и соответственно решить задачу при помощи алгоритма Джонсона уже не получиться. 
Вопрос: Я что то не правильно понял или задание сформулировано не правильно? 

Автор: Агрох 13.10.2015, 13:08
Как вариант: рассчитываешь порядок подачи деталей для первой и второй машины, потом считаешь, что первая и вторая машина это одна машина (машина 1-2), у которой есть некое общее время между подачей детали на вход и выдачей готовой на выходе. Теперь рассматриваешь эту машину 1-2 и машину 3. И т.д.: машина 1-2-3 и машина 4, машина 1-2-3-4 и машина 5...

Автор: MrDmitry 14.10.2015, 18:41
Я извиняюсь, а вы не могли бы помочь с реализацией задачи Джонсона для 2 машин? Накидал вот такую вот программу, но она выдает мне критическую ошибку (

Автор: MrDmitry 14.10.2015, 21:51
Ну или хотя бы подскажите почему ошибка выходит )

Автор: MrDmitry 15.10.2015, 20:46
Снова попытался реализовать алгоритм джонсона

Код

Type TMinus=array[0..3] of integer;
....
function TMain.Minus: TMinus;
var
 min,min1,i:integer;
 machine1,machine2:Tminus;
begin
min:=25;
min1:=25;
//Минимальное число 1 машины
for i := 0 to length(matrix[0])-1 do
 begin
  if (matrix[0,i]>0) and (matrix[0,i]<min) then
  begin
   min:=matrix[0,i];
   Machine1[0]:=matrix[0,i];
   Machine1[1]:=matrix[1,i];
   Machine1[2]:=i;
   Machine1[3]:=0;
  end;
 end;

//Минимальное число 2 машины
for i := 0 to length(matrix[0])-1 do
begin
 if (matrix[1,i]>0) and (matrix[1,i]<min1) then
 begin
  min1:=matrix[1,i];
  Machine2[0]:=matrix[0,i];
  Machine2[1]:=matrix[1,i];
  Machine2[2]:=i;
  Machine2[3]:=1;
 end;
end;

if min<=min1 then
 begin
  Result[0]:=Machine1[0];
  Result[1]:=Machine1[1];
  Result[2]:=Machine1[2];
  Result[3]:=Machine1[3];
 end
else
 begin
  Result[0]:=Machine2[0];
  Result[1]:=Machine2[1];
  Result[2]:=Machine2[2];
  Result[3]:=Machine2[3];
 end;

matrix[0,Result[2]]:=0;
matrix[1,Result[2]]:=0;

Result[2]:=Result[2]+1;
end;

procedure TMain.OptimizationJhonson;
var
 i,j:integer;
 MinusMatrix:TMinus;
 M:Tmatrix;
 Tmax, Cmax:integer;
begin
SetLength(m, 4,length(matrix[0]));
for i := 0 to length(matrix[0])-1 do
begin
 minusMatrix:=minus();
 m[0,i]:=MinusMatrix[0];
 m[1,i]:=MinusMatrix[1];
 m[2,i]:=MinusMatrix[2];
 m[3,i]:=MinusMatrix[3];
end;


for i := 0 to length(m[0])-1 do
begin
if m[3,i]=0 then
 begin
  StringGrid2.Cells[i+1,0]:=inttostr(m[2,i]);
  StringGrid2.Cells[i+1,1]:=inttostr(m[0,i]);
  StringGrid2.Cells[i+1,2]:=inttostr(m[1,i]);
 end;
end;
for i := 0 to length(m[0])-1 do
begin
if m[3,i]=1 then
 begin
  StringGrid2.Cells[StringGrid2.ColCount-i,0]:=inttostr(m[2,i]);
  StringGrid2.Cells[StringGrid2.ColCount-i,1]:=inttostr(m[0,i]);
  StringGrid2.Cells[StringGrid2.ColCount-i,2]:=inttostr(m[1,i]);
 end;
end;
end;


Вроде бы все считается, но почему то иногда в StrinGrid 2 встречаются пустые ячейки... Не понимаю почему (

Автор: MrDmitry 19.10.2015, 20:19
Блин помогите сделать последний рывок и доделать эти задания. Не могу сделать задачу Джонсона для 2 машин. А именно правильно вывести данные в таблицу и все потом посчитать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)