<<
>>

Приложение А. Текст моделирующей программы расчета расписания диагностирования

// LS.cpp : Defines the entry point for the console application.

#include "stdafx.h"

#include

#include

#include

#include

#include

#include

#include

using namespace std;

unsigned int N; // количество работ N

unsigned int T; // общее время выполнения всех работ

unsigned int Y; // число типов ресурсов

unsigned int Record; // наилучшее время выполнение всех работ

unsigned int *J; // множество работ j

unsigned int *D; // множество длительностей d работ j

unsigned int *R; // множество типов ресурсов R

unsigned int *Kr; // множество количеств k ресурсов каждого типа

unsigned int **K; // матрица количеств k (по столбцам) требуемых ресурсов

для работ j (по строкам)

unsigned int **Rt; // матрица возобновимых ресурсов [T x Y], кол-во каждого

ресурса i=1..Y в момент времени t=0..T

unsigned int **A; // матрица ресурсных ограничений

unsigned int *S; // массив времен запуска работ

unsigned int indexS;// индекс

unsigned int **Gr; // график выполнения работ [T x N], какая работа

выполняется в каждый момент времени

set *EL; // множество EL работ к рассмотрению

vector *Sj; // вектор порядка запуска работ

vector *Cmin; // вектор - оптимальное решение unsigned int timemin; // минимальное время работ

unsigned int *_T; // массив T ранних стартов работ

unsigned int *Q; // массив Q поздних стартов работ

class CSchedule {

private:

static unsigned int N; // количество работ

set *SET; // множество работ к рассмотрению unsigned int activeItem;// активная (выбранная) работа

vector *Sj;// вектор порядка запуска работ unsigned int *S; // массив времен запуска работ

unsigned int **Rt; // матрица возобновимых ресурсов [T x Y], кол-во

каждого ресурса i=1..Y в момент времени t=0..T

unsigned int **Gr; // график выполнения работ [T x N], какая работа

выполняется в каждый момент времени

unsigned int index, jndex;

public:

static unsigned int T; // максимальное время выполнения всех работ

// Создать новый объект 'расписание'.

Состояние определяется несколькими множествами и переменными

CSchedule( unsigned int *savedS,

unsigned int **savedRt,

unsigned int **savedGr, set *savedSET, vector *savedSj, unsigned int activeItem

)

{

// Инициализация матрицы S

S = new unsigned int [N];

for (index = 0; index < N; index++)

S[index] = savedS[index];

// Инициализация матрицы Rt

Rt = new unsigned int * [T];

for (index = 0; index < T; index++) {

Rt[index] = new unsigned int [Y];

for (jndex = 0; jndex < Y; jndex++) Rt[index][jndex] = savedRt[index][jndex];

}

// Инициализация матрицы Gr

Gr = new unsigned int * [T];

for (index = 0; index < T; index++)

{

Gr[index] = new unsigned int [N];

for (jndex = 0; jndex < N; jndex++) Gr[index][jndex] = savedGr[index][jndex];

}

// Заполнение множества SET

SET = new set;

for (std::set::const_iterator it = savedSET- >begin(); it != savedSET->end(); it++)

{

SET->insert(*it);

}

Sj = new vector;

for (std::vector::const iterator it = savedSj- >begin(); it != savedSj->end(); it++)

{

Sj->push back(*it);

}

// выбранная работа activeItem this->activeItem = activeItem;

}

~CSchedule()

{

delete[] S;

for (index = 0; index < T; index++) {

delete[] Rt[index];

delete[] Gr[index];

}

delete[] Rt; delete[] Gr; delete SET; delete Sj;

}

/*void addItem(unsigned int x)

{

SET.insert(x);

}*/

void removeactiveItem(void)

{

SET->erase(activeItem);

}

void calculateSchedule(void)

{

unsigned int tau, time; // переменные времени

time = 0;

bool f = true; // можно ли размещать работу, начиная со времени time

index = 0;

while (index < Y)

{

tau = time;

while (tau < (time + D[activeItem - 1]))

{

if (K[activeItem - 1][index] > Rt[tau][index])

{

f = false;

time += 1; break;

}

tau += 1;

}

if (!f)

{

index = 0;

f = true;

continue;

}

else

index += 1;

}

Sj->push back(activeItem);

S[activeItem - 1] = time;

for (tau = time; tau < (time + D[activeItem - 1]); tau++)

{

for (index = 0; index < Y; index++)

Rt[tau][index] -= K[activeItem - 1][index]; Gr[tau][activeItem - 1] = activeItem;

}

}

void readState( unsigned int **readS,

unsigned int ***readRt,

unsigned int ***readGr, set **readSET, vector **readSj

)

{

*readS = S;

*readRt = Rt;

*readGr = Gr;

*readSET = SET;

*readSj = Sj;

}

};

