unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, XPMan, StdCtrls, Grids;
type
TForm1 = class(TForm)
EditSKO: TEdit;
EditMinVyr: TEdit;
EditMaxVyr: TEdit;
EditCountRandom: TEdit;
EditPoint1: TEdit;
EditPoint2: TEdit;
EditPoint3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
ButtonStart: TButton;
ButtonClear: TButton;
ButtonExit: TButton;
XPManifest1: TXPManifest;
Label9: TLabel;
StringGrid1: TStringGrid;
Label10: TLabel;
procedure ButtonExitClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ButtonStartClick(Sender: TObject);
procedure ButtonClearClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
T:array [1..3,1..3] of integer;
U:array [1..3] of integer;
P:array [1..3] of real;
Tsum:array [1..3] of Double;
Tsum2:array [1..3] of Double;
Mcp:array [1..3] of real;
Gar:array [1..3] of real;
Sigma:array [1..3] of real;
j, Nr:integer;
R,z, sigm, Eta, Ts,Tmax,Tmin:real;
implementation
{$R *.dfm}
procedure TForm1.ButtonExitClick(Sender: TObject);
begin
close();
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// Изменяем ширину столбцов
StringGrid1.ColWidths[0]:=40;
StringGrid1.ColWidths[1]:=110;
StringGrid1.ColWidths[2]:=110;
StringGrid1.ColWidths[3]:=110;
StringGrid1.ColWidths[4]:=160;
StringGrid1.ColWidths[5]:=160;
R:=StrToFloat('1,645');
// Вносим значения в таблицу
StringGrid1.Cells[0,0]:=' №';
StringGrid1.Cells[1,0]:=' Товар 1';
StringGrid1.Cells[2,0]:=' Товар 2';
StringGrid1.Cells[3,0]:=' Товар 3';
StringGrid1.Cells[4,0]:=' Средний убыток';
StringGrid1.Cells[5,0]:=' Вероятность убытка';
StringGrid1.Cells[0,1]:=' 1';
StringGrid1.Cells[0,2]:=' 2';
StringGrid1.Cells[0,3]:=' 3';
StringGrid1.Cells[1,1]:='3000';
StringGrid1.Cells[1,2]:='3000';
StringGrid1.Cells[1,3]:='3000';
StringGrid1.Cells[2,1]:='3000';
StringGrid1.Cells[2,2]:='3000';
StringGrid1.Cells[2,3]:='3000';
StringGrid1.Cells[3,1]:='3000';
StringGrid1.Cells[3,2]:='3000';
StringGrid1.Cells[3,3]:='3000';
StringGrid1.Cells[4,1]:='3000';
StringGrid1.Cells[4,2]:='3000';
StringGrid1.Cells[4,3]:='3000';
StringGrid1.Cells[5,1]:='0,1';
StringGrid1.Cells[5,2]:='0,5';
StringGrid1.Cells[5,3]:='0,9';
// заносим значения в текстовые поля
EditSKO.Text:='0,25';
EditMinVyr.Text:='-1';
EditMaxVyr.Text:='2';
EditCountRandom.Text:='5000';
end;
Function UNR():real;
var k:integer;
e:real;
begin
// Функция "Усеченное нормальное распределение"
|
Repeat
e:=0;
For k:= 1 to 12 do begin
z:= Random;
e:=e+z;
end;
e:=e-6;
until (e>=Tmin) And (e<=Tmax);
UNR:=e;
end;
procedure TForm1.ButtonStartClick(Sender: TObject);
var a:string;
i, Ir:integer;
Disp:real;
begin
// Считаваем значения из таблицы в массив T
t[1,1]:=strtoint(StringGrid1.Cells[1,1]);
t[1,2]:=strtoint(StringGrid1.Cells[1,2]);
t[1,3]:=strtoint(StringGrid1.Cells[1,3]);
t[2,1]:=strtoint(StringGrid1.Cells[2,1]);
t[2,2]:=strtoint(StringGrid1.Cells[2,2]);
t[2,3]:=strtoint(StringGrid1.Cells[2,3]);
t[3,1]:=strtoint(StringGrid1.Cells[3,1]);
t[3,2]:=strtoint(StringGrid1.Cells[3,2]);
t[3,3]:=strtoint(StringGrid1.Cells[3,3]);
//Считываем значния в массив U
u[1]:=strtoint(StringGrid1.Cells[4,1]);
u[2]:=strtoint(StringGrid1.Cells[4,2]);
u[3]:=strtoint(StringGrid1.Cells[4,3]);
// Проверка на наличие точки, вместо запятой
a:=StringGrid1.Cells[5,1];
if a[2]='.' then a[2]:=',';
StringGrid1.Cells[5,1]:=a;
a:=StringGrid1.Cells[5,2];
if a[2]='.' then a[2]:=',';
StringGrid1.Cells[5,2]:=a;
a:=StringGrid1.Cells[5,3];
if a[2]='.' then a[2]:=',';
StringGrid1.Cells[5,3]:=a;
//Считываем значния в массив U
P[1]:=StrToFloat(StringGrid1.Cells[5,1]);
P[2]:=StrToFloat(StringGrid1.Cells[5,2]);
P[3]:=StrToFloat(StringGrid1.Cells[5,3]);
// Проверка точки в поле СКО
a:=EditSKO.Text;
If a[2]='.' then a[2]:=',';
EditSKO.Text:=a;
// Считываем данные из текстовых полей
sigm:=StrToFloat(EditSKO.Text);
Tmin:=StrToInt(EditMinVyr.Text);
Tmax:=StrToInt(EditMaxVyr.Text);
Nr:=StrToInt(EditCountRandom.Text);
// Обнуление сумм, для расчёта МО и СКО
For i:=1 to 3 do begin
Tsum[i]:=0;
Tsum2[i]:=0;
end;
For Ir:=1 to Nr do //перебор случайных реализаций
For i:=1 to 3 do begin
TS:=0;
Eta:=UNR();
TS:= T[i,1]*(1+Sigm*Eta);
Eta:=UNR();
TS:= TS + T[i,2]*(1+Sigm*Eta);
Eta:=UNR();
TS:= TS + T[i,3]*(1+Sigm*Eta);
z:=Random;
If z<P[i] Then begin
Eta:= UNR;
TS:=TS-U[i]*(1+Sigm*Eta);
end;
Tsum[i]:=Tsum[i]+TS;
Tsum2[i]:=Tsum2[i] + TS*TS;
end;
For i:=1 to 3 do begin
Mcp[i]:= Tsum[i]/Nr; // Расчёт средней прибыли
If Nr >i Then begin
Disp:=(Tsum2[i] - Nr*Mcp[i]*Mcp[i])/(Nr - 1);
Sigma[i]:= Sqrt(Disp);
end
Else
Sigma[i]:= 0;
// минимальная гарантированная прибыль:
Gar[i]:=Mcp[i]-R*Sigma[i];
end;
|
// Вывод результатов в ячейки
EditPoint1.Text:=FloatToStr(Gar[1]);
EditPoint2.Text:=FloatToStr(Gar[2]);
EditPoint3.Text:=FloatToStr(Gar[3]);
end;
procedure TForm1.ButtonClearClick(Sender: TObject);
begin
EditPoint1.Text:='';
EditPoint2.Text:='';
EditPoint3.Text:='';
end;
end.