Моделирование СМО на С++

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
DarkLORD
Сообщения: 2
Зарегистрирован: 14 янв 2015, 21:43

Задание
Вычислительная система (ВС) состоит из сервера, обрабатывающего программы.
Программы поступают случайным образом, распределенные по линейному закону:
Тzmin = 1/2 сек, Тzmax = 5/6 сек.
Время обработки одной программы сервером - случайная величина, распределенная по линейному закону:
Тsmin = 1 сек, Тsmax = 5 сек.
Если сервер занят, обрабатывает программу, то поступающая следующая программа отправляется в буфер. Число программ в буфере - случайная величина и ограничено (не более 4-х). Если поступила следующая программа, а в буфере содержится уже 4 три программы, то программа покидает ВС не обработанной.
Разработать программу, моделирующую работу ВС и найти ее характеристики за время работы 1 час. Характеристики ВС:
• Р0 - вероятность того, что ВС не загружена,
• Р1 — вероятность того, что сервер обрабатывает одну программу и буфер пуст,
• Р2 - вероятность того, что в буфере находится 1 -на программа,
• Р3 - вероятность того, что в буфере находится 2-ве программы,
• Р4 - вероятность того, что в буфере находится 3-ри программы,
Р5 - вероятность того, что в буфере находится 3-ри программы,
• Q - относительная пропускная способность ВС - средняя доля программ, обработанных ВС,
• S - абсолютная пропускная способность - среднее число программ, обработанных в единицу времени,
• Ротк - вероятность отказа, т.е. того, что программа будет не обработанной,
• Nпрог - среднее число программ в ВС,

• Тпрог - среднее время нахождения программы в ВС,
• Nбуф - среднее число программ в буфере,
• Тбуф - среднее время нахождения программы в буфере.

Программа писалась в borland C++ builder

Есть программный код помогите разобраться с буфером

