Методические указания и примеры выполнения задания №6 " Моделирование процессов принятия решений"
Вид материала | Методические указания |
- Рабочая программа, методические указания по выполнению курсовой работы, темы курсовых, 1694.43kb.
- Программа дисциплины Моделирование экономических процессов для направления 080100., 53.79kb.
- Методические указания для выполнения курсовой работы по дисциплине «Теория принятия, 547.84kb.
- Методические указания к изучению курса «модели и методы принятия решений в анализе, 683.86kb.
- Методические указания к выполнению контрольных, курсовых работ По дисциплине Имитационное, 222.24kb.
- Анализ принятия управленческих решений, 54.28kb.
- Методические указания по изучению дисциплины и задания для выполнения, 272.59kb.
- Лекция №10: «Интеллектуальные системы принятия решений и управления в условиях конфликта», 581.94kb.
- Методические указания к выполнению лабораторной работы №23 по физике для студентов, 142.34kb.
- Методические указания для выполнения контрольных работ по курсу «Автоматика и автоматизация, 447.92kb.
//----------------------------------------------------------
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);
}