Дипломная работа: Разработка математической модели и ПО для задач составления расписания

end;

procedure Full_Integer_Simplex(var x:MyArray_X; a:MyArray; m,n:integer);

{Полностью целочисленный алгоритм задачи линейного целочисленного

программирования,

см. Ху Т. "Целочисленное программирование и потоки в сетях", стр. 300-309,

a - матрица размером m+n+2*n+1, по аналогии:

Требуется найти максимум

z= - 10x1 - 14x2 - 21x3

2x1 + 2x2 + 7x3 >= 14

8x1 + 11x2 + 9x3 >= 12

9x1 + 6x2 + 3x3 >=10,

тогда матрица а будет выглядеть:

1 10 14 21

0 -1 0 0

0 0 -1 0

0 0 0 -1

-14 -2 -2 -7

-12 -8 -11 -9

-10 -9 -6 -3

0 0 0 0,

процедура возвращает вектор X, первые m компонент которого - искомое решение,

если последняя компонента вектора = 1, то решения не существует или оно = бесконечности}

var i,i1:integer;

j,j1:integer;

alfa:real;

begin

repeat

i:=1;

while (i=0) do Inc(i); {производящая строка}

if i

j:=1;

while (j=0) do Inc(j);

if j

for i1:=1 to n-1 do if (a[i,i1]<0) and Lexikogr_few(a,m,n,i1,j) then j:=i1; {лексикографически

минимальный столбец}

{выбор альфа}

if j

{Writeln(i,' ',j);readln;}

alfa:=0;

for i1:=1 to n-1 do if a[i,i1]<0 then

begin

j1:=Find_nu(a,m,n,j,i1);

if (j1>0) and (-a[i,i1]/j1>alfa) then alfa:=-a[i,i1]/j1;

end;

{writeln(alfa,' ',i,' ',j);readln;}

{получение отсечения Гомори}

for i1:=0 to n-1 do if a[i,i1]>0 then a[m-1,i1]:=round(Int(a[i,i1]/alfa))

else begin

a[m-1,i1]:=round(Int(a[i,i1]/alfa));

if Frac(a[i,i1]/alfa)<>0 then a[m-1,i1]:=a[m-1,i1]-1;

end;

Step_Dual_simplex(a,m,n,m-1,j);

end;

end;

until (i>=m-1) or (j>=n);

for i:=0 to m-1 do x[i]:=round(a[i,0]);

if j>=n then x[m-1]:=1 else x[m-1]:=0;

end;

procedure Step_One_Simplex(var a:MyArray; m,n,i:integer);

var i1,i2:integer;

{Один шаг прямого целочисленного метода (производящая строка - последняя

i - производящий столбец)}

begin

for i1:=0 to m-2 do a[i1,i]:=a[i1,i]/(-a[m-1,i]);

for i2:=0 to n-1 do

for i1:=0 to m-2 do

if i2<>i then a[i1,i2]:=a[i1,i2]+a[i1,i]*a[m-1,i2];

end;

procedure Direct_Integer_Simplex(var x:MyArray_X; a:MyArray; m,n:integer);

{Прямой целочисленный алгоритм задачи целочисленного линейного программирования,

см. Ху Т. "Целочисленное программирование и потоки в сетях", стр. 344-370,

a - матрица размером m+n+3*n+1 по аналогии:

требуется максимизировать

z = x1 + x2 + x3

-4x1 + 5x2 + 2x3 <= 4

-2x1 + 5x2 <= 5

3x1 - 2x2 + 2x3 <= 6

2x1 - 5x2 <= 1

тогда матрица а будет выглядеть:

0 -1 -1 -1

4 -4 5 2

5 -2 5 0

6 3 -2 2

1 2 -5 0

0 -1 0 0

0 0 -1 0

0 0 0 -1

10 1 1 1 - в этой строке первое число - грубая max суммы небазисных переменных

0 0 0 0 - строка для отсечения Гомори,

алгоритм работает только при a[i,0]>=0

возвращает вектор X - на месте единичной матрицы искомое решение,

если в последней компоненте единица - ошибка при расчетах}

var i,j,i1,j1:integer;

bool:boolean;

b,b1,b2:array of byte;

r:real;

begin

SetLength(b,m);SetLength(b1,m);

for i:=0 to m-1 do b1[i]:=0;

{проверка условия оптимальности}

bool:=false;

for j:=1 to n-1 do if a[0,j]<0 then bool:=true;

while bool do begin

{поиск производящего столбца}

bool:=false;j1:=0;

for j:=1 to n-1 do begin

if a[m-2,j]>0 then

begin

for i:=0 to m-3 do a[i,j]:=a[i,j]/a[m-2,j];