Код: Выделить всё

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <math>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{

double Ce,Tzmin, Tzmax, Tsmin, Tsmax, Pk, P0, P1, P2, P3, P4, P5, Q, S,
Potk, buf, Nprog, Tprog, Nbuf, Tbuf;
double L, Tobr, M, Sum, cur, n, Dprog, Rprog, p, N, H1 ;
{
//Линейный закон
if (RadioButton1->Checked)
{
Tzmin = StrToFloat(Edit2->Text);
Tzmax = StrToFloat(Edit3->Text);
Tsmin = StrToFloat(Edit4->Text);
Tsmax = StrToFloat(Edit5->Text);
// Количество программ на выполнение
Sum=0;
N=0;
while (Sum<=3600)
{
// Интервал новой пргограммы
Dprog=((double)rand())/(double)RAND_MAX;
Dprog=Dprog*(Tzmax-Tzmin)+Tzmin;
cur=Dprog;
Sum=Sum+cur;
N++;
}
Pk=N;
if (Ce<1) // Занят ли сервер
{
Rprog=((double)rand())/(double)RAND_MAX;
Rprog=Rprog*(Tsmax-Tsmin)+Tsmin;
Ce=Rprog;
H1++;
}
// Если занят то заявка попадает в буфер



/ Расчет








// Вывод значений
Edit1->Text = FloatToStr( P0 );
Edit8->Text = FloatToStr( P1 );
Edit9->Text = FloatToStr( P2 );
Edit10->Text = FloatToStr( P3 );
Edit11->Text = FloatToStr( P4 );
Edit12->Text = FloatToStr( P5 );
Edit13->Text = FloatToStr( Potk );
Edit14->Text = FloatToStr( Q );
Edit15->Text = FloatToStr( S );
Edit16->Text = FloatToStr( Nprog);
Edit17->Text = FloatToStr( Tprog);
Edit18->Text = FloatToStr(Tbuf);
Edit19->Text = FloatToStr(Nbuf);
}


//Экспоненциальный закон
if (RadioButton2->Checked)
{
L = StrToFloat(Edit6->Text);
Tobr = StrToFloat(Edit7->Text);
n = 5;
M = 1/Tobr;
p = L/M;
P0 = (1-p)/(1-pow(p,(n+1)));
P1 = p*P0;
P2 = pow(p,2)*P0;
P3 = pow(p,3)*P0;
P4 = pow(p,4)*P0;
P5 = pow(p,5)*P0;
Potk = P5;
Q = 1-Potk;
S = L*Q;
Nprog =(p*(1-(n+1)*pow(p,n)+n*pow(p,n+1)))/((1-p)*(1-pow(p,n+1)));
Tprog = Nprog/(L*(1-P5));
Tbuf = (Tprog-1)/M;
Nbuf = L*(1-P5)*Tbuf;
// Вывод значений
Edit1->Text = FloatToStr( P0 );
Edit8->Text = FloatToStr( P1 );
Edit9->Text = FloatToStr( P2 );
Edit10->Text = FloatToStr( P3 );
Edit11->Text = FloatToStr( P4 );
Edit12->Text = FloatToStr( P5 );
Edit13->Text = FloatToStr( Potk );
Edit14->Text = FloatToStr( Q );
Edit15->Text = FloatToStr( S );
Edit16->Text = FloatToStr( Nprog);
Edit17->Text = FloatToStr( Tprog);
Edit18->Text = FloatToStr(Tbuf);
Edit19->Text = FloatToStr(Nbuf);
}
}
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Наверное, я бы мог помочь, если бы в программе были либо комментарии, либо переменные были бы хотя бы снабжены понятными именами. В текущем состоянии кода, разобраться в нём может только тот человек, который его писал.

Честно попытался разобраться сам, но, увидев несколько логических ошибок, бросил это неблагодарное дело. Без коментариев ещё раз не возьмусь точно.

Если интересно, вот ошибки, которые бросились в глаза.

Код: Выделить всё

Dprog=((double)rand())/(double)RAND_MAX; // Никогда не будет равно 1
Dprog=Dprog*(Tzmax-Tzmin)+Tzmin; // Как следствие, никогда не сможет стать Tzmax
Ещё переменная H1 не инициализирована, но в коде инкрементится. Хотя, она дальше нигде не используется в рассчётах, так что это скорее не ошибка, а мусор.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
DarkLORD
Сообщения: 2
Зарегистрирован: 14 янв 2015, 21:43

Извините, Romeo, эти строчки формируют поток заявок который поступает в ВС, как исправить данные ошибки?
Romeo писал(а):Наверное, я бы мог помочь, если бы в программе были либо комментарии, либо переменные были бы хотя бы снабжены понятными именами. В текущем состоянии кода, разобраться в нём может только тот человек, который его писал.

Честно попытался разобраться сам, но, увидев несколько логических ошибок, бросил это неблагодарное дело. Без коментариев ещё раз не возьмусь точно.

Если интересно, вот ошибки, которые бросились в глаза.

Код: Выделить всё

Dprog=((double)rand())/(double)RAND_MAX; // Никогда не будет равно 1
Dprog=Dprog*(Tzmax-Tzmin)+Tzmin; // Как следствие, никогда не сможет стать Tzmax
Ещё переменная H1 не инициализирована, но в коде инкрементится. Хотя, она дальше нигде не используется в рассчётах, так что это скорее не ошибка, а мусор.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Указанные ошибки исправить не проблема. Но без коментариев в коде я не возьмусь помогать с главной проблемой - поддержкой буфера программ.

Исправляется следущим образом. Вместо двух строк:

Код: Выделить всё

Dprog=((double)rand())/(double)RAND_MAX;
Dprog=Dprog*(Tzmax-Tzmin)+Tzmin;
Должна быть одна:

Код: Выделить всё

Dprog = (rand()%(Tzmax - Tzmin + 1)) + Tzmin;
Именно в таком виде всегда используют функцию rand. От результат её вызова вычисляют отстаток от деления. Причём тут важно добавить единичку, чтобы получивлееся число было от 0 до Tzmax-Tzmin. В этом случае у Dprog есть шанс попасть в крайнюю правую точку отрезка.

Вторая ошибка исправляется обычной инизиализацией H1 нолём.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
ADiesperova
Сообщения: 2
Зарегистрирован: 28 янв 2015, 11:52

Обязанности:

разработка низкоуровневых тестов
написание тест-кейсов
технологическая платформа: Red Hat MRG, 10G Ethernet, Infiniband, ROCE


Требования:

опыт разработки серверных приложений под Linux
владение средствами разработки C/C++
опыт системного программирования
опыт работы с месседжинговыми системами приветствуется

Условия:
оформление по ТК
трудовой договор на время проекта (2 года с возможностью продления)
достойная заработная плата
ДМС, ММС, корпоративное обучение, дружный коллектив
офис - м. Арбатская/Библиотека им. Ленина/Охотный ряд/Боровицкая

Тип занятости
Полная занятость, полный день

резюме и вопросы на почту: ADiesperova@spice-agency.ru
Ответить