Методические указания и примеры выполнения задания №6 " Моделирование процессов принятия решений"

Вид материалаМетодические указания
Подобный материал:
1   2   3   4   5   6   7   8   9   10

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


struct property {

char name[12];

char language[2];

char methods[5];

};


/* Языки программирования

0-нет

1-C,C++

2-ASM

3-JAVA

Методы

0-нет

1-работа с графикой

2-алгоритмы упаковки/распаковки данных

3-математические методы

4-работа со звуком

5-работа с базами данных

6-работа с динамическими структурами данных,списки

7-программирование на низком уровне быстродействующих процедур

8-алгоритмы защиты программы от взлома

*/


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

const

// список претендентов на участие в работе

property pretenders[] = { "Иванов", {1,0}, {1,3,6,2,0},

"Петров", {3,1}, {5,4,8,2,0},

"Сидоров", {2,1}, {3,4,7,0,0},

"Никонов", {1,2}, {2,3,6,7,4},

"Волков", {3,1}, {5,3,6,0,0},

"Табуреткин", {1,2}, {1,2,4,6,7},

"Килограмов", {1,0}, {1,2,3,0,0},

"Ельцин", {1,0}, {3,2,6,0,0},

"Путин", {2,1}, {4,6,3,2,1},

"Коржаков", {2,1}, {7,5,3,8,0},

"Зюганов", {1,0}, {3,8,1,0,0},

"Яблоков", {1,2}, {1,2,3,5,0},

"Карелин", {1,2}, {4,5,6,8,0},

"Помидоров", {2,1}, {3,8,6,7,0},

"Гордон", {1,0}, {8,6,2,5,0},

"Миронов", {1,2}, {1,2,8,3,0},

"Пивоваров", {1,0}, {1,6,3,0,0},

"Литвинов", {1,0}, {1,5,8,4,0},

"Лукин", {1,0}, {6,2,8,0,0},

"Сотин", {1,0}, {8,3,6,0,0} };


// коэффициенты быстродействия машин

char compnames[][21] = {

"PII 450", "PII Celeron 300",

"AMD K6-II 350", "Intel Pentium 233MMX",

"Intel Pentium 200MMX", "Intel Pentium 166MMX",

"Intel Pentium 133", "i80486 66" };

float ratio[] = { 10.0, 8.5, 8.0, 7.1, 6.8, 5.9, 3.9, 2.0 };


// "неудачные" сообщения

char MiseryMessages[][120] = {

"Однажды в его доме отключили электричество, в\n"

"результате чего потерялись некоторые данные.",

"Однажды, пойдя в магазин за хлебом, он подскользнулся\n"

"на банановой корке и упал, в результате чего сломал палец.",

"Однажды его друг принес на дискетке вирус, в\n"

"результате чего был потерян программистский софт."

};

// время прибавляемое вследствие неудачи

int MiseryHours[] = { 12, 55, 26 };


// "удачные" сообщения

char HappinessMessages[][80] = {

"Он купил нужную для себя книгу.",

"На него свалился халявный Internet и он накачал там\n"

"кучу полезной информации.",

"Он встретил знакомого программиста и тот поделился\n"

"своим опытом."

};

// время вычитаемое вследствие удачи

int HappinessHours[] = { 14, 47, 29 };


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

void FatalError (int code);


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

property workers[8];

int computers[8];

int langprior[3];

int v[8];

float k[8];

float f[8];

int q[8];

int HappinessMan;

int HappinessNum;

int MiseryMan;

int MiseryNum;

ofstream os;


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

void main()