// Функция выбора работы из EL

unsigned int fetchIndex(set *EL) {

unsigned int ind = *EL->begin();

unsigned int min T = Q[ind - 1];

for (std::set::const_iterator i = EL->begin(); i != EL- >end(); i++)

{

if (Q[*i - 1] < min T) // найти работу с минимальным значением времени старта в позднем расписании

{

min_T = Q[*i - 1];

ind = *i; // номер работы

}

}

return ind;

}

// Заполнить значения главных переменных N, T

unsigned int CSchedule::N = 20;

unsigned int CSchedule::T = 0; // значение вычисляется позже (сделать

нормальный обработчик)

// Рекурсивная функция вычисления алгоритма BnB для задачи RCPSP void Branch(unsigned int *savedS,

unsigned int **savedRt,

unsigned int **savedGr,

set *savedSET, vector *savedSj

)

{

set *SET; vector *Sj;

unsigned int *S;

unsigned int **Rt;

unsigned int **Gr;

unsigned int j;

for (std::set::const_iterator i = savedSET->begin(); i != savedSET->end(); i++)

{

j = (*i);

CSchedule schedule(savedS, savedRt, savedGr, savedSET, savedSj, j);

schedule.calculateSchedule();

schedule.removeactiveItem();

schedule.readState(&S, &Rt, &Gr, &SET, &Sj);

// вывод ----------------------------------------------------------------

cout Canvas->MoveTo(0, 0);

b = Yb - tangQ2*Xb;

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

{

pOut1->Canvas->MoveTo(i, (unsigned int)(tangQ2*i) + b); pOut1->Canvas->LineTo(i+1, (unsigned int)(tangQ2*(i+1)) + b);

}

ImageOut->Picture->Graphic = pOut1;

double a1, a3;

double da1, da2;

a1 = (atan(tangQ2) - atan(tangQ1)) * 180 / M PI;

a3 = (atan(tangB3) - atan(tangA3)) * 180 / M PI;

da2 = fabs(a3 - a1);

Memo1->Lines->Add("Метод наименьших квадратов.");

Memo1->Lines->Add("Тангенс угла первой стрелки tgA = "+ FloatToStr(tangQ1) + ";");

Memo1->Lines->Add("Тангенс угла второй стрелки tgB = "+ FloatToStr(tangQ2) + ";");

Memo1->Lines->Add("Угол между стрелками a = " + FloatToStrF(a1, ffFixed,

5, 3) + ";");

Memo1->Lines->Add("");

Memo1->Lines->Add("Разработанный метод.");

Memo1->Lines->Add("Тангенс угла первой стрелки tgA = "+ FloatToStr(tangA3) + ";");

Memo1->Lines->Add("Тангенс угла второй стрелки tgB = "+ FloatToStr(tangB3) + ";");

Memo1->Lines->Add("Угол между стрелками a = " + FloatToStrF(a3, ffFixed,

5, 3) + ";");

Memo1->Lines->Add("");

Memo1->Lines->Add("Погрешность

Memo1->Lines->Add("Для разработанного метода абсолютная погрешность d = "+ FloatToStrF(da2, ffFixed, 5, 3) + " градусов");

delete pOut1;

}

//-----------------------------------------------------------------

void __fastcall TfmMain::BitBtn1Click(TObject *Sender)

{

// Когда пользователь выбрал нужный файл

if (OpenPictureDialog2->Execute())

{

// Выведем его полный путь

Edit1->Text = OpenPictureDialog2->FileName;

// Отобразим на экране

pIn2 = new Graphics::TBitmap();

pIn2->LoadFromFile(Edit1->Text);

// Отрисовать на форме

Image2->Picture->LoadFromFile(Edit1->Text);

// отобразить параметры картинки

lbWidth->Caption = IntToStr(imW);

lbHeight->Caption = IntToStr(imH);

}

}

<< | >>
Источник: Лысенко Ян Александрович. МОДЕЛЬ, МЕТОД И ОПТИКО-ЭЛЕКТРОННОЕ УСТРОЙСТВО ПАРАЛЛЕЛЬНОЙ ОБРАБОТКИ ИЗОБРАЖЕНИЙ ИНДИКАТОРОВ ПАНЕЛИ ПРИБОРОВ. Диссертация на соискание ученой степени кандидата технических наук. Курск - 2019. 2019

Скачать оригинал источника

Еще по теме Приложение А. Текст моделирующей программы расчета расписания диагностирования:

  1. Содержание
  2. Приложение А. Текст моделирующей программы расчета расписания диагностирования