По временной диаграмме с учётом всех возникающих условий строится блок-схема, изображённая на рисунке 3.
При построении алгоритма использовались следующие переменные:
B – количество агрегатов на первичной регулировке;
С – количество агрегатов на вторичной регулировке;
D – количество агрегатов на полной регулировке;
F – количество агрегатов, прошедших первичную регулировку (60%) и ожидающих вторичной регулировки в накопителе;
E – количество агрегатов в накопителе – агрегаты, не прошедшие первичную регулировку (40%);
Z – общее количество агрегатов, прошедших регулировку;
ta – время до прихода следующей партии агрегатов;
tb – время, оставшееся до конца первичной регулировки;
tc – время, оставшееся до конца вторичной регулировки;
td – время, оставшееся до конца полной регулировки;
ts – общее время регулировки.
Рисунок 3 – Блок-схема рекуррентного алгоритма моделирования процесса во времени
По блок-схеме алгоритма, с учётом требований языка, можно составить структуру модуля main(). Её анализ показывает, что для правильной работы необходимы две включаемые функции:
функция расчёта случайного числа по экспоненциальному закону распределения вероятности, которая возвращает целое число в зависимости от трёх аргументов: a – среднего значения, b – максимального отклонения, L – коэффициента λ, характеризующего параметры функции распределения вероятности;
функция (подпрограмма) построения графика значений из заданного файла, которая автоматически рассчитывает масштаб, количество точек, пределы изменения параметра, записанного в файл в виде значений через запятую.
Результаты работы программы показаны на рисунках 4 и 5.
Листинг программы:
#include <graphics.h>
#include <fstream.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int rnd_exp(double a, double b, double L);
void gr_file(char *fn);
void main()
{
int B=0,C=0,D=0,E=0,F=0,Z=0;
double ta=rnd_exp(30,30,0.1),
tb=0,tc=0,td=0,ts=60000;
char zpt=',';
char *fn1="e.dat";
char *fn2="f.dat";
fstream f1,f2;
f1.open(fn1,ios::out);
f2.open(fn2,ios::out);
randomize();
while(ts>0){
if(tb==0 && B>0){
B-=2;
for(int i=0;i<2;i++){
if(random(5)<=2)F++;else E++;
}
}
if(ta==0 && B==0){
B+=2;
ta=rnd_exp(30,30,0.1);
if(tb==0)tb=rnd_exp(30,30,0.1);
}
if(tc==0 && C>0){
C--; Z++;
}
if(C==0 && F>0){
C++; F--;
tc=rnd_exp(30,30,0.1);
}
if(td==0 && D>0){
D--; Z++;
}
if(D==0 && E>0){
D++; E--;
td=100;
}
f1<<E<<zpt; f2<<F<<zpt;
ts--;
if(ta>0)ta--;
if(tb>0)tb--;
if(tc>0)tc--;
if(td>0)td--;
}
f1.close();
f2.close();
gr_file(fn1);
gr_file(fn2);
}
void gr_file(char *fn)
{
int dr = DETECT, mod =1;initgraph (&dr,&mod,"");
char zpt;
fstream f;
f.open (fn,ios::in);
double a,n=0, max=-1e300,min=1e300;
while(f.peek() != EOF)
{
f >> a >> zpt;n++;
if (max < a) max = a;
if (min > a) min = a;
}
if (max == min) {max++;min--;}
f.close();
cout.precision(2);
setcolor(8);
for (int i=0;i<=10;i++)
{
line (40,i * 38,620,i * 38);
gotoxy(1,i*2.4+1);cout << max - i*(max-min)/10;
line (40+i*58,0,40+i*58,380);
gotoxy(4+i*7.2,25);printf("%0.0f", n*i/10);
}
gotoxy(2,25);cout << "N=";
double k = 380/(max -min);
double d = 380 - max * k;
setcolor(14);
if (0 < d && d< 380)
{
moveto(30,380-(int)d);
outtext("0");
line(40,380-(int)d,620,380-(int)d);
}
setcolor(12);
f.open (fn,ios::in);
double t=0;
while(f.peek() != EOF)
{
f >> a >> zpt;
int y1 =(int) 380 - (a*k+d);
int x1 = t * 580. / n+40;
if (t == 0) moveto(x1,y1);
else
lineto (x1,y1);
t++;
}
setcolor(15);
outtextxy(200,450,"Press any key to continue");
getch();
f.close();
closegraph();
}
int rnd_exp(double a, double b, double L)
{
++b;
double fd=10000;
double k=exp(0)-exp(-L);
Q: double c=random(b);
double d=random(fd)/fd;
double p=exp(-L*c)-exp(-L*(c+1));
if(d<=p/k) if(random(2)==1) return (c+a); else {
if(c==0)goto Q; else return (-c+a);
}
goto Q;
}
Рисунок 4 – График изменения значения переменной E(t) до оптимизации
Рисунок 5 – График изменения значения переменной F(t) до оптимизации
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.