{


bool tmp[20];

for (int i=0;i<20;i++) tmp[i]=FALSE;

os.open("Lab6.out");

os << "Виды работ:" << endl

<< "----------------------------------" << endl;

os << "1-работа с графикой" << endl

<< "2-алгоритмы упаковки/распаковки данных" << endl

<< "3-математические методы" << endl

<< "4-работа со звуком" << endl

<< "5-работа с базами данных" << endl

<< "6-работа с динамическими структурами данных,списки" << endl

<< "7-программирование на низком уровне быстродействующих процедур" << endl

<< "8-алгоритмы защиты программы от взлома" << endl << endl;


/*

Так как видов работ всего 8, то необходимо выбрать 8 участников

пректа. Они выбираются случайным образом и после выбора участников

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

*/

clrscr();

cout << "Выбор участников проекта из списка претендентов ... " << endl;

randomize();

for (i=0;i<8;i++) {

int num;

while (tmp[num=random(20)]);

tmp[num]=TRUE;

memcpy(&workers[i],&pretenders[num],sizeof(property));

}


os << endl << "Из списка претендентов были выбраны следующие личности:" << endl;

os << "-------------T------------T--------------------------¬" << endl

<< "¦ Фамилия ¦ Язык ¦ Опыт работы с (см. выше) ¦" << endl

<< "+------------+------------+--------------------------+" << endl;


for (i=0;i<8;i++) {

os << '¦';

os.width(11);

os << workers[i].name << " ¦";

int n=0;

for (int j=0;j<2;j++)

switch (workers[i].language[j]) {

case 1: os << "C,C++ "; n++; break;

case 2: os << "ASM "; n++; break;

case 3: os << "JAVA "; n++; break;

}

if (n==1) os << " ¦";

else os << '¦';

for (j=0;j<5;j++) {

os.width(5);

if (workers[i].methods[j]!=0) os << int(workers[i].methods[j]);

else os << ' ';

}

os << " ¦" << endl;

}

os << "L------------+------------+---------------------------" << endl;


for (i=0;i<8;i++) tmp[i]=FALSE;

cout << "Проверка знаний участников проекта для выполнения задания ..." << endl;

for (i=0;i<8;i++)

for (int j=0;j<5;j++)

if (workers[i].methods[j]!=0) tmp[workers[i].methods[j]-1]=TRUE;


for (i=0;i<8;i++)

if (!tmp[i]) FatalError(1);


// Рассчет приоритетов выбора языка программирования

cout << "Рассчет приоритетов выбора языка программирования ..." << endl;

for (i=0;i<3;i++) langprior[i]=0;

for (i=0;i<8;i++)

for (int j=0;j<2;j++)

if (workers[i].language[j]!=0) langprior[workers[i].language[j]-1]++;

float sum=0;

for (i=0;i<3;i++) sum+=langprior[i];

float t[3];

for (i=0;i<3;i++) {

t[i]=langprior[i]/sum;

langprior[i]=t[i]*101;

}


os << endl << "Рассчитанные приоритеты для языков программирования:" << endl;

os << "C,C++ " << langprior[0] << '%' << endl;

os << "ASM " << langprior[1] << '%' << endl;

os << "JAVA " << langprior[2] << '%' << endl;


cout << "Выбор языка программирования ..." << endl;

int language = random(100)+1;

sum=0;

for (i=0;i<3;i++) {

sum+=langprior[i];

if (language
}


os << endl << "Выбранный язык программирования: ";

switch (language) {

case 1: os << "C,C++" << endl; break;

case 2: os << "ASM" << endl; break;

case 3: os << "JAVA" << endl; break;

}


cout << "Проверка на знание участниками проекта языка программирования ..." << endl;

for (i=0;i<8;i++) {

bool next=FALSE;

for (int j=0;j<2;j++)

if (workers[i].language[j]==language) next=TRUE;

if (!next) FatalError(2);

}


// Распределение задач между участниками проекта

cout << "Распределение задач между участниками проекта ..." << endl;

int poluch[8];

for (i=0;i<8;i++) tmp[i]=FALSE;


for (i=0;i<8;i++) { // для каждого задания

float priority[8];

for (int j=0;j<8;j++) { // для каждого участника

bool Ok=FALSE;

char num=0;

if (!tmp[j]) {

for (int k=0;k<5;k++) {

if (workers[j].methods[k]!=0) num++;

if (workers[j].methods[k]==i+1) Ok=TRUE;

}

if (Ok) priority[j]=100/num;

else priority[j]=0;

}

else priority[j]=0;

}


int max=0;

for (j=1;j<8;j++)

if (priority[j]>priority[max]) max=j;


int num=0;

for (j=0;j<8;j++)

if (priority[j]==0) num++;


if (num==8) {

bool changed=FALSE;

int n1=-1,n2=-1;

do {

for (j=n1+1;j<8;j++)

if (tmp[j]) {

for (int k=0;k<5;k++)

if (workers[j].methods[k]==i+1) { n1=j; break; }

if (n1==j) break;

}


bool Ok=FALSE;

for (j=n2+1;j<8;j++)

if (!tmp[j]) {

for (int k=0;k<5;k++)

if (workers[j].methods[k]==poluch[n1]) { n2=j; break; }

if (n2==j) { Ok=TRUE; break; }

}

if (!Ok) changed=FALSE;

else {

poluch[n2]=poluch[n1];

poluch[n1]=i+1;

tmp[n1]=TRUE;

tmp[n2]=TRUE;

changed=TRUE;

}

}

while (changed);

}

else {

poluch[max]=i+1;

tmp[max]=TRUE;

}

}


cout << "Проверка правильности раздачи оператором заданий ..." << endl;

for (i=0;i<8;i++) {

bool Ok=FALSE;

for (int j=0;j<5;j++)

if (workers[i].methods[j]==poluch[i]) { Ok=TRUE; break; }

if (!Ok) FatalError(3);

}


cout << "Рассчет коэффициентов \"квалификации\" для каждого участника проекта ..." << endl;

for (i=0;i<8;i++) {

float n=0;

for (int j=0;j<5;j++)

if (workers[i].methods[j]!=0) n++;

f[i]=1/n;

}


cout << "Распределение компьютеров между участниками проекта ..." << endl;

for (i=0;i<8;i++) tmp[i]=FALSE;

for (i=0;i<8;i++) {

int num;

while(tmp[num=random(8)]);

tmp[num]=TRUE;

computers[i]=num;

}


os << endl << "Распределение заданий и компьютеров между участниками проекта:" << endl;

os << "-------------T---------------T----------------------¬" << endl

<< "¦ Фамилия ¦ Номер задания ¦ Процессор ¦" << endl

<< "+------------+---------------+----------------------+" << endl;

for (i=0;i<8;i++) {

os << '¦';

os.width(11);

os << workers[i].name << " ¦";

os.width(8);

os << poluch[i] << " ¦";

os.width(21);

os << compnames[computers[i]] << " ¦" << endl;

}

os << "L------------+---------------+-----------------------" << endl;


/*

Генерация человека, которому повезло. Если выпало число 8, то такого

человека нет.

*/

cout << "Генерация человека, которому повезло ..." << endl;

HappinessMan=random(9);

HappinessNum=random(3);

/*

Генерация человека, которому не повезло. Если выпало число 8, то такого

человека нет.

*/

cout << "Генерация человека, которому не повезло ..." << endl;

MiseryMan=random(9);

MiseryNum=random(3);


if (HappinessMan!=8)

os << endl << workers[HappinessMan].name << "y повезло. "

<< HappinessMessages[HappinessNum] << endl

<< "Это обстоятельство снизило время его работы на "

<< HappinessHours[HappinessNum] << " часов." << endl;


os << endl;

if (MiseryMan==HappinessMan && MiseryMan!=8)

os << "Теперь ";

if (MiseryMan!=8)

os << workers[MiseryMan].name << "y не повезло. "

<< MiseryMessages[MiseryNum] << endl

<< "Это обстоятельство увеличило время его работы на "

<< MiseryHours[MiseryNum] << " часов." << endl;


/*

Среднее время выполнения своей части проекта участником v=200 часов

Время зависит от предыдущих сгенерированных характеристик:

v=v+(10-ratio[i])*3 - увеличение времени из-за скорости процессора машины;

v=v+(1-f[i])*30 - увеличение времени за счет квалификации программиста

v=v-HappinessHours[HappinessNum] - уменьшение за счет удачи

v=v+MiseryHours[MiseryNum] - временная прибавка из-за неудачи

*/

cout << "Рассчет времени выполнения участником своей части проекта ..." << endl;

for (i=0;i<8;i++) {

v[i]=200+(10-ratio[computers[i]])*3;

v[i]+=(1-f[i])*30;

if (i==HappinessMan) v[i]-=HappinessHours[HappinessNum];

if (i==MiseryMan) v[i]+=MiseryHours[MiseryNum];

}


os << endl << "Временные затраты участников проекта на выполнение заданий:" << endl;

os << "-------------T--------------¬" << endl

<< "¦ Фамилия ¦ Время работы ¦" << endl

<< "+------------+--------------+" << endl;

for (i=0;i<8;i++) {

os << '¦';

os.width(11);

os << workers[i].name << " ¦";

os.width(8);

os << v[i] << " ¦" << endl;

}

os << "L------------+---------------" << endl;


/*

Определение степени участия человека в проекте:

Каждый вид работы - равная доля единицы. Т.к. всего 8 видов работ,

то при равности сложностей работ на каждую работу выходит по 0.125

доли общей работы. Исходя из этого рассчитываем нагрузочные коэффициенты

для каждого из участников.

*/

cout << "Рассчет нагрузочных коэффициентов для каждого участника проекта ..." << endl;

for (i=0;i<8;i++) k[i]=0;


for (i=0;i<8;i++) { // для каждого из заданий

for (int j=0;j<8;j++) tmp[j]=FALSE;

int n=0; // сколько человек могут делать i-е задание

for (j=0;j<8;j++)

for (int m=0;m<5;m++)

if (workers[j].methods[m]==i+1) { n++; tmp[j]=TRUE; break; }

for (j=0;j<8;j++)

if (tmp[j]) k[j]+=0.125/n;

}


// Рассчет трудоемкости для каждого участника СМО Q=v*k

cout << "Рассчет трудоемкости для каждого участника ..." << endl;

for (i=0;i<8;i++)

q[i]=v[i]*k[i];


os << endl << "Таблица трудоемкостей участников:" << endl;

os << "-------------T------------------------¬" << endl

<< "¦ Фамилия ¦ Трудоемкость участника ¦" << endl

<< "+------------+------------------------+" << endl;

for (i=0;i<8;i++) {

os << '¦';

os.width(11);

os << workers[i].name << " ¦";

os.width(13);

os << q[i] << " ¦" << endl;

}

os << "L------------+-------------------------" << endl;


os.close();

cout << endl << endl

<< "Моделирование закончено! Результаты смотрите в файле Lab6.out";

bioskey(0);


}


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

void FatalError (int code)

{

switch (code) {

case 1: os << endl

<< "У участников проекта не хватает знаний для выполнения задания.";

cout << endl

<< "У участников проекта не хватает знаний для выполнения задания.";

break;

case 2: os << endl

<< "Не все участники проекта знают выбранный язык программирования.";

cout << endl

<< "Не все участники проекта знают выбранный язык программирования.";

break;

case 3: os << endl

<< "Оператор неправильно распределил задания между участниками проекта.";

cout << endl

<< "Оператор неправильно распределил задания между участниками проекта.";

break;

}

cout << endl

<< "Дальнейшее моделирование системы нецелесообразно!!!"

<< endl;

os << endl

<< "Дальнейшее моделирование системы нецелесообразно!!!"

<< endl;

os.close();

exit(EXIT_FAILURE);

}