if not bool then begin j1:=j;bool:=true;end else if Lexikogr_few(a,m,n,j,j1)

then j1:=j;

end;

end;

{поиск производящей строки}

for j:=1 to n-1 do

if a[m-2,j]>0 then

for i:=0 to m-3 do a[i,j]:=a[i,j]*a[m-2,j];

for i:=0 to m-1 do b[i]:=0;

i:=1; while (i

i1:=i;

while (i

if (a[i,j1]>0) and (a[i,0]/a[i,j1]

Inc(i);

end;

if i1

if a[i1,0]/a[i1,j1]<1 then begin

b[i1]:=1;

for i:=1 to m-2 do

if (a[i,j1]>0) and (a[i,0]/a[i,j1]<1) then b[i]:=1;

for i:=1 to m-2 do if (b[i]=1) and (b1[i]=1) then i1:=i;

end;

{формирование отсечения Гомори}

for i:=0 to n-1 do if a[i1,i]>0 then a[m-1,i]:=round(Int(a[i1,i]/a[i1,j1]))

else begin

a[m-1,i]:=round(Int(a[i1,i]/a[i1,j1]));

if Frac(a[i1,i]/a[i1,j1])<>0 then a[m-1,i]:=a[m-1,i]-1;

end;

Step_One_Simplex(a,m,n,j1);

end;

bool:=false;

if i1

b2:=b1;b1:=b;b:=b2;

for j:=1 to n do if a[0,j]<0 then bool:=true;

end;

{for j1:=0 to n-1 do Write(a[0,j1]:1:0,' ');Writeln;readln;}

end;

for i:=0 to m-2 do x[i]:=round(a[i,0]);

if i1>=m-1 then x[m-1]:=1 else x[m-1]:=0;

Finalize(b);Finalize(b1);

end;

Проектирование трансляторов
ЛЕКЦИЯ 1 СУЩНОСТЬ ПРЕДМЕТА. СОДЕРЖАНИЕ КП. СРОКИ. ОРГАНИЗАЦИЯ РАБОТ. МАТЕМАТИЧЕСКИЙ АППАРАТ. СТРУКТУРНАЯ СХЕМА ТРАНСЛЯТОРА. ПРОХОДЫ ТРАНСЛЯТОРА ...
чении i-ой строки и j-го столбца записывается отношение предшес-
Рассмотрим алгоритм составления матрицы предшествования.
Раздел: Рефераты по информатике, программированию
Тип: реферат
Основы C
Кафедра: Автоматика и Информационные Технологии ОСНОВЫ С ОГЛАВЛЕНИЕ Введение Глава 1. Основы языка Си 1.1. Алфавит 1.2. Основные конструкции Си 1.3 ...
} В данной программе определены две целочисленные переменные I и J.
{int i,j,k,i1,s,t,a[K][K];
Раздел: Рефераты по информатике, программированию
Тип: учебное пособие
Логическое и функциональное программирование
ЛОГИЧЕСКОЕ И ФУНКЦИОНАЛЬНОЕ ПРОГРАММИРОВАНИЕ Введение Целью логического и функционального программирования является вывод решений и они тесно связаны ...
Если ее нат, перейти к шагу 5. Если есть, записать в таблицу вывода новую строку со значениями полей № варианта = var, Переменная = Переменная из исходной вершины таблицы дерева ...
При составлении импликанты исключаются переменные, для которых единица имеется и в части отрицания для переменной и в части, где отрицание отсутствует.
Раздел: Рефераты по информатике, программированию
Тип: учебное пособие
Определение стоимости бизнеса действующего предприятия на примере ООО ...
Министерство общего и профессионального образования Российской Федерации. Пермский Государственный Университет Центр дополнительного экономического ...
Расписание движения общественного транспорта
ERROR,I1)",last,I,1,last){ или увеличилась на }) ~AEMacro(IfCellDelta("@IF(I1,I1,ERROR,I1)",first,<>,"@IF(I1,I1,ERROR,I1)",last,I,1,first,I,1,last,m%){332,72}) ~AEMacro(If("@IF(I1 ...
Раздел: Рефераты по финансовым наукам
Тип: дипломная работа
Информатика и компьютерная техника
Министерство образования и науки Украины Харьковский национальный университет им. В.Н. Каразина Методические рекомендации по курсу "Информатика и ...
Составление алгоритмов является не только трудоемким процессом, но и, в некотором смысле искусством, поэтому так ценятся хорошие элегантные алгоритмы.
2. Составить алгоритм определения наибольшего элемента матрицы А(n,m) с указанием его номера строки и столбца.
Раздел: Рефераты по информатике, программированию
Тип: учебное пособие