Приложение А. Текст моделирующей программы расчета расписания диагностирования
// 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);
}
}