initial
This commit is contained in:
commit
1bf1657b93
BIN
Debug/project_template.exe
Normal file
BIN
Debug/project_template.exe
Normal file
Binary file not shown.
BIN
Debug/project_template.ilk
Normal file
BIN
Debug/project_template.ilk
Normal file
Binary file not shown.
BIN
Debug/project_template.pdb
Normal file
BIN
Debug/project_template.pdb
Normal file
Binary file not shown.
51
Debug/test/1.txt
Normal file
51
Debug/test/1.txt
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
5520
|
||||||
|
3940
|
||||||
|
4490
|
||||||
|
5030
|
||||||
|
5660
|
||||||
|
4790
|
||||||
|
5520
|
||||||
|
5560
|
||||||
|
5200
|
||||||
|
6670
|
||||||
|
5900
|
||||||
|
5280
|
||||||
|
6490
|
||||||
|
5560
|
||||||
|
5090
|
||||||
|
7090
|
||||||
|
6570
|
||||||
|
5890
|
||||||
|
6640
|
||||||
|
6360
|
||||||
|
5640
|
||||||
|
6630
|
||||||
|
5330
|
||||||
|
5540
|
||||||
|
7100
|
||||||
|
5410
|
||||||
|
5800
|
||||||
|
6110
|
||||||
|
6870
|
||||||
|
6560
|
||||||
|
6120
|
||||||
|
6540
|
||||||
|
5810
|
||||||
|
6300
|
||||||
|
6270
|
||||||
|
6900
|
||||||
|
6310
|
||||||
|
5330
|
||||||
|
5700
|
||||||
|
6680
|
||||||
|
5510
|
||||||
|
6690
|
||||||
|
5870
|
||||||
|
7140
|
||||||
|
6680
|
||||||
|
6520
|
||||||
|
6020
|
||||||
|
6190
|
||||||
|
6690
|
||||||
|
6330
|
||||||
|
7620
|
30
Debug/test/1.txtresult/15out
Normal file
30
Debug/test/1.txtresult/15out
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
5780
|
||||||
|
5780
|
||||||
|
5780
|
||||||
|
5780
|
||||||
|
5780
|
||||||
|
5780
|
||||||
|
4860
|
||||||
|
5780
|
||||||
|
5780
|
||||||
|
5780
|
||||||
|
4860
|
||||||
|
5780
|
||||||
|
5780
|
||||||
|
5780
|
||||||
|
5780
|
||||||
|
5780
|
||||||
|
6700
|
||||||
|
5780
|
||||||
|
5780
|
||||||
|
5166,67
|
||||||
|
6393,33
|
||||||
|
5780
|
||||||
|
5780
|
||||||
|
5166,67
|
||||||
|
5780
|
||||||
|
5780
|
||||||
|
5780
|
||||||
|
6393,33
|
||||||
|
5780
|
||||||
|
6393,33
|
1
Debug/test/1.txtresult/smape
Normal file
1
Debug/test/1.txtresult/smape
Normal file
@ -0,0 +1 @@
|
|||||||
|
Smape for 15 method: 11.2282 alpha: 0 delta 0 gamma: 0 phi: 0 countRulesIn: 1 countFuzzyParts: 2 sizeLabels: 1 p: 1
|
BIN
Release/project_template.exe
Normal file
BIN
Release/project_template.exe
Normal file
Binary file not shown.
BIN
Release/project_template.pdb
Normal file
BIN
Release/project_template.pdb
Normal file
Binary file not shown.
BIN
libnlopt-0.dll
Normal file
BIN
libnlopt-0.dll
Normal file
Binary file not shown.
BIN
libnlopt-0.lib
Normal file
BIN
libnlopt-0.lib
Normal file
Binary file not shown.
BIN
project_template.ncb
Normal file
BIN
project_template.ncb
Normal file
Binary file not shown.
26
project_template.sln
Normal file
26
project_template.sln
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 10.00
|
||||||
|
# Visual Studio 2008
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "project_template", "project_template\project_template.vcproj", "{D68B91E2-1169-4096-AC00-5992226D29DF}"
|
||||||
|
EndProject
|
||||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Элементы решения", "Элементы решения", "{33699718-6D46-4936-8061-0EF2D6A27D62}"
|
||||||
|
ProjectSection(SolutionItems) = preProject
|
||||||
|
C:\Users\orion\Desktop\project_template.vsd = C:\Users\orion\Desktop\project_template.vsd
|
||||||
|
project_template.vsd = project_template.vsd
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Win32 = Debug|Win32
|
||||||
|
Release|Win32 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{D68B91E2-1169-4096-AC00-5992226D29DF}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{D68B91E2-1169-4096-AC00-5992226D29DF}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{D68B91E2-1169-4096-AC00-5992226D29DF}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{D68B91E2-1169-4096-AC00-5992226D29DF}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
BIN
project_template.suo
Normal file
BIN
project_template.suo
Normal file
Binary file not shown.
BIN
project_template.vsd
Normal file
BIN
project_template.vsd
Normal file
Binary file not shown.
35
project_template/A.cpp
Normal file
35
project_template/A.cpp
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#include "StdAfx.h"
|
||||||
|
#include "A.h"
|
||||||
|
|
||||||
|
A::A() {
|
||||||
|
}
|
||||||
|
|
||||||
|
A::A(double left, double right) {
|
||||||
|
this->left = left;
|
||||||
|
this->right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
double A::getValue(double value) {
|
||||||
|
if (value == (right + left) / 2) {
|
||||||
|
return 1;
|
||||||
|
} else if ((value >= right) || (value <= left)) {
|
||||||
|
return 0;
|
||||||
|
} else if (value < (right + left) / 2) {
|
||||||
|
return (double)(value - left) / ((right + left) / 2 - left);
|
||||||
|
} else if (value > (right + left) / 2) {
|
||||||
|
return (double) -(value - right) / (right - (right + left) / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
double A::getValueAtTop() {
|
||||||
|
return (right + left) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
double A::getLeft() {
|
||||||
|
return left;
|
||||||
|
}
|
||||||
|
|
||||||
|
double A::getRight() {
|
||||||
|
return right;
|
||||||
|
}
|
20
project_template/A.h
Normal file
20
project_template/A.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#ifndef A_H
|
||||||
|
#define A_H
|
||||||
|
|
||||||
|
//using namespace std;
|
||||||
|
|
||||||
|
// класс, отвечающий описывающий функции принадлежности
|
||||||
|
class A {
|
||||||
|
private:
|
||||||
|
double left; // левая граница
|
||||||
|
double right; // правая граница
|
||||||
|
public:
|
||||||
|
|
||||||
|
A();
|
||||||
|
A(double, double);
|
||||||
|
double getLeft();
|
||||||
|
double getRight();
|
||||||
|
double getValue(double); // получить значение функции принадлежности в указанной точке
|
||||||
|
double getValueAtTop(); // получить четкое значение при чначении функции принадлежности = 1
|
||||||
|
};
|
||||||
|
#endif
|
142
project_template/AddTrendAddSeasonality.cpp
Normal file
142
project_template/AddTrendAddSeasonality.cpp
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// àääèòèâíûé òðåíä, àääèòèâíàÿ ñåçîííîñòü
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "AddTrendAddSeasonality.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
// êîíñòðóêòîð ñ çàäàííûìè íåïîñðåäñòâåííî ïàðàìåòðàìè
|
||||||
|
AddTrendAddSeasonality::AddTrendAddSeasonality(vector<double> timeSeries, int countPointForecast) {
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
AddTrendAddSeasonality::~AddTrendAddSeasonality() {
|
||||||
|
// îñâîáîæäàåòñÿ ïàìÿòü
|
||||||
|
std::vector<double> ().swap(S);
|
||||||
|
std::vector<double> ().swap(x);
|
||||||
|
std::vector<double> ().swap(T);
|
||||||
|
std::vector<double> ().swap(I);
|
||||||
|
std::vector<double> ().swap(forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// èíèöèàëèçàöèÿ ìîäåëè, çàäàíèå ïåðâîíà÷àëüíûõ çíà÷åíèé
|
||||||
|
void AddTrendAddSeasonality::init() {
|
||||||
|
S.clear();
|
||||||
|
T.clear();
|
||||||
|
I.clear();
|
||||||
|
forecast.clear();
|
||||||
|
|
||||||
|
double sumS = 0;
|
||||||
|
double sumT = 0;
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
sumS += x[t];
|
||||||
|
sumT += x[t+p];
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(sumS / p);
|
||||||
|
T.push_back((sumT/ p - S[0]) / p);
|
||||||
|
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I.push_back(x[t] - S[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
forecast.push_back(S[0] + T[0] + I[0]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Çàäàòü ïàðàìåòð
|
||||||
|
void AddTrendAddSeasonality::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("gamma") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
} else if (paramName.compare("p") == 0) {
|
||||||
|
this->p = value;
|
||||||
|
} else if (paramName.compare("delta") == 0) {
|
||||||
|
this->delta = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void AddTrendAddSeasonality::createModel() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = x[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + T[t] + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(T[t] + alpha * gamma * e); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] + T[t+1] + I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void AddTrendAddSeasonality::createModelForEstimation() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = xLearning[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + T[t] + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(T[t] + alpha * gamma * e); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] + T[t+1] + I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ ïðîãíîçà
|
||||||
|
vector<double> AddTrendAddSeasonality::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double AddTrendAddSeasonality::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(3, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* AddTrendAddSeasonality::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0.1; al < 1; al+= 0.01) {
|
||||||
|
for (double del = 0.1; del < 1; del+= 0.01) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->setParam("delta", del);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
35
project_template/AddTrendAddSeasonality.h
Normal file
35
project_template/AddTrendAddSeasonality.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#ifndef ADDTRENDADDSEASONALITY_H
|
||||||
|
#define ADDTRENDADDSEASONALITY_H
|
||||||
|
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êîíêðåòíàÿ ðåàëèçàöèÿ àáñòðàêòíîãî êëàññà Method
|
||||||
|
// ðåàëèçóåò ìåòîä ýêñïîíåíöèàëüíîãî ñ àääèòèâíûì òðåíäîì, àääèòèâíîé ñåçîííîñòüþ
|
||||||
|
class AddTrendAddSeasonality : public Method {
|
||||||
|
public:
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
vector<double> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
double delta; // ïàðàìåòð ñãëàæèâàíèÿ ñåçîííîé êîìïîíåíòû
|
||||||
|
vector<double> T; // ñãëàæåííûé òðåíä
|
||||||
|
vector<double> I; // ñåçîííàÿ êîìïîíåíòà
|
||||||
|
int p; // ïåðèîä ñåçîííîñòè
|
||||||
|
|
||||||
|
AddTrendAddSeasonality(vector<double>, int);
|
||||||
|
~AddTrendAddSeasonality();
|
||||||
|
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
vector<double> getS();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
145
project_template/AddTrendMultSeasonality.cpp
Normal file
145
project_template/AddTrendMultSeasonality.cpp
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// àääèòèâíûé òðåíä, ìóëüòèïëèêàòèâíàÿ ñåçîííîñòü
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "AddTrendMultSeasonality.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
// êîíñòðóêòîð ñ çàäàííûìè íåïîñðåäñòâåííî ïàðàìåòðàìè
|
||||||
|
AddTrendMultSeasonality::AddTrendMultSeasonality(vector<double> timeSeries, int countPointForecast) {
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
AddTrendMultSeasonality::~AddTrendMultSeasonality() {
|
||||||
|
// îñâîáîæäàåòñÿ ïàìÿòü
|
||||||
|
std::vector<double> ().swap(S);
|
||||||
|
std::vector<double> ().swap(x);
|
||||||
|
std::vector<double> ().swap(T);
|
||||||
|
std::vector<double> ().swap(I);
|
||||||
|
std::vector<double> ().swap(forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// èíèöèàëèçàöèÿ ìîäåëè, çàäàíèå ïåðâîíà÷àëüíûõ çíà÷åíèé
|
||||||
|
void AddTrendMultSeasonality::init() {
|
||||||
|
S.clear();
|
||||||
|
T.clear();
|
||||||
|
I.clear();
|
||||||
|
forecast.clear();
|
||||||
|
|
||||||
|
double sumS = 0;
|
||||||
|
double sumT = 0;
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
sumS += x[t];
|
||||||
|
sumT += x[t+p];
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(sumS / p);
|
||||||
|
T.push_back((sumT/ p - S[0]) / p);
|
||||||
|
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I.push_back(x[t] / S[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
forecast.push_back((S[0] + T[0]) * I[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Çàäàòü ïàðàìåòð
|
||||||
|
void AddTrendMultSeasonality::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("gamma") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
} else if (paramName.compare("p") == 0) {
|
||||||
|
this->p = value;
|
||||||
|
} else if (paramName.compare("delta") == 0) {
|
||||||
|
this->delta = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void AddTrendMultSeasonality::createModel() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = x[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + T[t] + alpha * e / I[t]); // óðîâåíü
|
||||||
|
T.push_back(T[t] + alpha * gamma * e / I[t]); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e / (S[t] + T[t])); // ñåçîííîñòü
|
||||||
|
forecast.push_back((S[t+1] + T[t+1]) * I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü ñ íîâûì çíà÷åíèåì ïàðàìåòðà. ïåðåãðóæåííûé ìåòîä
|
||||||
|
void AddTrendMultSeasonality::createModelForEstimation() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1 +this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = xLearning[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + T[t] + alpha * e / I[t]); // óðîâåíü
|
||||||
|
T.push_back(T[t] + alpha * gamma * e / I[t]); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e / (S[t] + T[t])); // ñåçîííîñòü
|
||||||
|
forecast.push_back((S[t+1] + T[t+1]) * I[t+1]); // ïðîãíîç
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ ïðîãíîçà
|
||||||
|
vector<double> AddTrendMultSeasonality::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double AddTrendMultSeasonality::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(3, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* AddTrendMultSeasonality::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0.1; al < 1; al+= 0.01) {
|
||||||
|
for (double gam = 0.1; gam < 1; gam+= 0.01) {
|
||||||
|
for (double del = 0.1; del < 1;del+= 0.01) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->setParam("gamma", gam);
|
||||||
|
this->setParam("delta", del);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
optimal->gamma = gam;
|
||||||
|
optimal->delta = del;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
||||||
|
|
34
project_template/AddTrendMultSeasonality.h
Normal file
34
project_template/AddTrendMultSeasonality.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#ifndef ADDTRENDMULTSEASONALITY_H
|
||||||
|
#define ADDTRENDMULTSEASONALITY_H
|
||||||
|
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êîíêðåòíàÿ ðåàëèçàöèÿ àáñòðàêòíîãî êëàññà Method
|
||||||
|
// ðåàëèçóåò ìåòîä ýêñïîíåíöèàëüíîãî ñ àääèòèâíûì òðåíäîì, ìóëüòèïëèêàòèâíîé ñåçîííîñòüþ
|
||||||
|
class AddTrendMultSeasonality : public Method {
|
||||||
|
public:
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
vector<double> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
double delta; // ïàðàìåòð ñãëàæèâàíèÿ ñåçîííîé êîìïîíåíòû
|
||||||
|
vector<double> T; // ñãëàæåííûé òðåíä
|
||||||
|
vector<double> I; // ñåçîííàÿ êîìïîíåíòà
|
||||||
|
int p; // ïåðèîä ñåçîííîñòè
|
||||||
|
|
||||||
|
AddTrendMultSeasonality(vector<double>, int);
|
||||||
|
~AddTrendMultSeasonality();
|
||||||
|
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
126
project_template/AddTrendNoSeasonality.cpp
Normal file
126
project_template/AddTrendNoSeasonality.cpp
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// àääèòèâíûé òðåíä, áåç ñåçîííîñòè
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "AddTrendNoSeasonality.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
// êîíñòðóêòîð ñ çàäàííûìè íåïîñðåäñòâåííî ïàðàìåòðàìè
|
||||||
|
AddTrendNoSeasonality::AddTrendNoSeasonality(vector<double> timeSeries, int countPointForecast) {
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->partition();
|
||||||
|
this->alpha = 0;
|
||||||
|
this->gamma = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddTrendNoSeasonality::~AddTrendNoSeasonality() {
|
||||||
|
// îñâîáîæäàåòñÿ ïàìÿòü
|
||||||
|
std::vector<double> ().swap(S);
|
||||||
|
std::vector<double> ().swap(x);
|
||||||
|
std::vector<double> ().swap(T);
|
||||||
|
std::vector<double> ().swap(forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Çàäàòü ïàðàìåòð
|
||||||
|
void AddTrendNoSeasonality::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("gamma") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// èíèöèàëèçàöèÿ ìîäåëè, çàäàíèå ïåðâîíà÷àëüíûõ çíà÷åíèé
|
||||||
|
void AddTrendNoSeasonality::init() {
|
||||||
|
S.clear();
|
||||||
|
T.clear();
|
||||||
|
forecast.clear();
|
||||||
|
|
||||||
|
T.push_back(x[1] - x[0]);
|
||||||
|
S.push_back(x[0]);
|
||||||
|
forecast.push_back(S[0] + T[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void AddTrendNoSeasonality::createModel() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t <x.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = x[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + T[t] + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(T[t] + alpha * gamma * e); // òðåíä
|
||||||
|
forecast.push_back(S[t+1] + T[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void AddTrendNoSeasonality::createModelForEstimation() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = xLearning[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + T[t] + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(T[t] + alpha * gamma * e); // òðåíä
|
||||||
|
forecast.push_back(S[t+1] + T[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ ïðîãíîçà
|
||||||
|
vector<double> AddTrendNoSeasonality::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double AddTrendNoSeasonality::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(3, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* AddTrendNoSeasonality::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0.1; al < 1; al+= 0.01) {
|
||||||
|
for (double gam = 0.1; gam < 1; gam+= 0.01) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->setParam("gamma", gam);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
optimal->gamma = gam;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
||||||
|
|
31
project_template/AddTrendNoSeasonality.h
Normal file
31
project_template/AddTrendNoSeasonality.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#ifndef ADDTRENDNOSEASONALITY_H
|
||||||
|
#define ADDTRENDNOSEASONALITY_H
|
||||||
|
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êîíêðåòíàÿ ðåàëèçàöèÿ àáñòðàêòíîãî êëàññà Method
|
||||||
|
// ðåàëèçóåò ìåòîä ýêñïîíåíöèàëüíîãî ñ àääèòèâíûì òðåíäîì, áåç ñåçîííîñòè
|
||||||
|
class AddTrendNoSeasonality : public Method {
|
||||||
|
public:
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
vector<double> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
vector<double> T; // ñãëàæåííûé òðåíä
|
||||||
|
|
||||||
|
AddTrendNoSeasonality(vector<double>, int);
|
||||||
|
~AddTrendNoSeasonality();
|
||||||
|
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
202
project_template/Aic.cpp
Normal file
202
project_template/Aic.cpp
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <math.h>
|
||||||
|
#include "Aic.h"
|
||||||
|
# define M_PI 3.14159265358979323846 /* pi */
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// критерий Акаике. Наследуется от класса Estimation.
|
||||||
|
// реализует метод "получить значение критерия"
|
||||||
|
|
||||||
|
|
||||||
|
Aic::Aic() {
|
||||||
|
}
|
||||||
|
|
||||||
|
Aic::~Aic(){
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
paramsCount - count of model params,
|
||||||
|
количество параетров модели
|
||||||
|
tsLen - lenght of forecasted estimated time seria,
|
||||||
|
длина оцениваемого спрогнозированного временного ряда
|
||||||
|
isSecondOrder - AIC second order modification,
|
||||||
|
модифицированный АИК второго порядка
|
||||||
|
original - values of the predicted time series,
|
||||||
|
известные значения прогнозируемого временного ряда
|
||||||
|
model - forecasted values of the predicted time series,
|
||||||
|
прогнозированные значения прогнозируемого временного ряда
|
||||||
|
*/
|
||||||
|
//Надо перенести в интерфейс модели, логично если модели будут в последствии
|
||||||
|
//разных типов
|
||||||
|
//Функция правдоподобия для не линейной модели
|
||||||
|
double Aic::logLikNLS(vector<double> forecast, vector<double> weights){
|
||||||
|
int n = forecast.size();
|
||||||
|
if (weights.size() == 0){
|
||||||
|
for (int i = 0; i < n; i++){
|
||||||
|
weights.push_back(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//summ log(w)
|
||||||
|
double wls = 0;
|
||||||
|
//wetghted forecasts
|
||||||
|
double wfor = 0;
|
||||||
|
for (int i = 0; i < n; i++){
|
||||||
|
//zero weights hack
|
||||||
|
if (weights[i] != 0){
|
||||||
|
wls += log(weights[i]);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
wls += log((double)1);
|
||||||
|
}
|
||||||
|
wfor += weights[i] * forecast[i] * forecast[i];
|
||||||
|
}
|
||||||
|
double res = -n * (log((double)2 * M_PI) + 1 - log((double)n) - wls + log((double)wfor)) / 2;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
//Функция правдоподобия для линейной модели
|
||||||
|
double Aic::logLikLM(vector<double> forecast, vector<double> weights){
|
||||||
|
int n = forecast.size();
|
||||||
|
if (weights.size() == 0){
|
||||||
|
for (int i = 0; i < n; i++){
|
||||||
|
weights.push_back(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
int i = 0;
|
||||||
|
while (i < n){
|
||||||
|
if (weights[i] == 0){
|
||||||
|
forecast.erase(forecast.begin() + i);
|
||||||
|
weights.erase(weights.begin() + i);
|
||||||
|
n = forecast.size();
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//summ log(w)
|
||||||
|
double wls = 0;
|
||||||
|
//wetghted forecasts
|
||||||
|
|
||||||
|
double wfor = 0;
|
||||||
|
for (int i = 0; i < n; i++){
|
||||||
|
wls += log(weights[i]);
|
||||||
|
wfor += weights[i] * forecast[i] * forecast[i];
|
||||||
|
}
|
||||||
|
double res = 0.5 * (wls - n * (log((double)2 * M_PI) + 1 - log((double)n) + log((double)wfor)));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Свойство класса модели
|
||||||
|
int Aic::getParamsCount(vector<double> model){
|
||||||
|
#pragma message ("Need solve where is it must do")
|
||||||
|
cout << "log-likelihood function calculate";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
models with special methods:
|
||||||
|
glm, multinom
|
||||||
|
+- maxlikeFit, merMod, unmarkedFit, vglm
|
||||||
|
*/
|
||||||
|
double Aic::getBicValue(int paramsCount,
|
||||||
|
vector<double> original, vector<double> model){
|
||||||
|
int n = (original.size() > model.size() ? model.size() : original.size());
|
||||||
|
double res = 0;
|
||||||
|
double lik = 0;
|
||||||
|
double lik2 = 0;
|
||||||
|
vector<double> e;
|
||||||
|
cout << "Bicc " << endl;
|
||||||
|
cout << " e sum(lik) sum(lik2)" << endl;
|
||||||
|
for (int i = 0; i < n; i++){
|
||||||
|
//adderror
|
||||||
|
e.push_back(original[i] - model[i]);
|
||||||
|
cout << " " << e[i];
|
||||||
|
lik += e[i] * e[i];
|
||||||
|
cout << " " << lik;
|
||||||
|
lik2 += log(fabs(model[i]));
|
||||||
|
cout << " " << lik2 << endl;
|
||||||
|
// MULT lik += (original[i] - model[i])/ model[i];
|
||||||
|
}
|
||||||
|
lik = n * log(lik);
|
||||||
|
//MULT lik +=2 *lik2;
|
||||||
|
res = lik + log((double)n) * paramsCount;
|
||||||
|
cout << " " << res << " " << endl;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
double Aic::getAiccValue(int paramsCount,
|
||||||
|
vector<double> original, vector<double> model){
|
||||||
|
int n = (original.size() > model.size() ? model.size() : original.size());
|
||||||
|
double res = 0;
|
||||||
|
double lik = 0;
|
||||||
|
double lik2 = 0;
|
||||||
|
vector<double> e;
|
||||||
|
cout << "Aicc " << endl;
|
||||||
|
cout << " e sum(lik) sum(lik2)" << endl;
|
||||||
|
for (int i = 0; i < n; i++){
|
||||||
|
//adderror
|
||||||
|
e.push_back(original[i] - model[i]);
|
||||||
|
cout << " " << e[i];
|
||||||
|
lik += e[i] * e[i];
|
||||||
|
cout << " " << lik;
|
||||||
|
lik2 += log(fabs(model[i]));
|
||||||
|
cout << " " << lik2 << endl;
|
||||||
|
// MULT lik += (original[i] - model[i])/ model[i];
|
||||||
|
}
|
||||||
|
lik = n * log(lik);
|
||||||
|
//MULT lik +=2 *lik2;
|
||||||
|
res = lik + (2 * paramsCount* n)/( n - paramsCount - 1);
|
||||||
|
cout << " " << res << " " << endl;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
valide for next models by package:
|
||||||
|
aov, clm, clmm, coxme, coxph, gls, lm, lme, lmeik, mer, merMod,
|
||||||
|
multinom, nlme, nls, polr, rlm, zeroinfl
|
||||||
|
*/
|
||||||
|
double Aic::getValue(int paramsCount, // bool isSecondOrder,
|
||||||
|
vector<double> original, vector<double> model) {
|
||||||
|
//Validate(original, model);
|
||||||
|
int n = (original.size() > model.size() ? model.size() : original.size());
|
||||||
|
////// R default package
|
||||||
|
//double logLik = Aic::logLikNLS(model, RSSweights(original, model));//Aic::logLikLM(model, RSSweights(original, model));
|
||||||
|
////R-package version
|
||||||
|
//if (true){//isSecondOrder){
|
||||||
|
// return -2 * logLik + 2 * paramsCount;
|
||||||
|
//}
|
||||||
|
//else
|
||||||
|
//{
|
||||||
|
// return -2 * logLik + 2 * paramsCount *(n / (n - paramsCount - 1));
|
||||||
|
//}
|
||||||
|
//lm version from paper
|
||||||
|
/*double rss = RSS(original, model);
|
||||||
|
double res = 2 * paramsCount + n * log(rss / (n - 2));
|
||||||
|
return res;*/
|
||||||
|
|
||||||
|
///forecast 5.6 R package
|
||||||
|
double res = 0;
|
||||||
|
double lik = 0;
|
||||||
|
double lik2 = 0;
|
||||||
|
vector<double> e;
|
||||||
|
//cout << "Aic " << endl;
|
||||||
|
//cout << " e sum(lik) sum(lik2)" << endl;
|
||||||
|
for (int i = 0; i < n; i++){
|
||||||
|
//adderror
|
||||||
|
e.push_back(original[i] - model[i]);
|
||||||
|
//cout << " " << e[i];
|
||||||
|
lik += e[i] * e[i];
|
||||||
|
//cout << " " << lik;
|
||||||
|
lik2 += log(fabs(model[i]));
|
||||||
|
//cout << " " << lik2 << endl;
|
||||||
|
// MULT lik += (original[i] - model[i])/ model[i];
|
||||||
|
}
|
||||||
|
lik = n * log(lik);
|
||||||
|
//MULT lik +=2 *lik2;
|
||||||
|
res = lik + 2 * paramsCount;
|
||||||
|
//cout << " " << res << " " << endl;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Aic::getValue(vector<double> original, vector<double> model) {
|
||||||
|
return this->getValue(4, original, model);
|
||||||
|
}
|
40
project_template/Aic.h
Normal file
40
project_template/Aic.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#ifndef AIC_H
|
||||||
|
#define AIC_H
|
||||||
|
#include "Estimation.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êðèòåðèé Àêàèêå. Íàñëåäóåòñÿ îò êëàññà Estimation.
|
||||||
|
// ðåàëèçóåò ìåòîä "ïîëó÷èòü çíà÷åíèå êðèòåðèÿ"
|
||||||
|
class Aic : public Estimation {
|
||||||
|
private:
|
||||||
|
static double getMinValue(vector<double> AicWeights); // Íàéòè ìèíèìàëüíûé ýëåìåíò âåêòîðà
|
||||||
|
//For fuzzy adoptive weights calculate
|
||||||
|
//Delta koeff
|
||||||
|
static double delta;
|
||||||
|
static double N;
|
||||||
|
static double relativeError(double value, double forecastedValue);
|
||||||
|
static double forecastedTendency(vector<double> realSeria);
|
||||||
|
static double grayTendency(double forecastedTendency, vector<double> timeSeria, vector<vector<double>> forecastedSeries);
|
||||||
|
static double grayBasicWeight(double relativeError, vector<double> timeSeria, vector<vector<double>> forecastedSeries);
|
||||||
|
static double adaptiveControlCoefficient(int i);
|
||||||
|
static double beta(vector<double> timeSeria, vector<vector<double>> forecastedSeries);
|
||||||
|
static double alpha(vector<double> timeSeria, vector<vector<double>> forecastedSeries);
|
||||||
|
public:
|
||||||
|
Aic();
|
||||||
|
~Aic();
|
||||||
|
static int getParamsCount(vector<double> model);
|
||||||
|
static double logLikNLS(vector<double> model, vector<double> weights);
|
||||||
|
static double logLikLM(vector<double> model, vector<double> weights);
|
||||||
|
static vector<double> calculateWeights(vector<double> AicWeights); //Ðàññ÷èòàòü çíà÷åíèÿ âåñîâ
|
||||||
|
static vector<double> calculateFuzzyAdaptiveWeights(vector<double> timeSeria, vector<vector<double>> forecastedSeries); //Ðàññ÷èòàòü çíà÷åíèÿ âåñîâ
|
||||||
|
double getBicValue(int paramsCount, vector<double> original, vector<double> model);
|
||||||
|
double getAiccValue(int paramsCount, vector<double> original, vector<double> model);
|
||||||
|
double getValue(int paramsCount,// int tsLen, bool isSecondOrder,
|
||||||
|
vector<double> original, vector<double> model); //ïîëó÷èòü çíà÷åíèå îöåíêè ìîäåëè
|
||||||
|
double getValue(// int tsLen, bool isSecondOrder,
|
||||||
|
vector<double> original, vector<double> model); //ïîëó÷èòü çíà÷åíèå îöåíêè ìîäåëè
|
||||||
|
|
||||||
|
};
|
||||||
|
#endif
|
126
project_template/AicWeights.cpp
Normal file
126
project_template/AicWeights.cpp
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <math.h>
|
||||||
|
#include "AicWeights.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
AicWeights::AicWeights(){
|
||||||
|
delta = 0.5;
|
||||||
|
N = 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
AicWeights::~AicWeights(){
|
||||||
|
}
|
||||||
|
|
||||||
|
double AicWeights::getMinValue(vector<double> AicValues){
|
||||||
|
double res = AicValues[0];
|
||||||
|
for (int i = 0; i < AicValues.size(); i++){
|
||||||
|
if (AicValues[i] < res){
|
||||||
|
res = AicValues[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> AicWeights::calculateWeights(vector<double> AicValues){
|
||||||
|
vector<double> diffs;
|
||||||
|
double minWeight = getMinValue(AicValues);
|
||||||
|
double sum = 0;
|
||||||
|
for (int i = 0; i < AicValues.size(); i++){
|
||||||
|
diffs.push_back(AicValues[i] - minWeight);
|
||||||
|
sum += exp(-0.5 * (AicValues[i] - minWeight));
|
||||||
|
}
|
||||||
|
vector<double> res;
|
||||||
|
for (int i = 0; i < AicValues.size(); i++){
|
||||||
|
res.push_back(exp(-0.5 *diffs[i]) / sum);
|
||||||
|
}
|
||||||
|
double check = 0;
|
||||||
|
for (int i = 0; i < res.size(); i++){
|
||||||
|
check += res[i];
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
//timeSeria - Real process time seria value vector.
|
||||||
|
//forecastedSeries - Vector of vectors of the forecasted values.
|
||||||
|
//Inner vectors must have the same length that timeSeria. Usually need cut timeSeria.
|
||||||
|
double AicWeights::alpha(vector<double> timeSeria, vector<vector<double>> forecastedSeries){
|
||||||
|
double alphaRes = abs(timeSeria[0] - forecastedSeries[0][0]);
|
||||||
|
for (int j = 0; j < forecastedSeries.size(); j++){
|
||||||
|
for (int i = 0; i < forecastedSeries[j].size(); i++){
|
||||||
|
if (alphaRes < abs(timeSeria[i] - forecastedSeries[j][i])){
|
||||||
|
alphaRes = abs(timeSeria[i] - forecastedSeries[j][i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return alphaRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
double AicWeights::beta(vector<double> timeSeria, vector<vector<double>> forecastedSeries){
|
||||||
|
double betaRes = abs(timeSeria[0] - forecastedSeries[0][0]);
|
||||||
|
for (int j = 0; j < forecastedSeries.size(); j++){
|
||||||
|
for (int i = 0; i < forecastedSeries[j].size(); i++){
|
||||||
|
if (betaRes > abs(timeSeria[i] - forecastedSeries[j][i])){
|
||||||
|
betaRes = abs(timeSeria[i] - forecastedSeries[j][i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return betaRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
double AicWeights::grayBasicWeight(double relativeError, vector<double> timeSeria, vector<vector<double>> forecastedSeries){
|
||||||
|
return (alpha(timeSeria, forecastedSeries) + beta(timeSeria, forecastedSeries) * delta) / abs(relativeError)
|
||||||
|
+ beta(timeSeria, forecastedSeries) * delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
double AicWeights::grayTendency(double forecastedTendency, vector<double> timeSeria, vector<vector<double>> forecastedSeries){
|
||||||
|
|
||||||
|
return (alpha(timeSeria, forecastedSeries) + beta(timeSeria, forecastedSeries) * delta) / abs(forecastedTendency)
|
||||||
|
+ beta(timeSeria, forecastedSeries) * delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
double AicWeights::delta;
|
||||||
|
double AicWeights::N;
|
||||||
|
//e(i)
|
||||||
|
double AicWeights::relativeError(double value, double forecastedValue){
|
||||||
|
return (value - forecastedValue) / value;
|
||||||
|
}
|
||||||
|
|
||||||
|
//c(i)
|
||||||
|
double AicWeights::forecastedTendency(vector<double> realSeria){
|
||||||
|
double sum = 0;
|
||||||
|
for (int i = 0; i < realSeria.size() - 1; i++){
|
||||||
|
sum += realSeria[i];
|
||||||
|
}
|
||||||
|
return (realSeria[realSeria.size() - 1] - (1 / (realSeria.size() - 2)) * sum) / realSeria[realSeria.size() - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
//n - positive number,usually n = 0.5
|
||||||
|
//i - forecasted value number
|
||||||
|
double AicWeights::adaptiveControlCoefficient(int i){
|
||||||
|
double acc = 0;
|
||||||
|
acc = 1 - pow(((i - 1) / i), N);
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> AicWeights::calculateFuzzyAdaptiveWeights(vector<double> timeSeria, vector<vector<double>> forecastedSeries){
|
||||||
|
vector<double> fweights;
|
||||||
|
for (int i = 0; i < forecastedSeries.size(); i++){
|
||||||
|
fweights.push_back(adaptiveControlCoefficient(timeSeria.size())* grayBasicWeight(relativeError(timeSeria[timeSeria.size() - 1], forecastedSeries[i][forecastedSeries[i].size() - 1]), timeSeria, forecastedSeries)
|
||||||
|
+ (1 - adaptiveControlCoefficient(timeSeria.size())) * grayTendency(forecastedTendency(timeSeria), timeSeria, forecastedSeries));
|
||||||
|
}
|
||||||
|
//normalization
|
||||||
|
double sum = 0;
|
||||||
|
for (int i = 0; i < fweights.size(); i++){
|
||||||
|
sum += fweights[i];
|
||||||
|
}
|
||||||
|
for (int i = 0; i < fweights.size(); i++){
|
||||||
|
fweights[i] = fweights[i] / sum;
|
||||||
|
}
|
||||||
|
double check = 0;
|
||||||
|
for (int i = 0; i < fweights.size(); i++){
|
||||||
|
check += fweights[i];
|
||||||
|
}
|
||||||
|
return fweights;
|
||||||
|
}
|
29
project_template/AicWeights.h
Normal file
29
project_template/AicWeights.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#ifndef AICWEIGHTS_H
|
||||||
|
#define AICWEIGHTS_H
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êðèòåðèé Àêàèêå. Íàñëåäóåòñÿ îò êëàññà Estimation.
|
||||||
|
// ðåàëèçóåò ìåòîä "ïîëó÷èòü çíà÷åíèå êðèòåðèÿ"
|
||||||
|
class AicWeights {
|
||||||
|
private:
|
||||||
|
static double getMinValue(vector<double> AicWeights); // Íàéòè ìèíèìàëüíûé ýëåìåíò âåêòîðà
|
||||||
|
//For fuzzy adoptive weights calculate
|
||||||
|
//Delta koeff
|
||||||
|
static double delta;
|
||||||
|
static double N;
|
||||||
|
static double relativeError(double value, double forecastedValue);
|
||||||
|
static double forecastedTendency(vector<double> realSeria);
|
||||||
|
static double grayTendency(double forecastedTendency, vector<double> timeSeria, vector<vector<double>> forecastedSeries);
|
||||||
|
static double grayBasicWeight(double relativeError, vector<double> timeSeria, vector<vector<double>> forecastedSeries);
|
||||||
|
static double adaptiveControlCoefficient(int i);
|
||||||
|
static double beta(vector<double> timeSeria, vector<vector<double>> forecastedSeries);
|
||||||
|
static double alpha(vector<double> timeSeria, vector<vector<double>> forecastedSeries);
|
||||||
|
public:
|
||||||
|
AicWeights();
|
||||||
|
~AicWeights();
|
||||||
|
static vector<double> calculateWeights(vector<double> AicWeights); //Ðàññ÷èòàòü çíà÷åíèÿ âåñîâ
|
||||||
|
static vector<double> calculateFuzzyAdaptiveWeights(vector<double> timeSeria, vector<vector<double>> forecastedSeries); //Ðàññ÷èòàòü çíà÷åíèÿ âåñîâ
|
||||||
|
};
|
||||||
|
#endif
|
104
project_template/BIC.cpp
Normal file
104
project_template/BIC.cpp
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "sMAPE.h"
|
||||||
|
#include "RMSE.h"
|
||||||
|
#include "BIC.h"
|
||||||
|
#include "Math.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
Bic::Bic(algoritm versionBIC, int paramCount) {
|
||||||
|
pc = paramCount;
|
||||||
|
this->versionBIC = versionBIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bic::~Bic() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double Bic::getValue(vector<double> original, vector<double> model) {
|
||||||
|
double valueBIC;
|
||||||
|
|
||||||
|
switch (versionBIC)
|
||||||
|
{
|
||||||
|
case algoritm::Classic:
|
||||||
|
valueBIC = classicBIC(original, model, pc);
|
||||||
|
break;
|
||||||
|
case algoritm::RMSE:
|
||||||
|
valueBIC = rmseBIC(original, model, pc);
|
||||||
|
break;
|
||||||
|
case algoritm::sMAPE:
|
||||||
|
valueBIC = smapeBIC(original, model, pc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return valueBIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Bic::getValue(int paramCount, vector<double> original, vector<double> model) {
|
||||||
|
|
||||||
|
double valueBIC;
|
||||||
|
|
||||||
|
switch (versionBIC)
|
||||||
|
{
|
||||||
|
case algoritm::Classic:
|
||||||
|
valueBIC = classicBIC(original, model, paramCount);
|
||||||
|
break;
|
||||||
|
case algoritm::RMSE:
|
||||||
|
valueBIC = rmseBIC(original, model, paramCount);
|
||||||
|
break;
|
||||||
|
case algoritm::sMAPE:
|
||||||
|
valueBIC = smapeBIC(original, model, paramCount);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return valueBIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double Bic::classicBIC(vector<double> original, vector<double> model, int paramCount)
|
||||||
|
{
|
||||||
|
|
||||||
|
double valueBIC;
|
||||||
|
|
||||||
|
double sumLik = 0;
|
||||||
|
double logLik;
|
||||||
|
int sampleSize = original.size();
|
||||||
|
|
||||||
|
for (int i = 0; i < sampleSize; i++) {
|
||||||
|
sumLik += pow(original[i] - model[i], 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
logLik = log(sumLik) * sampleSize;
|
||||||
|
|
||||||
|
valueBIC = logLik + log((double)sampleSize) * paramCount;
|
||||||
|
|
||||||
|
return valueBIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Bic::rmseBIC(vector<double> original, vector<double> model, int paramCount)
|
||||||
|
{
|
||||||
|
double valueBIC;
|
||||||
|
int sampleSize = original.size();
|
||||||
|
|
||||||
|
Estimation *RMSE = new Rmse();
|
||||||
|
double valueRMSE = RMSE->getValue(original, model);
|
||||||
|
|
||||||
|
valueBIC = valueRMSE * pow((double)sampleSize, paramCount / (2 * sampleSize));
|
||||||
|
|
||||||
|
return valueBIC;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
double Bic::smapeBIC(vector<double> original, vector<double> model, int paramCount)
|
||||||
|
{
|
||||||
|
double valueBIC;
|
||||||
|
int sampleSize = original.size();
|
||||||
|
|
||||||
|
Estimation *sMAPE = new SMape();
|
||||||
|
double value_sMAPE = sMAPE->getValue(original, model);
|
||||||
|
|
||||||
|
valueBIC = value_sMAPE * pow((double)sampleSize, paramCount / (2 * sampleSize));
|
||||||
|
|
||||||
|
return valueBIC;
|
||||||
|
}
|
30
project_template/BIC.h
Normal file
30
project_template/BIC.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#ifndef BIC_H
|
||||||
|
#define BIC_H
|
||||||
|
#include "Estimation.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
enum algoritm {
|
||||||
|
RMSE,
|
||||||
|
sMAPE,
|
||||||
|
Classic
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Bic : public Estimation {
|
||||||
|
private:
|
||||||
|
algoritm versionBIC;
|
||||||
|
|
||||||
|
double classicBIC(vector<double>, vector<double>, int);
|
||||||
|
double rmseBIC(vector<double>, vector<double>, int);
|
||||||
|
double smapeBIC(vector<double>, vector<double>, int);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Bic(algoritm, int);
|
||||||
|
~Bic();
|
||||||
|
int pc;
|
||||||
|
double getValue(vector<double>, vector<double>);
|
||||||
|
double getValue(int, vector<double>, vector<double>);
|
||||||
|
};
|
||||||
|
#endif
|
373
project_template/ClassDiagram1.cd
Normal file
373
project_template/ClassDiagram1.cd
Normal file
@ -0,0 +1,373 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ClassDiagram MajorVersion="1" MinorVersion="1" GroupingSetting="Alphabetical">
|
||||||
|
<Class Name="Estimation">
|
||||||
|
<Position X="61.5" Y="6.75" Width="2" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>IAAAAAAAAACAACAAAAAAAAAAAAAAACAAAAAAAAAAAAA=</HashCode>
|
||||||
|
<FileName>Estimation.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="File">
|
||||||
|
<Position X="38.25" Y="4.75" Width="1.5" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAggAAAAAAAQg=</HashCode>
|
||||||
|
<FileName>File.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="Method">
|
||||||
|
<Position X="12.75" Y="0.5" Width="2" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAQAAAAEAgAAAABAAAAAABAAAIBEACAkDEBEAAAAACI=</HashCode>
|
||||||
|
<FileName>Method.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="Normalization">
|
||||||
|
<Position X="34.75" Y="7.5" Width="1.5" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AABgAAAACAABAAoAAABAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||||
|
<FileName>Normalization.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="Param">
|
||||||
|
<Position X="36.5" Y="8.75" Width="1.5" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAEAAAIAAAAAAAAAAAQABAAAAAAAAGCAAAgQAEAAAAA=</HashCode>
|
||||||
|
<FileName>Param.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="TrackingControlSignal">
|
||||||
|
<Position X="40" Y="4.75" Width="1.5" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAEAAEAABAAAAAAEAAAAAAAAAAADAAAAAABQDAACAAA=</HashCode>
|
||||||
|
<FileName>TrackingControlSignal.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="Vovk">
|
||||||
|
<Position X="33" Y="4.75" Width="1.5" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAAAAABEAECAQAIAIhAIhUAABAAhAAAEIAAQEwAMAAA=</HashCode>
|
||||||
|
<FileName>Vovk.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="Preparator">
|
||||||
|
<Position X="38.25" Y="7" Width="1.5" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AABgCAAACAABFAJAiQBABBACACAAAAEACQgAAAIAACA=</HashCode>
|
||||||
|
<FileName>Preparator.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="AddTrendAddSeasonality">
|
||||||
|
<Position X="8.25" Y="6" Width="2.25" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAUAAAAEAgAAAAAAAAAAAAAAAIIAAAYACEAQAGCEAAI=</HashCode>
|
||||||
|
<FileName>AddTrendAddSeasonality.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="AddTrendMultSeasonality">
|
||||||
|
<Position X="8.25" Y="10.75" Width="2.25" />
|
||||||
|
<InheritanceLine Type="Method" ManuallyRouted="true">
|
||||||
|
<Path>
|
||||||
|
<Point X="13.75" Y="4.873" />
|
||||||
|
<Point X="13.75" Y="5.242" />
|
||||||
|
<Point X="10.922" Y="5.242" />
|
||||||
|
<Point X="10.922" Y="10.461" />
|
||||||
|
<Point X="9.375" Y="10.461" />
|
||||||
|
<Point X="9.375" Y="10.75" />
|
||||||
|
</Path>
|
||||||
|
</InheritanceLine>
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAUAAAAEAgAAAAQAAAAAAAAAAIAAAAIACEAQCGCEAAI=</HashCode>
|
||||||
|
<FileName>AddTrendMultSeasonality.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="AddTrendNoSeasonality">
|
||||||
|
<Position X="8.5" Y="15.25" Width="2" />
|
||||||
|
<InheritanceLine Type="Method" ManuallyRouted="true">
|
||||||
|
<Path>
|
||||||
|
<Point X="13.75" Y="4.873" />
|
||||||
|
<Point X="13.75" Y="5.313" />
|
||||||
|
<Point X="10.935" Y="5.313" />
|
||||||
|
<Point X="10.935" Y="15.058" />
|
||||||
|
<Point X="9.5" Y="15.058" />
|
||||||
|
<Point X="9.5" Y="15.25" />
|
||||||
|
</Path>
|
||||||
|
</InheritanceLine>
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAUAAAAEAgAAAABAAgAAAAAAAIAAAAIACAAQAACEAAI=</HashCode>
|
||||||
|
<FileName>AddTrendNoSeasonality.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="DATrendAddSeasonality">
|
||||||
|
<Position X="11.5" Y="6" Width="2" />
|
||||||
|
<InheritanceLine Type="Method" ManuallyRouted="true">
|
||||||
|
<Path>
|
||||||
|
<Point X="13.75" Y="4.873" />
|
||||||
|
<Point X="13.75" Y="5.249" />
|
||||||
|
<Point X="12.5" Y="5.249" />
|
||||||
|
<Point X="12.5" Y="6" />
|
||||||
|
</Path>
|
||||||
|
</InheritanceLine>
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAUAAAAEAgAAAAAAAAAAAAAAAIAAAEIACEAQAGCEAGI=</HashCode>
|
||||||
|
<FileName>DATrendAddSeasonality.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="DATrendMultSeasonality">
|
||||||
|
<Position X="11.5" Y="10.75" Width="2" />
|
||||||
|
<InheritanceLine Type="Method" ManuallyRouted="true">
|
||||||
|
<Path>
|
||||||
|
<Point X="13.75" Y="4.873" />
|
||||||
|
<Point X="13.801" Y="5.214" />
|
||||||
|
<Point X="13.801" Y="10.485" />
|
||||||
|
<Point X="12.5" Y="10.485" />
|
||||||
|
<Point X="12.5" Y="10.75" />
|
||||||
|
</Path>
|
||||||
|
</InheritanceLine>
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAUgAAAEAgAAAAAAAAAAAEAAAIAAAEIACEAQAGCEAAI=</HashCode>
|
||||||
|
<FileName>DATrendMultSeasonality.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="DATrendNoSeasonality">
|
||||||
|
<Position X="11.5" Y="15.5" Width="2" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAUEAAAEAgAAAAQAAAAAAAAAAIAAAEIACAAQAACEAAI=</HashCode>
|
||||||
|
<FileName>DATrendNoSeasonality.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="DMTrendAddSeasonality">
|
||||||
|
<Position X="17.5" Y="6" Width="2.25" />
|
||||||
|
<InheritanceLine Type="Method" ManuallyRouted="true">
|
||||||
|
<Path>
|
||||||
|
<Point X="13.75" Y="4.873" />
|
||||||
|
<Point X="13.75" Y="5.213" />
|
||||||
|
<Point X="18.625" Y="5.213" />
|
||||||
|
<Point X="18.625" Y="6" />
|
||||||
|
</Path>
|
||||||
|
</InheritanceLine>
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAUAAAAEAgAAAAAAAAAAAAAABIAAAEIACEAQAGCEACI=</HashCode>
|
||||||
|
<FileName>DMTrendAddSeasonality.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="DMTrendMultSeasonality">
|
||||||
|
<Position X="17.5" Y="11" Width="2.25" />
|
||||||
|
<InheritanceLine Type="Method" ManuallyRouted="true">
|
||||||
|
<Path>
|
||||||
|
<Point X="13.75" Y="4.873" />
|
||||||
|
<Point X="13.75" Y="5.249" />
|
||||||
|
<Point X="17.069" Y="5.249" />
|
||||||
|
<Point X="17.069" Y="10.562" />
|
||||||
|
<Point X="18.625" Y="10.562" />
|
||||||
|
<Point X="18.625" Y="11" />
|
||||||
|
</Path>
|
||||||
|
</InheritanceLine>
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAUgAAAEAgAEAAAAAAAAAAAAAIAAAEIACEAQAGCEAQI=</HashCode>
|
||||||
|
<FileName>DMTrendMultSeasonality.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="DMTrendNoSeasonality">
|
||||||
|
<Position X="17.5" Y="16" Width="2" />
|
||||||
|
<InheritanceLine Type="Method" ManuallyRouted="true">
|
||||||
|
<Path>
|
||||||
|
<Point X="13.75" Y="4.873" />
|
||||||
|
<Point X="13.75" Y="5.251" />
|
||||||
|
<Point X="16.991" Y="5.251" />
|
||||||
|
<Point X="16.991" Y="15.649" />
|
||||||
|
<Point X="18.5" Y="15.649" />
|
||||||
|
<Point X="18.5" Y="16" />
|
||||||
|
</Path>
|
||||||
|
</InheritanceLine>
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAUAAAAEBgAAAAQAAAAAAAAAAIAAAEIACAAQAACEAAI=</HashCode>
|
||||||
|
<FileName>DMTrendNoSeasonality.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="Dsa">
|
||||||
|
<Position X="5.25" Y="19.25" Width="2" />
|
||||||
|
<InheritanceLine Type="Method" ManuallyRouted="true">
|
||||||
|
<Path>
|
||||||
|
<Point X="13.75" Y="4.873" />
|
||||||
|
<Point X="13.75" Y="5.313" />
|
||||||
|
<Point X="7.983" Y="5.313" Type="JumpStart" />
|
||||||
|
<Point X="7.816" Y="5.313" Type="JumpEnd" />
|
||||||
|
<Point X="4.88" Y="5.313" />
|
||||||
|
<Point X="4.88" Y="18.875" />
|
||||||
|
<Point X="6.25" Y="18.875" />
|
||||||
|
<Point X="6.25" Y="19.25" />
|
||||||
|
</Path>
|
||||||
|
</InheritanceLine>
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAQAAAAEAgACAAAAAAAAAAAAAIAAAAKACAAAAQIAAAI=</HashCode>
|
||||||
|
<FileName>Dsa.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="MultTrendAddSeasonality">
|
||||||
|
<Position X="14.25" Y="10.75" Width="2.25" />
|
||||||
|
<InheritanceLine Type="Method" ManuallyRouted="true">
|
||||||
|
<Path>
|
||||||
|
<Point X="13.75" Y="4.873" />
|
||||||
|
<Point X="13.75" Y="5.244" />
|
||||||
|
<Point X="17.024" Y="5.244" />
|
||||||
|
<Point X="17.024" Y="10.426" />
|
||||||
|
<Point X="15.375" Y="10.426" />
|
||||||
|
<Point X="15.375" Y="10.75" />
|
||||||
|
</Path>
|
||||||
|
</InheritanceLine>
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAUAAAAEAgAQAAAAAAAAAAAAAIAAAAJACEAQAGCEAAI=</HashCode>
|
||||||
|
<FileName>MultTrendAddSeasonality.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="MultTrendMultSeasonality">
|
||||||
|
<Position X="14.25" Y="6" Width="2.25" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAUAAAAEAgAAAAAAAAAAAAAAAIAAAAIACEARAGCFAAI=</HashCode>
|
||||||
|
<FileName>MultTrendMultSeasonality.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="MultTrendNoSeasonality">
|
||||||
|
<Position X="14.5" Y="15.5" Width="2" />
|
||||||
|
<InheritanceLine Type="Method" ManuallyRouted="true">
|
||||||
|
<Path>
|
||||||
|
<Point X="13.75" Y="4.873" />
|
||||||
|
<Point X="13.75" Y="5.222" />
|
||||||
|
<Point X="17.056" Y="5.222" />
|
||||||
|
<Point X="17.056" Y="15.219" />
|
||||||
|
<Point X="15.5" Y="15.219" />
|
||||||
|
<Point X="15.5" Y="15.5" />
|
||||||
|
</Path>
|
||||||
|
</InheritanceLine>
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAUAAAAEAgAAAIAAAAAAAAAAAIAAAAIACAAQAACEABI=</HashCode>
|
||||||
|
<FileName>MultTrendNoSeasonality.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="NoTrendAddSeasonality">
|
||||||
|
<Position X="5.25" Y="10" Width="2" />
|
||||||
|
<InheritanceLine Type="Method" ManuallyRouted="true">
|
||||||
|
<Path>
|
||||||
|
<Point X="13.75" Y="4.873" />
|
||||||
|
<Point X="13.75" Y="5.239" />
|
||||||
|
<Point X="7.835" Y="5.239" />
|
||||||
|
<Point X="7.835" Y="9.584" />
|
||||||
|
<Point X="6.25" Y="9.584" />
|
||||||
|
<Point X="6.25" Y="10" />
|
||||||
|
</Path>
|
||||||
|
</InheritanceLine>
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAwAAAAEAgBAAAAAAAAAAAAAAIAAAAIACEAQAGCAAAI=</HashCode>
|
||||||
|
<FileName>NoTrendAddSeasonality.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="NoTrendMultSeasonality">
|
||||||
|
<Position X="5.25" Y="14.5" Width="2" />
|
||||||
|
<InheritanceLine Type="Method" ManuallyRouted="true">
|
||||||
|
<Path>
|
||||||
|
<Point X="13.75" Y="4.873" />
|
||||||
|
<Point X="13.75" Y="5.166" />
|
||||||
|
<Point X="7.9" Y="5.166" />
|
||||||
|
<Point X="7.9" Y="14.2" />
|
||||||
|
<Point X="6.25" Y="14.2" />
|
||||||
|
<Point X="6.25" Y="14.5" />
|
||||||
|
</Path>
|
||||||
|
</InheritanceLine>
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAQAAAAEAgIAAABAAAAAAAAAAIAAAAIACEAQAGCAAAI=</HashCode>
|
||||||
|
<FileName>NoTrendMultSeasonality.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="NoTrendNoSeasonality">
|
||||||
|
<Position X="5.25" Y="6" Width="2" />
|
||||||
|
<InheritanceLine Type="Method" ManuallyRouted="true">
|
||||||
|
<Path>
|
||||||
|
<Point X="13.75" Y="4.873" />
|
||||||
|
<Point X="13.75" Y="5.249" />
|
||||||
|
<Point X="6.25" Y="5.249" />
|
||||||
|
<Point X="6.25" Y="6" />
|
||||||
|
</Path>
|
||||||
|
</InheritanceLine>
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAQAAAAEAgAAAAAAAAAAAAAAAIAAAANACAAQAACAAAI=</HashCode>
|
||||||
|
<FileName>NoTrendNoSeasonality.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="Aic">
|
||||||
|
<Position X="58.5" Y="9.5" Width="2.5" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AIAAAAAACwAAACIAAQCAFAAEAEAAoBAAQAAQAFCAAAA=</HashCode>
|
||||||
|
<FileName>Aic.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="AicWeights">
|
||||||
|
<Position X="36.5" Y="4.75" Width="1.5" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>ABAAAQAACwAAAAAAAACABAAAAAAAoAAAQAAQAFCAAAA=</HashCode>
|
||||||
|
<FileName>AicWeights.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="Mape">
|
||||||
|
<Position X="61.75" Y="9.5" Width="2" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAIQAAA=</HashCode>
|
||||||
|
<FileName>Mape.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="SMape">
|
||||||
|
<Position X="64.5" Y="9.5" Width="2" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAAAAAAAAAAAACAAgAAAAAABAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||||
|
<FileName>SMape.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="A">
|
||||||
|
<Position X="34.75" Y="4.75" Width="1.5" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAAAAAAAgAAAACAAAAAAAAAACAAICAAAAAAAIAAAgAA=</HashCode>
|
||||||
|
<FileName>A.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="Fuzzy">
|
||||||
|
<Position X="2.5" Y="6" Width="2" />
|
||||||
|
<InheritanceLine Type="Method" ManuallyRouted="true">
|
||||||
|
<Path>
|
||||||
|
<Point X="13.75" Y="4.873" />
|
||||||
|
<Point X="13.75" Y="5.191" />
|
||||||
|
<Point X="3.5" Y="5.191" />
|
||||||
|
<Point X="3.5" Y="6" />
|
||||||
|
</Path>
|
||||||
|
</InheritanceLine>
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAUAAAAEFgIGAgAEAAQkAAAAAIBEAGIhCEiQAEAAAAI=</HashCode>
|
||||||
|
<FileName>Fuzzy.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Class Name="FuzzyWithSets">
|
||||||
|
<Position X="2.5" Y="13.75" Width="2.25" />
|
||||||
|
<InheritanceLine Type="Method" ManuallyRouted="true">
|
||||||
|
<Path>
|
||||||
|
<Point X="13.75" Y="4.873" />
|
||||||
|
<Point X="13.75" Y="5.25" />
|
||||||
|
<Point X="7.983" Y="5.25" Type="JumpStart" />
|
||||||
|
<Point X="7.816" Y="5.25" Type="JumpEnd" />
|
||||||
|
<Point X="4.88" Y="5.25" />
|
||||||
|
<Point X="4.88" Y="13.501" />
|
||||||
|
<Point X="3.625" Y="13.501" />
|
||||||
|
<Point X="3.625" Y="13.75" />
|
||||||
|
</Path>
|
||||||
|
</InheritanceLine>
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAcQAAIEBgIKAgAEQIQgAAAAAIQEAEIhCEkQAGCEAAI=</HashCode>
|
||||||
|
<FileName>FuzzyWithSets.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Class>
|
||||||
|
<Struct Name="AggModel">
|
||||||
|
<Position X="40" Y="8" Width="1.5" />
|
||||||
|
<TypeIdentifier>
|
||||||
|
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAQAEACAgAAAAAAAAAAA=</HashCode>
|
||||||
|
<FileName>Vovk.h</FileName>
|
||||||
|
</TypeIdentifier>
|
||||||
|
</Struct>
|
||||||
|
<Font Name="Segoe UI" Size="9" />
|
||||||
|
</ClassDiagram>
|
152
project_template/DATrendAddSeasonality.cpp
Normal file
152
project_template/DATrendAddSeasonality.cpp
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// äåìïèíã àääèòèâíûé òðåíä, àääèòèâíàÿ ñåçîííîñòü
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "DATrendAddSeasonality.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
// êîíñòðóêòîð ñ çàäàííûìè íåïîñðåäñòâåííî ïàðàìåòðàìè
|
||||||
|
DATrendAddSeasonality::DATrendAddSeasonality(vector<double> timeSeries, int countPointForecast) {
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
DATrendAddSeasonality::~DATrendAddSeasonality() {
|
||||||
|
// îñâîáîæäàåòñÿ ïàìÿòü
|
||||||
|
std::vector<double> ().swap(S);
|
||||||
|
std::vector<double> ().swap(x);
|
||||||
|
std::vector<double> ().swap(T);
|
||||||
|
std::vector<double> ().swap(I);
|
||||||
|
std::vector<double> ().swap(forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// èíèöèàëèçàöèÿ ìîäåëè, çàäàíèå ïåðâîíà÷àëüíûõ çíà÷åíèé
|
||||||
|
void DATrendAddSeasonality::init() {
|
||||||
|
S.clear();
|
||||||
|
T.clear();
|
||||||
|
I.clear();
|
||||||
|
forecast.clear();
|
||||||
|
|
||||||
|
double sumS = 0;
|
||||||
|
double sumT = 0;
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
sumS += x[t];
|
||||||
|
sumT += x[t+p];
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(sumS / p);
|
||||||
|
T.push_back((sumT/ p - S[0]) / p);
|
||||||
|
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I.push_back(x[t] - S[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
forecast.push_back(S[0] + T[0] * phi + I[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Çàäàòü ïàðàìåòð
|
||||||
|
void DATrendAddSeasonality::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("gamma") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
} else if (paramName.compare("p") == 0) {
|
||||||
|
this->p = value;
|
||||||
|
} else if (paramName.compare("delta") == 0) {
|
||||||
|
this->delta = value;
|
||||||
|
} else if (paramName.compare("phi") == 0) {
|
||||||
|
this->phi = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void DATrendAddSeasonality::createModel() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = x[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + T[t] * phi + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(T[t] * phi + alpha * gamma * e); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] + T[t+1] * phi + I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void DATrendAddSeasonality::createModelForEstimation() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = xLearning[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + T[t] * phi + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(T[t] * phi + alpha * gamma * e); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] + T[t+1] * phi + I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ ïðîãíîçà
|
||||||
|
vector<double> DATrendAddSeasonality::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double DATrendAddSeasonality::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(3, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* DATrendAddSeasonality::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0.1; al < 1; al+= 0.05) {
|
||||||
|
for (double gam = 0.1; gam < 1; gam+= 0.05) {
|
||||||
|
for (double del = 0.1; del < 1;del+= 0.05) {
|
||||||
|
for (double ph = 0.1; ph < 1;ph+= 0.05) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->setParam("gamma", gam);
|
||||||
|
this->setParam("delta", del);
|
||||||
|
this->setParam("ph", ph);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
optimal->gamma = gam;
|
||||||
|
optimal->delta = del;
|
||||||
|
optimal->phi = ph;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
||||||
|
|
35
project_template/DATrendAddSeasonality.h
Normal file
35
project_template/DATrendAddSeasonality.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#ifndef DATRENDADDSEASONALITY_H
|
||||||
|
#define DATRENDADDSEASONALITY_H
|
||||||
|
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êîíêðåòíàÿ ðåàëèçàöèÿ àáñòðàêòíîãî êëàññà Method
|
||||||
|
// ðåàëèçóåò ìåòîä ýêñïîíåíöèàëüíîãî ñ äåìïèíã àääèòèâíûì òðåíäîì, àääèòèâíàÿ ñåçîííîñòü
|
||||||
|
class DATrendAddSeasonality : public Method {
|
||||||
|
public:
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
vector<double> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
double delta; // ïàðàìåòð ñãëàæèâàíèÿ ñåçîííîé êîìïîíåíòû
|
||||||
|
vector<double> T; // ñãëàæåííûé òðåíä
|
||||||
|
vector<double> I; // ñåçîííàÿ êîìïîíåíòà
|
||||||
|
int p; // ïåðèîä ñåçîííîñòè
|
||||||
|
double phi; // ïàðàìåòð äåìïèíãà
|
||||||
|
|
||||||
|
DATrendAddSeasonality(vector<double>, int);
|
||||||
|
~DATrendAddSeasonality();
|
||||||
|
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
150
project_template/DATrendMultSeasonality.cpp
Normal file
150
project_template/DATrendMultSeasonality.cpp
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// äåìïèíã àääèòèâíûé òðåíä, ìóëüòèïëèêàòâíàÿ ñåçîííîñòü
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "DATrendMultSeasonality.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
// êîíñòðóêòîð ñ çàäàííûìè íåïîñðåäñòâåííî ïàðàìåòðàìè
|
||||||
|
DATrendMultSeasonality::DATrendMultSeasonality(vector<double> timeSeries, int countPointForecast) {
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
DATrendMultSeasonality::~DATrendMultSeasonality() {
|
||||||
|
// îñâîáîæäàåòñÿ ïàìÿòü
|
||||||
|
std::vector<double> ().swap(S);
|
||||||
|
std::vector<double> ().swap(x);
|
||||||
|
std::vector<double> ().swap(T);
|
||||||
|
std::vector<double> ().swap(I);
|
||||||
|
std::vector<double> ().swap(forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// èíèöèàëèçàöèÿ ìîäåëè, çàäàíèå ïåðâîíà÷àëüíûõ çíà÷åíèé
|
||||||
|
void DATrendMultSeasonality::init() {
|
||||||
|
S.clear();
|
||||||
|
T.clear();
|
||||||
|
I.clear();
|
||||||
|
forecast.clear();
|
||||||
|
|
||||||
|
double sumS = 0;
|
||||||
|
double sumT = 0;
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
sumS += x[t];
|
||||||
|
sumT += x[t+p];
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(sumS / p);
|
||||||
|
T.push_back((sumT/ p - S[0]) / p);
|
||||||
|
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I.push_back(x[t] / S[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
forecast.push_back((S[0] + T[0] * phi) * I[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Çàäàòü ïàðàìåòð
|
||||||
|
void DATrendMultSeasonality::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("gamma") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
} else if (paramName.compare("p") == 0) {
|
||||||
|
this->p = value;
|
||||||
|
} else if (paramName.compare("delta") == 0) {
|
||||||
|
this->delta = value;
|
||||||
|
} else if (paramName.compare("phi") == 0) {
|
||||||
|
this->phi = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void DATrendMultSeasonality::createModel() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = x[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + T[t] * phi + alpha * e / I[t]); // óðîâåíü
|
||||||
|
T.push_back(T[t] * phi + alpha * gamma * e / I[t]); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e / (S[t] + T[t] * phi)); // ñåçîííîñòü
|
||||||
|
forecast.push_back((S[t+1] + T[t+1] * phi ) * I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void DATrendMultSeasonality::createModelForEstimation() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = xLearning[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + T[t] * phi + alpha * e / I[t]); // óðîâåíü
|
||||||
|
T.push_back(T[t] * phi + alpha * gamma * e / I[t]); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e / (S[t] + T[t] * phi)); // ñåçîííîñòü
|
||||||
|
forecast.push_back((S[t+1] + T[t+1] * phi ) * I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ ïðîãíîçà
|
||||||
|
vector<double> DATrendMultSeasonality::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double DATrendMultSeasonality::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(3, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* DATrendMultSeasonality::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0.1; al < 1; al+= 0.05) {
|
||||||
|
for (double gam = 0.1; gam < 1; gam+= 0.05) {
|
||||||
|
for (double del = 0.1; del < 1;del+= 0.05) {
|
||||||
|
for (double ph = 0.1; ph < 1;ph+= 0.05) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->setParam("gamma", gam);
|
||||||
|
this->setParam("delta", del);
|
||||||
|
this->setParam("ph", ph);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
optimal->gamma = gam;
|
||||||
|
optimal->delta = del;
|
||||||
|
optimal->phi = ph;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
||||||
|
|
35
project_template/DATrendMultSeasonality.h
Normal file
35
project_template/DATrendMultSeasonality.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#ifndef DATRENDMULTSEASONALITY_H
|
||||||
|
#define DATRENDMULTSEASONALITY_H
|
||||||
|
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êîíêðåòíàÿ ðåàëèçàöèÿ àáñòðàêòíîãî êëàññà Method
|
||||||
|
// ðåàëèçóåò ìåòîä ýêñïîíåíöèàëüíîãî ñ äåìïèíã àääèòèâíûì òðåíäîì, àääèòèâíàÿ ñåçîííîñòü
|
||||||
|
class DATrendMultSeasonality : public Method {
|
||||||
|
public:
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
vector<double> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
double delta; // ïàðàìåòð ñãëàæèâàíèÿ ñåçîííîé êîìïîíåíòû
|
||||||
|
vector<double> T; // ñãëàæåííûé òðåíä
|
||||||
|
vector<double> I; // ñåçîííàÿ êîìïîíåíòà
|
||||||
|
int p; // ïåðèîä ñåçîííîñòè
|
||||||
|
double phi; // ïàðàìåòð äåìïèíãà
|
||||||
|
|
||||||
|
DATrendMultSeasonality(vector<double>, int);
|
||||||
|
~DATrendMultSeasonality();
|
||||||
|
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
125
project_template/DATrendNoSeasonality.cpp
Normal file
125
project_template/DATrendNoSeasonality.cpp
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// äåìïèíã àääèòèâíûé òðåíä, áåç ñåçîííîñòè
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "DATrendNoSeasonality.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
// êîíñòðóêòîð ñ çàäàííûìè íåïîñðåäñòâåííî ïàðàìåòðàìè
|
||||||
|
DATrendNoSeasonality::DATrendNoSeasonality(vector<double> timeSeries, int countPointForecast) {
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
DATrendNoSeasonality::~DATrendNoSeasonality() {
|
||||||
|
// îñâîáîæäàåòñÿ ïàìÿòü
|
||||||
|
std::vector<double> ().swap(S);
|
||||||
|
std::vector<double> ().swap(x);
|
||||||
|
std::vector<double> ().swap(T);
|
||||||
|
std::vector<double> ().swap(forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// èíèöèàëèçàöèÿ ìîäåëè, çàäàíèå ïåðâîíà÷àëüíûõ çíà÷åíèé
|
||||||
|
void DATrendNoSeasonality::init() {
|
||||||
|
S.clear();
|
||||||
|
T.clear();
|
||||||
|
forecast.clear();
|
||||||
|
|
||||||
|
T.push_back(x[1] - x[0]);
|
||||||
|
S.push_back(x[0]);
|
||||||
|
forecast.push_back(S[0] + T[0] * phi);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Çàäàòü ïàðàìåòð
|
||||||
|
void DATrendNoSeasonality::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("gamma") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
} else if (paramName.compare("phi") == 0) {
|
||||||
|
this->phi = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void DATrendNoSeasonality::createModel() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = x[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + phi * T[t] + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(phi * T[t] + alpha * gamma * e); // çàòóõàþùèé òðåíä
|
||||||
|
forecast.push_back(S[t+1] + phi * T[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void DATrendNoSeasonality::createModelForEstimation() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = xLearning[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + phi * T[t] + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(phi * T[t] + alpha * gamma * e); // çàòóõàþùèé òðåíä
|
||||||
|
forecast.push_back(S[t+1] + phi * T[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ ïðîãíîçà
|
||||||
|
vector<double> DATrendNoSeasonality::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double DATrendNoSeasonality::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(2, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* DATrendNoSeasonality::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0.1; al < 1; al+= 0.05) {
|
||||||
|
for (double gam = 0.1; gam < 1; gam+= 0.05) {
|
||||||
|
for (double ph = 0.1; ph < 1; ph+= 0.05) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->setParam("gamma", gam);
|
||||||
|
this->setParam("phi", ph);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
optimal->gamma = gam;
|
||||||
|
optimal->phi = phi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
32
project_template/DATrendNoSeasonality.h
Normal file
32
project_template/DATrendNoSeasonality.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#ifndef DATRENDNOSEASONALITY_H
|
||||||
|
#define DATRENDNOSEASONALITY_H
|
||||||
|
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êîíêðåòíàÿ ðåàëèçàöèÿ àáñòðàêòíîãî êëàññà Method
|
||||||
|
// ðåàëèçóåò ìåòîä ýêñïîíåíöèàëüíîãî ñ äåìïèíã àääèòèâíûì òðåíäîì, áåç ñåçîííîñòè
|
||||||
|
class DATrendNoSeasonality : public Method {
|
||||||
|
public:
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
vector<double> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
vector<double> T; // ñãëàæåííûé òðåíä
|
||||||
|
double phi; // ïàðàìåòð äåìïèíãà
|
||||||
|
|
||||||
|
DATrendNoSeasonality(vector<double>, int);
|
||||||
|
~DATrendNoSeasonality();
|
||||||
|
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
155
project_template/DMTrendAddSeasonality.cpp
Normal file
155
project_template/DMTrendAddSeasonality.cpp
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// äåìïèíã ìóëüòèïëèêàòèâíûé òðåíä, àääèòèâíàÿ ñåçîííîñòü
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include "math.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "DMTrendAddSeasonality.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
// êîíñòðóêòîð ñ çàäàííûìè íåïîñðåäñòâåííî ïàðàìåòðàìè
|
||||||
|
DMTrendAddSeasonality::DMTrendAddSeasonality(vector<double> timeSeries, int countPointForecast) {
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
DMTrendAddSeasonality::~DMTrendAddSeasonality() {
|
||||||
|
// îñâîáîæäàåòñÿ ïàìÿòü
|
||||||
|
std::vector<double> ().swap(S);
|
||||||
|
std::vector<double> ().swap(x);
|
||||||
|
std::vector<double> ().swap(T);
|
||||||
|
std::vector<double> ().swap(I);
|
||||||
|
std::vector<double> ().swap(forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// èíèöèàëèçàöèÿ ìîäåëè, çàäàíèå ïåðâîíà÷àëüíûõ çíà÷åíèé
|
||||||
|
void DMTrendAddSeasonality::init() {
|
||||||
|
S.clear();
|
||||||
|
T.clear();
|
||||||
|
I.clear();
|
||||||
|
forecast.clear();
|
||||||
|
|
||||||
|
double sumS = 0;
|
||||||
|
double sumT = 0;
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
sumS += x[t];
|
||||||
|
sumT += x[t+p];
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(sumS / p);
|
||||||
|
T.push_back((sumT/ p - S[0]) / p);
|
||||||
|
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I.push_back(x[t] - S[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
forecast.push_back(S[0] * pow(T[0], phi) + I[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Çàäàòü ïàðàìåòð
|
||||||
|
void DMTrendAddSeasonality::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("gamma") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
} else if (paramName.compare("p") == 0) {
|
||||||
|
this->p = value;
|
||||||
|
} else if (paramName.compare("delta") == 0) {
|
||||||
|
this->delta = value;
|
||||||
|
} else if (paramName.compare("phi") == 0) {
|
||||||
|
this->phi = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void DMTrendAddSeasonality::createModel() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1 +this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = x[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] * pow(T[t], phi) + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(pow(T[t], phi) + alpha * gamma * e / S[t]); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] * pow(T[t+1], phi) + I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void DMTrendAddSeasonality::createModelForEstimation() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = xLearning[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] * pow(T[t], phi) + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(pow(T[t], phi) + alpha * gamma * e / S[t]); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] * pow(T[t+1], phi) + I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ ïðîãíîçà
|
||||||
|
vector<double> DMTrendAddSeasonality::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double DMTrendAddSeasonality::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(3, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* DMTrendAddSeasonality::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0.1; al < 1; al+= 0.05) {
|
||||||
|
for (double gam = 0.1; gam < 1; gam+= 0.05) {
|
||||||
|
for (double del = 0.1; del < 1;del+= 0.05) {
|
||||||
|
for (double ph = 0.1; ph < 1;ph+= 0.05) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->setParam("gamma", gam);
|
||||||
|
this->setParam("delta", del);
|
||||||
|
this->setParam("ph", ph);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
optimal->gamma = gam;
|
||||||
|
optimal->delta = del;
|
||||||
|
optimal->phi = ph;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
||||||
|
|
35
project_template/DMTrendAddSeasonality.h
Normal file
35
project_template/DMTrendAddSeasonality.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#ifndef DMTRENDADDSEASONALITY_H
|
||||||
|
#define DMTRENDADDSEASONALITY_H
|
||||||
|
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êîíêðåòíàÿ ðåàëèçàöèÿ àáñòðàêòíîãî êëàññà Method
|
||||||
|
// ðåàëèçóåò ìåòîä ýêñïîíåíöèàëüíîãî ñ äåìïèíã ìóëüòèïëèêàòèâíûì òðåíäîì, àääèòèâíàÿ ñåçîííîñòü
|
||||||
|
class DMTrendAddSeasonality : public Method {
|
||||||
|
public:
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
vector<double> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
double delta; // ïàðàìåòð ñãëàæèâàíèÿ ñåçîííîé êîìïîíåíòû
|
||||||
|
vector<double> T; // ñãëàæåííûé òðåíä
|
||||||
|
vector<double> I; // ñåçîííàÿ êîìïîíåíòà
|
||||||
|
int p; // ïåðèîä ñåçîííîñòè
|
||||||
|
double phi; // ïàðàìåòð äåìïèíãà
|
||||||
|
|
||||||
|
DMTrendAddSeasonality(vector<double>, int);
|
||||||
|
~DMTrendAddSeasonality();
|
||||||
|
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
149
project_template/DMTrendMultSeasonality.cpp
Normal file
149
project_template/DMTrendMultSeasonality.cpp
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// äåìïèíã ìóëüòèïëèêàòèâíûé òðåíä, ìóëüòèïëèêàòâíàÿ ñåçîííîñòü
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include "math.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "DMTrendMultSeasonality.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
// êîíñòðóêòîð ñ çàäàííûìè íåïîñðåäñòâåííî ïàðàìåòðàìè
|
||||||
|
DMTrendMultSeasonality::DMTrendMultSeasonality(vector<double> timeSeries, int countPointForecast) {
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
DMTrendMultSeasonality::~DMTrendMultSeasonality() {
|
||||||
|
// îñâîáîæäàåòñÿ ïàìÿòü
|
||||||
|
std::vector<double> ().swap(S);
|
||||||
|
std::vector<double> ().swap(x);
|
||||||
|
std::vector<double> ().swap(T);
|
||||||
|
std::vector<double> ().swap(I);
|
||||||
|
std::vector<double> ().swap(forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// èíèöèàëèçàöèÿ ìîäåëè, çàäàíèå ïåðâîíà÷àëüíûõ çíà÷åíèé
|
||||||
|
void DMTrendMultSeasonality::init() {
|
||||||
|
S.clear();
|
||||||
|
T.clear();
|
||||||
|
I.clear();
|
||||||
|
forecast.clear();
|
||||||
|
|
||||||
|
double sumS = 0;
|
||||||
|
double sumT = 0;
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
sumS += x[t];
|
||||||
|
sumT += x[t+p];
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(sumS / p);
|
||||||
|
T.push_back((sumT/ p - S[0]) / p);
|
||||||
|
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I.push_back(x[t] / S[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
forecast.push_back(S[0] * pow(T[0], phi) * I[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Çàäàòü ïàðàìåòð
|
||||||
|
void DMTrendMultSeasonality::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("gamma") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
} else if (paramName.compare("p") == 0) {
|
||||||
|
this->p = value;
|
||||||
|
} else if (paramName.compare("delta") == 0) {
|
||||||
|
this->delta = value;
|
||||||
|
} else if (paramName.compare("phi") == 0) {
|
||||||
|
this->phi = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void DMTrendMultSeasonality::createModel() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = x[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] * pow(T[t], phi) + alpha * e / I[t]); // óðîâåíü
|
||||||
|
T.push_back(pow(T[t], phi) + alpha * gamma * e / (I[t] * S[t])); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e / (S[t] * pow(T[t], phi))); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] * pow(T[t+1], phi) * I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü ñ íîâûì çíà÷åíèåì ïàðàìåòðà. ïåðåãðóæåííûé ìåòîä
|
||||||
|
void DMTrendMultSeasonality::createModelForEstimation() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = xLearning[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
`
|
||||||
|
S.push_back(S[t] * pow(T[t], phi) + alpha * e / I[t]); // óðîâåíü
|
||||||
|
T.push_back(pow(T[t], phi) + alpha * gamma * e / (I[t] * S[t])); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e / (S[t] * pow(T[t], phi))); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] * pow(T[t+1], phi) * I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ ïðîãíîçà
|
||||||
|
vector<double> DMTrendMultSeasonality::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double DMTrendMultSeasonality::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(3, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* DMTrendMultSeasonality::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0.1; al < 1; al+= 0.05) {
|
||||||
|
for (double gam = 0.1; gam < 1; gam+= 0.05) {
|
||||||
|
for (double del = 0.1; del < 1;del+= 0.05) {
|
||||||
|
for (double ph = 0.1; ph < 1;ph+= 0.05) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->setParam("gamma", gam);
|
||||||
|
this->setParam("delta", del);
|
||||||
|
this->setParam("phi", ph);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
optimal->gamma = gam;
|
||||||
|
optimal->delta = del;
|
||||||
|
optimal->phi = ph;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
36
project_template/DMTrendMultSeasonality.h
Normal file
36
project_template/DMTrendMultSeasonality.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#ifndef DMTRENDMULTSEASONALITY_H
|
||||||
|
#define DMTRENDMULTSEASONALITY_H
|
||||||
|
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êîíêðåòíàÿ ðåàëèçàöèÿ àáñòðàêòíîãî êëàññà Method
|
||||||
|
// ðåàëèçóåò ìåòîä ýêñïîíåíöèàëüíîãî ñ äåìïèíã ìóëüòèïëèêàòèâíûì òðåíäîì, àääèòèâíàÿ ñåçîííîñòü
|
||||||
|
class DMTrendMultSeasonality : public Method {
|
||||||
|
public:
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
vector<double> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
double delta; // ïàðàìåòð ñãëàæèâàíèÿ ñåçîííîé êîìïîíåíòû
|
||||||
|
vector<double> T; // ñãëàæåííûé òðåíä
|
||||||
|
vector<double> I; // ñåçîííàÿ êîìïîíåíòà
|
||||||
|
vector<double> R; // äåìïèíã
|
||||||
|
int p; // ïåðèîä ñåçîííîñòè
|
||||||
|
double phi; // ïàðàìåòð äåìïèíãà
|
||||||
|
|
||||||
|
DMTrendMultSeasonality(vector<double>, int);
|
||||||
|
~DMTrendMultSeasonality();
|
||||||
|
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
127
project_template/DMTrendNoSeasonality.cpp
Normal file
127
project_template/DMTrendNoSeasonality.cpp
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// äåìïèíã ìóëüòèïëèêàòèâíûé òðåíä, áåç ñåçîííîñòè
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <math.h>
|
||||||
|
#include "DMTrendNoSeasonality.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
// êîíñòðóêòîð ñ çàäàííûìè íåïîñðåäñòâåííî ïàðàìåòðàìè
|
||||||
|
DMTrendNoSeasonality::DMTrendNoSeasonality(vector<double> timeSeries, int countPointForecast) {
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
DMTrendNoSeasonality::~DMTrendNoSeasonality() {
|
||||||
|
// îñâîáîæäàåòñÿ ïàìÿòü
|
||||||
|
std::vector<double> ().swap(S);
|
||||||
|
std::vector<double> ().swap(x);
|
||||||
|
std::vector<double> ().swap(T);
|
||||||
|
std::vector<double> ().swap(forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// èíèöèàëèçàöèÿ ìîäåëè, çàäàíèå ïåðâîíà÷àëüíûõ çíà÷åíèé
|
||||||
|
void DMTrendNoSeasonality::init() {
|
||||||
|
S.clear();
|
||||||
|
T.clear();
|
||||||
|
forecast.clear();
|
||||||
|
|
||||||
|
T.push_back(x[1] / x[0]);
|
||||||
|
S.push_back(x[0]);
|
||||||
|
forecast.push_back(S[0] * pow(T[0], phi));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Çàäàòü ïàðàìåòð
|
||||||
|
void DMTrendNoSeasonality::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("gamma") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
} else if (paramName.compare("phi") == 0) {
|
||||||
|
this->phi = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void DMTrendNoSeasonality::createModel() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = x[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] * pow(T[t], phi) + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(pow(T[t], phi) + alpha * gamma * e / S[t]); // çàòóõàþùèé òðåíä
|
||||||
|
forecast.push_back(S[t+1] * pow(T[t+1], phi)); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void DMTrendNoSeasonality::createModelForEstimation() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = xLearning[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] * pow(T[t], phi) + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(pow(T[t], phi) + alpha * gamma * e / S[t]); // çàòóõàþùèé òðåíä
|
||||||
|
forecast.push_back(S[t+1] * pow(T[t+1], phi)); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ ïðîãíîçà
|
||||||
|
vector<double> DMTrendNoSeasonality::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double DMTrendNoSeasonality::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(3, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* DMTrendNoSeasonality::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0.1; al < 1; al+= 0.05) {
|
||||||
|
for (double gam = 0.1; gam < 1; gam+= 0.05) {
|
||||||
|
for (double ph = 0.1; ph < 1; ph+= 0.05) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->setParam("gamma", gam);
|
||||||
|
this->setParam("phi", ph);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
optimal->gamma = gam;
|
||||||
|
optimal->phi = phi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
32
project_template/DMTrendNoSeasonality.h
Normal file
32
project_template/DMTrendNoSeasonality.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#ifndef DMTRENDNOSEASONALITY_H
|
||||||
|
#define DMTRENDNOSEASONALITY_H
|
||||||
|
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êîíêðåòíàÿ ðåàëèçàöèÿ àáñòðàêòíîãî êëàññà Method
|
||||||
|
// ðåàëèçóåò ìåòîä ýêñïîíåíöèàëüíîãî ñ äåìïèíã ìóëüòèïëèêàòèâíûì òðåíäîì, áåç ñåçîííîñòè
|
||||||
|
class DMTrendNoSeasonality : public Method {
|
||||||
|
public:
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
vector<double> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
vector<double> T; // ñãëàæåííûé òðåíä
|
||||||
|
double phi; // ïàðàìåòð äåìïèíãà
|
||||||
|
|
||||||
|
DMTrendNoSeasonality(vector<double>, int);
|
||||||
|
~DMTrendNoSeasonality();
|
||||||
|
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
307
project_template/Dsa.cpp
Normal file
307
project_template/Dsa.cpp
Normal file
@ -0,0 +1,307 @@
|
|||||||
|
#include "StdAfx.h"
|
||||||
|
#include "Dsa.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
Dsa::Dsa(vector<double> timeSeries, int countPointForecast){
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
Dsa::~Dsa(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dsa::init() {
|
||||||
|
defineUniversum();
|
||||||
|
fuzzyTs.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïðåäåëèòü óíèâåðñóì äëÿ âðåìåííîãî ðÿäà
|
||||||
|
// èùåì ìàêñèìóì, ìèíèìóì, ïðîèçâîäèì ðàçáèåíèå íà çàäàííûå èíòåðâàëû
|
||||||
|
void Dsa::defineUniversum() {
|
||||||
|
this->universumMax = x[0];
|
||||||
|
this->universumMin = x[0];
|
||||||
|
for (int i = 1; i < x.size(); i++) {
|
||||||
|
if (universumMax < x[i]) {
|
||||||
|
universumMax = x[i];
|
||||||
|
}
|
||||||
|
if (universumMin > x[i]) {
|
||||||
|
universumMin = x[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñîçäàåì ôóíêöèè ïðèíàäëåæíîñòè
|
||||||
|
// ïðèíèìàåì ïî óìîë÷àíèþ, ÷òî ñîñåäíèå ïåðåêðûâàþòñÿ íà ïîëîâèíó ìåæäó ñîáîé
|
||||||
|
// ðàç åñòü êîëè÷åñòâî èíòåðâàëîâ, òî âû÷èñëÿåì ðàçìåð îñíîâàíèÿ òðåóãîëüíèêà
|
||||||
|
double baseSize = (universumMax - universumMin) / countFuzzyParts;
|
||||||
|
a.resize(countFuzzyParts + 1);
|
||||||
|
for (int i=0; i < countFuzzyParts + 1;i++){
|
||||||
|
a[i] = (A(universumMin + (i-sizeLabels) * baseSize, universumMin + (i+sizeLabels)*baseSize));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ôàççèôèöèðîâàòü òîëüêî îäíó òî÷êó
|
||||||
|
// âîçâðàùàåò èíäåêñ ôóíêöèè ïðèíàäëåæíîñòè ñ ìàêñèìàëüíûì çíà÷åíèåì
|
||||||
|
int Dsa::fuzzyfication(double value) {
|
||||||
|
// ïåðåáèðàåì âñå ôóíêöèè ïðèíàäëåæíîñòè,
|
||||||
|
// åñëè íàøëè íàèáîëüøóþ ñòåïåíü ïðèíàäëåæíîñòè, òî ôèêñèðóåì èíäåêñ ôóíêöèè
|
||||||
|
int indMax = 0;
|
||||||
|
double max = a[0].getValue(value);
|
||||||
|
for (int j =0; j < a.size(); j++) {
|
||||||
|
if (a[j].getValue(value) > max) {
|
||||||
|
indMax = j;
|
||||||
|
max = a[j].getValue(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return indMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dsa::createRules() {
|
||||||
|
rulesIn.clear();
|
||||||
|
rulesIn.resize(fuzzyTs.size() - countRulesIn);
|
||||||
|
rulesOut.clear();
|
||||||
|
rulesOut.resize(fuzzyTs.size() - countRulesIn);
|
||||||
|
for (int i=0; i < fuzzyTs.size() - countRulesIn; i ++) {
|
||||||
|
vector<int> v;
|
||||||
|
v.resize(countRulesIn);
|
||||||
|
for (int j=i; j < i + countRulesIn; j++) {
|
||||||
|
v[j-i] = fuzzyTs[j];
|
||||||
|
}
|
||||||
|
rulesIn[i] = v;
|
||||||
|
rulesOut[i] = fuzzyTs[i+countRulesIn];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vector<int> Dsa::searchRules(vector<int> inPart) {
|
||||||
|
vector<int> res;
|
||||||
|
for (int i = 0; i < rulesIn.size(); i++) {
|
||||||
|
bool isRuleFound = true;
|
||||||
|
for (int j = 0; j < rulesIn[i].size(); j++) {
|
||||||
|
if (rulesIn[i][j] != inPart[j]) {
|
||||||
|
isRuleFound = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isRuleFound) {
|
||||||
|
res.push_back(rulesOut[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<int> Dsa::searchRulesForSeason(int index) {
|
||||||
|
vector<int> res;
|
||||||
|
int i =index - p;
|
||||||
|
while (i > 0) {
|
||||||
|
res.push_back(fuzzyfication(x[i]));
|
||||||
|
i -= p;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Dsa::createModelForEstimation() {
|
||||||
|
init();
|
||||||
|
fuzzyTs.resize(xLearning.size());
|
||||||
|
for (int t = 0; t < xLearning.size(); t++) {
|
||||||
|
fuzzyTs[t] = fuzzyfication(xLearning[t]);
|
||||||
|
}
|
||||||
|
createRules();
|
||||||
|
|
||||||
|
forecast.clear();
|
||||||
|
forecast.resize(fuzzyTs.size()+countPointForecast);
|
||||||
|
|
||||||
|
for (int i=0; i < fuzzyTs.size();i++) {
|
||||||
|
forecast[i] = defuzzyfication(fuzzyTs[i]);
|
||||||
|
}
|
||||||
|
int k = fuzzyTs.size();
|
||||||
|
|
||||||
|
for (int i=0; i < countPointForecast;i++) {
|
||||||
|
vector<int> lastPoints;
|
||||||
|
lastPoints.resize(countRulesIn);
|
||||||
|
for (int j = countRulesIn; j > 0; j--) {
|
||||||
|
lastPoints[countRulesIn -j] = (fuzzyTs[fuzzyTs.size() - j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
double sum = 0;
|
||||||
|
|
||||||
|
// ñåçîííàÿ êîìïîíåíòà
|
||||||
|
vector<int> foundSeasonFuncs = searchRulesForSeason(fuzzyTs.size());
|
||||||
|
|
||||||
|
for (int j =0; j < foundSeasonFuncs.size(); j++) {
|
||||||
|
sum += a[foundSeasonFuncs[j]].getValueAtTop();
|
||||||
|
}
|
||||||
|
double valueAtSeason = sum / foundSeasonFuncs.size();
|
||||||
|
|
||||||
|
|
||||||
|
forecast[i+k] = (valueAtSeason);
|
||||||
|
int index = fuzzyfication(forecast[i+k]);
|
||||||
|
// äîáàâèòü ïðîãíîçóþ òî÷êó â êîíåö ðÿäà
|
||||||
|
fuzzyTs.push_back(index);
|
||||||
|
xLearning.push_back(forecast[i+k]);
|
||||||
|
createRules();
|
||||||
|
|
||||||
|
}
|
||||||
|
for (int i=0; i < countPointForecast;i++) {
|
||||||
|
if (fuzzyTs.size() > 0)
|
||||||
|
fuzzyTs.pop_back();
|
||||||
|
if (rulesIn.size() > 0)
|
||||||
|
rulesIn.pop_back();
|
||||||
|
if (rulesOut.size() > 0)
|
||||||
|
rulesOut.pop_back();
|
||||||
|
xLearning.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ôàççèèêàöèÿ, ñîçäàòü ñïèñîê ôóíêöèé ïðèíàäëåæíîñòè ïî âñåìó ðÿäó
|
||||||
|
void Dsa::createModel() {
|
||||||
|
init();
|
||||||
|
fuzzyTs.resize(x.size());
|
||||||
|
for (int i = 0; i < x.size(); i++) {
|
||||||
|
fuzzyTs[i] = fuzzyfication(x[i]);
|
||||||
|
}
|
||||||
|
createRules();
|
||||||
|
|
||||||
|
|
||||||
|
forecast.clear();
|
||||||
|
forecast.resize(fuzzyTs.size()+countPointForecast);
|
||||||
|
|
||||||
|
for (int i=0; i < fuzzyTs.size();i++) {
|
||||||
|
forecast[i] = defuzzyfication(fuzzyTs[i]);
|
||||||
|
}
|
||||||
|
int k = fuzzyTs.size();
|
||||||
|
|
||||||
|
for (int i=0; i < countPointForecast;i++) {
|
||||||
|
vector<int> lastPoints;
|
||||||
|
lastPoints.resize(countRulesIn);
|
||||||
|
for (int j = countRulesIn; j > 0; j--) {
|
||||||
|
lastPoints[countRulesIn -j] = (fuzzyTs[fuzzyTs.size() - j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
double sum = 0;
|
||||||
|
|
||||||
|
// ñåçîííàÿ êîìïîíåíòà
|
||||||
|
vector<int> foundSeasonFuncs = searchRulesForSeason(fuzzyTs.size());
|
||||||
|
|
||||||
|
for (int j =0; j < foundSeasonFuncs.size(); j++) {
|
||||||
|
sum += a[foundSeasonFuncs[j]].getValueAtTop();
|
||||||
|
}
|
||||||
|
double valueAtSeason = sum / foundSeasonFuncs.size();
|
||||||
|
|
||||||
|
|
||||||
|
forecast[i+k] = (valueAtSeason);
|
||||||
|
int index = fuzzyfication(forecast[i+k]);
|
||||||
|
// äîáàâèòü ïðîãíîçóþ òî÷êó â êîíåö ðÿäà
|
||||||
|
fuzzyTs.push_back(index);
|
||||||
|
x.push_back(forecast[i+k]);
|
||||||
|
createRules();
|
||||||
|
|
||||||
|
}
|
||||||
|
for (int i=0; i < countPointForecast;i++) {
|
||||||
|
if (fuzzyTs.size() > 0)
|
||||||
|
fuzzyTs.pop_back();
|
||||||
|
if (rulesIn.size() > 0)
|
||||||
|
rulesIn.pop_back();
|
||||||
|
if (rulesOut.size() > 0)
|
||||||
|
rulesOut.pop_back();
|
||||||
|
x.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
vector<double> Dsa::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return forecast;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Dsa::defuzzyfication(int index) {
|
||||||
|
return this->a[index].getValueAtTop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Dsa::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("countFuzzyParts") == 0) {
|
||||||
|
this->countFuzzyParts = value;
|
||||||
|
} else if (paramName.compare("countRulesIn") == 0) {
|
||||||
|
if (this->xLearning.size() < value) {
|
||||||
|
this->countRulesIn = this->xLearning.size();
|
||||||
|
} else {
|
||||||
|
this->countRulesIn = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (paramName.compare("p") == 0) {
|
||||||
|
if (value <= 0) {
|
||||||
|
this->p = 1;
|
||||||
|
} else {
|
||||||
|
this->p = value;
|
||||||
|
}
|
||||||
|
} else if (paramName.compare("sizeLabels") == 0) {
|
||||||
|
this->sizeLabels = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (paramName.compare("0") == 0) {
|
||||||
|
this->countFuzzyParts = value * 100;
|
||||||
|
} else if (paramName.compare("1") == 0) {
|
||||||
|
if (this->xLearning.size() < value * 5) {
|
||||||
|
this->countRulesIn = this->xLearning.size();
|
||||||
|
} else {
|
||||||
|
this->countRulesIn = value * 5;
|
||||||
|
}
|
||||||
|
} else if (paramName.compare("2") == 0) {
|
||||||
|
this->sizeLabels = value * 100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double Dsa::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(3, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* Dsa::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double cfp = 2; cfp < 50;cfp+= 1) {
|
||||||
|
cout << "DSA " << cfp << " èç 50" <<"\n";;
|
||||||
|
for (double cri = 1; cri < 5;cri+=1) {
|
||||||
|
for (double sizeLabels = 1; sizeLabels < 50; sizeLabels+= 1) {
|
||||||
|
this->setParam("countRulesIn", cri);
|
||||||
|
this->setParam("countFuzzyParts", cfp);
|
||||||
|
this->setParam("sizeLabels", sizeLabels);
|
||||||
|
double smapeValue = 0;
|
||||||
|
int maxShift = 5;
|
||||||
|
if (maxShift > this->countPointForecast) {
|
||||||
|
maxShift = this->countPointForecast-1;
|
||||||
|
}
|
||||||
|
this->countPointForecast -= maxShift;
|
||||||
|
for (int shift=0; shift <= maxShift; shift++) {
|
||||||
|
this->partition();
|
||||||
|
this->createModelForEstimation();
|
||||||
|
smapeValue += est->getValue(x, getForecast());
|
||||||
|
this->countPointForecast++;
|
||||||
|
}
|
||||||
|
this->countPointForecast--;
|
||||||
|
smapeValue = smapeValue / maxShift;
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->countFuzzyParts = cfp;
|
||||||
|
optimal->countRulesIn = cri;
|
||||||
|
optimal->estim = smapeValue;
|
||||||
|
optimal->sizeLabels = sizeLabels;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Dsa::getNamberParam() {
|
||||||
|
return 3;
|
||||||
|
}
|
48
project_template/Dsa.h
Normal file
48
project_template/Dsa.h
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#ifndef DSA_H
|
||||||
|
#define DSA_H
|
||||||
|
#include <vector>
|
||||||
|
#include "A.h"
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class Dsa : public Method {
|
||||||
|
private:
|
||||||
|
vector<A> a; // íàáîð ôóíêöèé ïðèíàäëåæíîñòè
|
||||||
|
int countFuzzyParts;// êîëè÷åñòâî èíòåðâàëîâ óíèâåðñóìà
|
||||||
|
vector<vector<int>> rulesIn; // âõîäíàÿ ÷àñòü ïðàâèë
|
||||||
|
vector<int> rulesOut; // âûõîäíàÿ ÷àñòü
|
||||||
|
int countRulesIn; // êîëè÷åñòâî âõîäíûõ ïåðåìåííûõ
|
||||||
|
double universumMin;
|
||||||
|
double universumMax;
|
||||||
|
double sizeLabels;
|
||||||
|
vector<int> fuzzyTs; // íå÷åòêèé âðåìåííîé ðÿä
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
double delta; // ïàðàìåòð ñãëàæèâàíèÿ ñåçîííîé êîìïîíåíòû
|
||||||
|
int p; // ïåðèîä ñåçîííîñòè
|
||||||
|
double phi; // ïàðàìåòð äåìïèíãà
|
||||||
|
|
||||||
|
void defineUniversum(); // îïðåäåëèòü óíèåðñóì äëÿ âðåìåííîãî ðÿäà
|
||||||
|
void createRules(); // ñîçäàòü ïðàâèëà, ïàðàìåòð çàäàåò êîëè÷åñòâî âõîäíûõ ïåðåìåííûõ
|
||||||
|
int fuzzyfication(double); // ïîëó÷èòü íå÷åòêèé âðåìåííîé ðÿä â âèäå ïîñëåäîâàòåëüíîñòè íå÷åòêèõ ìíîæåñòâ
|
||||||
|
double defuzzyfication(int); // ïîëó÷èòü íå÷åòêèé âðåìåííîé ðÿä â âèäå ïîñëåäîâàòåëüíîñòè íå÷åòêèõ ìíîæåñòâ
|
||||||
|
vector<int> searchRules(vector<int>);
|
||||||
|
vector<int> searchRulesForSeason(int);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
Dsa(vector<double>, int);
|
||||||
|
~Dsa(void);
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
int getNamberParam();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
33
project_template/Estimation.h
Normal file
33
project_template/Estimation.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#ifndef ESTIMATION_H
|
||||||
|
#define ESTIMATION_H
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// àáñòðàêòíûé êëàññ îöåíêè âðåìåííûõ ðÿäîâ
|
||||||
|
// ïîêà ÷òî èñïîëüçóåòñÿ äëÿ õðàíåíèÿ òîëüêî ïîëÿ "çíà÷åíèå"
|
||||||
|
// íóæíî áóäåò äîïîëíèòü íåîáõîäèìûìè ó÷àñòêàìè âðåìåííîãî ðÿäà äëÿ ïðîåäåíèÿ îöåíêè
|
||||||
|
// îò íåãî íàñëåäóþòñÿ êîíêðåòíûå ðåàëèçàöèè êðèòåðèåâ, ðåàëèçóþùèå ñîîòâåòñòâóþùèå ìåòîäèêè
|
||||||
|
// èñõîäèì èç òîãî, ÷òî âñå êðèòåðèè â êà÷åñòâå ðåçóëüòàòà âîçâðàùàþò double
|
||||||
|
class Estimation {
|
||||||
|
public:
|
||||||
|
double value; // çíà÷åíèå îöåíêè ìîäåëè
|
||||||
|
virtual double getValue(int paramsCount, vector<double>, vector<double>) = 0; // ïîëó÷èòü çíà÷åíèå îöåíêè ìîäåëè
|
||||||
|
virtual double getValue(vector<double>, vector<double>) = 0; // ïîëó÷èòü çíà÷åíèå îöåíêè ìîäåëè
|
||||||
|
protected:
|
||||||
|
double RSS(vector<double> original, vector<double> model){
|
||||||
|
double res = 0.0;
|
||||||
|
int commonElemsCount = original.size() > model.size() ? original.size() : model.size();
|
||||||
|
for (int i = 0; i < commonElemsCount; i++) {
|
||||||
|
res += (original[i] - model[i]) * (original[i] - model[i]);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
virtual void Validate(vector<double> original, vector<double> model){
|
||||||
|
if (original.size() == 0)
|
||||||
|
throw exception("Original time seria is empty");
|
||||||
|
if (model.size() == 0)
|
||||||
|
throw exception("Model time seria is empty");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif
|
117
project_template/File.cpp
Normal file
117
project_template/File.cpp
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
//
|
||||||
|
// Êëàññ äëÿ ðàáîòû ñ ôàéëàìè: ÷òåíèÿ âðåìåííîãî ðÿäà, çàïèñü ðåçóëüòàòîâ
|
||||||
|
//
|
||||||
|
#include "stdafx.h"
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <fstream>
|
||||||
|
#include "File.h"
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// ïðî÷èòàòü âðåìåííîé ðÿä èç ôàéëà
|
||||||
|
// ôîðìàò ôàéëà: âåùåñòâåííûå ÷èñëà, êàæäîå íàõîäèòñÿ íà íîâîé ñòðîêå, ðàçäåëèòåëü äðîáíîé ÷àñòè - çàïÿòàÿ
|
||||||
|
vector<double> File::readFile(string tsFileName) {
|
||||||
|
vector<double> x; // ñþäà óïàäåò çàãðóæåííûé âðåìåííîé ðÿä
|
||||||
|
std::ifstream inFile; // ïîòîê äëÿ ÷òåíèÿ ôàéëà
|
||||||
|
|
||||||
|
inFile.open(tsFileName.c_str());
|
||||||
|
string tsString = "";
|
||||||
|
while(inFile >> tsString) {
|
||||||
|
string str = tsString;
|
||||||
|
int pos = tsString.find(".");
|
||||||
|
if (pos > 0) {
|
||||||
|
str = tsString.replace(tsString.find("."), 1, ",");
|
||||||
|
}
|
||||||
|
x.push_back(atof(str.c_str()));
|
||||||
|
}
|
||||||
|
inFile.close();
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> File::readKonfFile(string tsFileName) {
|
||||||
|
vector<double> x; // ñþäà óïàäåò çàãðóæåííûé âðåìåííîé ðÿä
|
||||||
|
int forecastCountDots = 1;
|
||||||
|
string TSPeriod = "daily"; // day, mounth, year....? êàê ïðåäñêàçàíèå çàâèñèò îò âðåìåííîãî ïåðèîäà
|
||||||
|
string TSName = ""; // day, mounth, year....? êàê ïðåäñêàçàíèå çàâèñèò îò âðåìåííîãî ïåðèîäà
|
||||||
|
std::ifstream inFile; // ïîòîê äëÿ ÷òåíèÿ ôàéëà
|
||||||
|
|
||||||
|
inFile.open(tsFileName.c_str());
|
||||||
|
string tsString = "";
|
||||||
|
while (inFile >> tsString) {
|
||||||
|
int endpos = tsString.find(';');
|
||||||
|
int startpos = 0;
|
||||||
|
if (endpos > 0){
|
||||||
|
if (TSName == ""){
|
||||||
|
//first string with params
|
||||||
|
//endpos = tsString.find(';');
|
||||||
|
//set ts name
|
||||||
|
TSName = tsString.substr(0, endpos);
|
||||||
|
startpos = endpos;
|
||||||
|
//set ts name
|
||||||
|
endpos = tsString.find(';', startpos + 1);
|
||||||
|
forecastCountDots = atoi(tsString.substr(startpos + 1, endpos - startpos - 1).c_str());
|
||||||
|
startpos = endpos;
|
||||||
|
//set ts name
|
||||||
|
endpos = tsString.find(';', startpos + 1);
|
||||||
|
TSPeriod = tsString.substr(startpos + 1 , endpos - startpos - 1);
|
||||||
|
startpos = endpos;
|
||||||
|
endpos = tsString.find(';', startpos + 1);
|
||||||
|
}
|
||||||
|
//parse ts data
|
||||||
|
while (endpos > 0){
|
||||||
|
x.push_back(atof(tsString.substr(startpos + 1, endpos - startpos -1).c_str()));
|
||||||
|
startpos = endpos;
|
||||||
|
endpos = tsString.find(';', startpos + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*string str = tsString;
|
||||||
|
int pos = tsString.find(".");
|
||||||
|
if (pos > 0) {
|
||||||
|
str = tsString.replace(tsString.find("."), 1, ",");
|
||||||
|
}
|
||||||
|
x.push_back(atof(str.c_str()));*/
|
||||||
|
}
|
||||||
|
inFile.close();
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
double File::round (double value) {
|
||||||
|
return floor(value + 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
//îêðóãëèòü äî äâóõ çíàêîâ ïîñëå çàïÿòîé
|
||||||
|
string File::myRound(double num) {
|
||||||
|
double n = ((double) round(num * 100)) / 100;
|
||||||
|
std::ostringstream sstream;
|
||||||
|
sstream << n;
|
||||||
|
string s = sstream.str();
|
||||||
|
// çàìåíèòü ðàçäåëèòåëü äðîáíîé ÷àñòè íà çàïÿòóþ
|
||||||
|
int commaIndex = s.find(".");
|
||||||
|
if (commaIndex > 0) {
|
||||||
|
s = s.replace(commaIndex, 1, ",");
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ñîõðàíèòü â ôàéë âåêòîð ñ ðåçóëüòàòîì ïðîãíîçà
|
||||||
|
void File::writeFile(string outFileName, vector<double> result) {
|
||||||
|
ofstream outFile(outFileName.c_str(), std::ofstream::out | std::ofstream::trunc);
|
||||||
|
for (unsigned int i = 0; i < result.size(); i++) {
|
||||||
|
outFile << myRound(result[i]) << "\n";
|
||||||
|
}
|
||||||
|
outFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñîõðàíèòü â ôàéë ïðî÷èå ðåçóëüòàòû ïðîãíîçèðîâàíèÿ, íàïðèìåð îöåíêè
|
||||||
|
void File::writeFile(string outFileName, string key, double value) {
|
||||||
|
ofstream outFile(outFileName.c_str(), ios::app);
|
||||||
|
outFile << key << ";" << myRound(value) << "\n";
|
||||||
|
outFile.close();
|
||||||
|
}
|
||||||
|
|
23
project_template/File.h
Normal file
23
project_template/File.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#ifndef FILE_H
|
||||||
|
#define FILE_H
|
||||||
|
//
|
||||||
|
// Êëàññ äëÿ ðàáîòû ñ ôàéëàìè:
|
||||||
|
// çàãðóçêà âðåìåííûõ ðÿäîâ, ñîõðàíåíèå ðåçóëüòàòîâ ïðîãíîçà
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class File {
|
||||||
|
private:
|
||||||
|
static double round(double); // ðåàëèçàöèÿ îêðóãëåíèÿ ÷èñëà
|
||||||
|
static string myRound(double num); // îêðóãëåíèå ñ òî÷íîñòüþ äî òðåõ çíàêîâ ïîñëå çàïÿòîé
|
||||||
|
public:
|
||||||
|
static vector<double> readFile (string); // çàãðóçèòü âðåìåííîé ðÿä
|
||||||
|
static vector<double> readKonfFile(string); // çàãðóçèòü ðÿä â ôîðìàòå êîíôåðåíöèè
|
||||||
|
static void writeFile (string, vector<double>); // ñîõðàíèòü ðåçóëüòàò ïðîãíîçà
|
||||||
|
static void writeFile (string, string, double); // ñîõðàíèòü ïðî÷èå ðåçóëüòàòû
|
||||||
|
};
|
||||||
|
#endif
|
354
project_template/Fuzzy.cpp
Normal file
354
project_template/Fuzzy.cpp
Normal file
@ -0,0 +1,354 @@
|
|||||||
|
#include "StdAfx.h"
|
||||||
|
#include "Fuzzy.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "Param.h"
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
Fuzzy::Fuzzy(string trendType, string seasonType, vector<double> timeSeries, int countPointForecast){
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->trendType = trendType;
|
||||||
|
this->seasonType = seasonType;
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
Fuzzy::~Fuzzy(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fuzzy::init() {
|
||||||
|
defineUniversum();
|
||||||
|
fuzzyTs.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïðåäåëèòü óíèâåðñóì äëÿ âðåìåííîãî ðÿäà
|
||||||
|
// èùåì ìàêñèìóì, ìèíèìóì, ïðîèçâîäèì ðàçáèåíèå íà çàäàííûå èíòåðâàëû
|
||||||
|
void Fuzzy::defineUniversum() {
|
||||||
|
this->universumMax = x[0];
|
||||||
|
this->universumMin = x[0];
|
||||||
|
for (int i = 1; i < x.size(); i++) {
|
||||||
|
if (universumMax < x[i]) {
|
||||||
|
universumMax = x[i];
|
||||||
|
}
|
||||||
|
if (universumMin > x[i]) {
|
||||||
|
universumMin = x[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñîçäàåì ôóíêöèè ïðèíàäëåæíîñòè
|
||||||
|
// ïðèíèìàåì ïî óìîë÷àíèþ, ÷òî ñîñåäíèå ïåðåêðûâàþòñÿ íà ïîëîâèíó ìåæäó ñîáîé
|
||||||
|
// ðàç åñòü êîëè÷åñòâî èíòåðâàëîâ, òî âû÷èñëÿåì ðàçìåð îñíîâàíèÿ òðåóãîëüíèêà
|
||||||
|
double baseSize = (universumMax - universumMin) / countFuzzyParts;
|
||||||
|
a.resize(countFuzzyParts + 1);
|
||||||
|
for (int i=0; i < countFuzzyParts + 1;i++){
|
||||||
|
a[i] = (A(universumMin + (i-1) * baseSize, universumMin + (i+1)*baseSize));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ôàççèôèöèðîâàòü òîëüêî îäíó òî÷êó
|
||||||
|
// âîçâðàùàåò èíäåêñ ôóíêöèè ïðèíàäëåæíîñòè ñ ìàêñèìàëüíûì çíà÷åíèåì
|
||||||
|
int Fuzzy::fuzzyfication(double value) {
|
||||||
|
// ïåðåáèðàåì âñå ôóíêöèè ïðèíàäëåæíîñòè,
|
||||||
|
// åñëè íàøëè íàèáîëüøóþ ñòåïåíü ïðèíàäëåæíîñòè, òî ôèêñèðóåì èíäåêñ ôóíêöèè
|
||||||
|
int indMax = 0;
|
||||||
|
double max = a[0].getValue(value);
|
||||||
|
for (int j =0; j < a.size(); j++) {
|
||||||
|
if (a[j].getValue(value) > max) {
|
||||||
|
indMax = j;
|
||||||
|
max = a[j].getValue(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return indMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fuzzy::createRules() {
|
||||||
|
rulesIn.clear();
|
||||||
|
rulesIn.resize(fuzzyTs.size() - countRulesIn);
|
||||||
|
rulesOut.clear();
|
||||||
|
rulesOut.resize(fuzzyTs.size() - countRulesIn);
|
||||||
|
for (int i=0; i < fuzzyTs.size() - countRulesIn; i ++) {
|
||||||
|
vector<int> v;
|
||||||
|
v.resize(countRulesIn);
|
||||||
|
for (int j=i; j < i + countRulesIn; j++) {
|
||||||
|
v[j-i] = fuzzyTs[j];
|
||||||
|
}
|
||||||
|
rulesIn[i] = v;
|
||||||
|
rulesOut[i] = fuzzyTs[i+countRulesIn];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vector<int> Fuzzy::searchRules(vector<int> inPart) {
|
||||||
|
vector<int> res(rulesOut.size());
|
||||||
|
int countRes = 0;
|
||||||
|
for (int i = 0; i < rulesIn.size(); i++) {
|
||||||
|
bool isRuleFound = true;
|
||||||
|
for (int j = 0; j < rulesIn[i].size(); j++) {
|
||||||
|
if (rulesIn[i][j] != inPart[j]) {
|
||||||
|
isRuleFound = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isRuleFound) {
|
||||||
|
res[countRes++] = rulesOut[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res.resize(countRes);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<int> Fuzzy::searchRulesForSeason(int index) {
|
||||||
|
vector<int> res;
|
||||||
|
int i =index - p;
|
||||||
|
while (i > 0) {
|
||||||
|
res.push_back(fuzzyfication(x[i]));
|
||||||
|
i -= p;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Fuzzy::createModelForEstimation() {
|
||||||
|
init();
|
||||||
|
fuzzyTs.resize(xLearning.size());
|
||||||
|
for (int t = 0; t < xLearning.size(); t++) {
|
||||||
|
fuzzyTs[t] = fuzzyfication(xLearning[t]);
|
||||||
|
}
|
||||||
|
createRules();
|
||||||
|
|
||||||
|
forecast.clear();
|
||||||
|
forecast.resize(fuzzyTs.size()+countPointForecast);
|
||||||
|
for (int i=0; i < fuzzyTs.size();i++) {
|
||||||
|
forecast[i] = defuzzyfication(fuzzyTs[i]);
|
||||||
|
}
|
||||||
|
int k = fuzzyTs.size();
|
||||||
|
|
||||||
|
|
||||||
|
for (int i=0; i < countPointForecast;i++) {
|
||||||
|
vector<int> lastPoints;
|
||||||
|
lastPoints.resize(countRulesIn);
|
||||||
|
for (int j = countRulesIn; j > 0; j--) {
|
||||||
|
lastPoints[countRulesIn -j] = (fuzzyTs[fuzzyTs.size() - j]);
|
||||||
|
}
|
||||||
|
vector<int> foundFuncs = searchRules(lastPoints);
|
||||||
|
if (foundFuncs.size() == 0) {
|
||||||
|
foundFuncs.push_back(fuzzyTs[fuzzyTs.size()-1]);
|
||||||
|
}
|
||||||
|
double sum = 0;
|
||||||
|
|
||||||
|
for (int j =0; j < foundFuncs.size(); j++) {
|
||||||
|
sum += a[foundFuncs[j]].getValueAtTop();
|
||||||
|
}
|
||||||
|
// òðåíäîâàÿ ñîñòàâëÿþùàÿ
|
||||||
|
double globInfo = sum / foundFuncs.size();
|
||||||
|
A at = this->a[fuzzyTs[fuzzyTs.size()-1]];
|
||||||
|
A atPrev = this->a[fuzzyTs[fuzzyTs.size()-2]];
|
||||||
|
double localInfo = at.getLeft() + (at.getRight() - at.getLeft())/2 + (at.getValueAtTop() - atPrev.getValueAtTop()) / (at.getValueAtTop() + atPrev.getValueAtTop());
|
||||||
|
|
||||||
|
// ñåçîííàÿ êîìïîíåíòà
|
||||||
|
vector<int> foundSeasonFuncs = searchRulesForSeason(fuzzyTs.size());
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
for (int j =0; j < foundSeasonFuncs.size(); j++) {
|
||||||
|
sum += a[foundSeasonFuncs[j]].getValueAtTop();
|
||||||
|
}
|
||||||
|
double valueAtSeason = sum / foundSeasonFuncs.size();
|
||||||
|
|
||||||
|
if (trendType.compare("None") == 0) {
|
||||||
|
if (seasonType.compare("None") == 0) {
|
||||||
|
forecast[i+k] = (localInfo);
|
||||||
|
} else if (seasonType.compare("Add") == 0) {
|
||||||
|
forecast[i+k] = (gamma * localInfo + (1-gamma) * valueAtSeason);
|
||||||
|
}
|
||||||
|
} else if (trendType.compare("Add") == 0) {
|
||||||
|
if (seasonType.compare("None") == 0) {
|
||||||
|
forecast[i+k] = (delta * localInfo + (1-delta) * globInfo);
|
||||||
|
} else if (seasonType.compare("Add") == 0) {
|
||||||
|
forecast[i+k] = (gamma * delta * localInfo + (1-gamma) * valueAtSeason + (1-delta) * globInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int index = fuzzyfication(forecast[i+k]);
|
||||||
|
// äîáàâèòü ïðîãíîçóþ òî÷êó â êîíåö ðÿäà
|
||||||
|
fuzzyTs.push_back(index);
|
||||||
|
xLearning.push_back(forecast[i+k]);
|
||||||
|
createRules();
|
||||||
|
}
|
||||||
|
for (int i=0; i < countPointForecast;i++) {
|
||||||
|
fuzzyTs.pop_back();
|
||||||
|
rulesIn.pop_back();
|
||||||
|
rulesOut.pop_back();
|
||||||
|
xLearning.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ôàççèèêàöèÿ, ñîçäàòü ñïèñîê ôóíêöèé ïðèíàäëåæíîñòè ïî âñåìó ðÿäó
|
||||||
|
void Fuzzy::createModel() {
|
||||||
|
init();
|
||||||
|
fuzzyTs.resize(x.size());
|
||||||
|
for (int i = 0; i < x.size(); i++) {
|
||||||
|
fuzzyTs[i] = fuzzyfication(x[i]);
|
||||||
|
}
|
||||||
|
createRules();
|
||||||
|
|
||||||
|
forecast.clear();
|
||||||
|
forecast.resize(fuzzyTs.size()+countPointForecast);
|
||||||
|
for (int i=0; i < fuzzyTs.size();i++) {
|
||||||
|
forecast[i] = defuzzyfication(fuzzyTs[i]);
|
||||||
|
}
|
||||||
|
int k = fuzzyTs.size();
|
||||||
|
|
||||||
|
for (int i=0; i < countPointForecast;i++) {
|
||||||
|
vector<int> lastPoints;
|
||||||
|
lastPoints.resize(countRulesIn);
|
||||||
|
for (int j = countRulesIn; j > 0; j--) {
|
||||||
|
lastPoints[countRulesIn -j] = (fuzzyTs[fuzzyTs.size() - j]);
|
||||||
|
}
|
||||||
|
vector<int> foundFuncs = searchRules(lastPoints);
|
||||||
|
if (foundFuncs.size() == 0) {
|
||||||
|
foundFuncs.push_back(fuzzyTs[fuzzyTs.size()-1]);
|
||||||
|
}
|
||||||
|
double sum = 0;
|
||||||
|
|
||||||
|
for (int j =0; j < foundFuncs.size(); j++) {
|
||||||
|
sum += a[foundFuncs[j]].getValueAtTop();
|
||||||
|
}
|
||||||
|
// òðåíäîâàÿ ñîñòàâëÿþùàÿ
|
||||||
|
double globInfo = sum / foundFuncs.size();
|
||||||
|
A at = this->a[fuzzyTs[fuzzyTs.size()-1]];
|
||||||
|
A atPrev = this->a[fuzzyTs[fuzzyTs.size()-2]];
|
||||||
|
double localInfo = at.getLeft() + (at.getRight() - at.getLeft())/2 + (at.getValueAtTop() - atPrev.getValueAtTop()) / (at.getValueAtTop() + atPrev.getValueAtTop());
|
||||||
|
|
||||||
|
// ñåçîííàÿ êîìïîíåíòà
|
||||||
|
vector<int> foundSeasonFuncs = searchRulesForSeason(fuzzyTs.size());
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
for (int j =0; j < foundSeasonFuncs.size(); j++) {
|
||||||
|
sum += a[foundSeasonFuncs[j]].getValueAtTop();
|
||||||
|
}
|
||||||
|
double valueAtSeason = sum / foundSeasonFuncs.size();
|
||||||
|
|
||||||
|
if (trendType.compare("None") == 0) {
|
||||||
|
if (seasonType.compare("None") == 0) {
|
||||||
|
forecast[i+k] = (localInfo);
|
||||||
|
} else if (seasonType.compare("Add") == 0) {
|
||||||
|
forecast[i+k] = (gamma * localInfo + (1-gamma) * valueAtSeason);
|
||||||
|
}
|
||||||
|
} else if (trendType.compare("Add") == 0) {
|
||||||
|
if (seasonType.compare("None") == 0) {
|
||||||
|
forecast[i+k] = (delta * localInfo + (1-delta) * globInfo);
|
||||||
|
} else if (seasonType.compare("Add") == 0) {
|
||||||
|
forecast[i+k] = (gamma * delta * localInfo + (1-gamma) * valueAtSeason + (1-delta) * globInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int index = fuzzyfication(forecast[i+k]);
|
||||||
|
// äîáàâèòü ïðîãíîçóþ òî÷êó â êîíåö ðÿäà
|
||||||
|
fuzzyTs.push_back(index);
|
||||||
|
x.push_back(forecast[i+k]);
|
||||||
|
createRules();
|
||||||
|
}
|
||||||
|
for (int i=0; i < countPointForecast;i++) {
|
||||||
|
fuzzyTs.pop_back();
|
||||||
|
rulesIn.pop_back();
|
||||||
|
rulesOut.pop_back();
|
||||||
|
x.pop_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
vector<double> Fuzzy::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return forecast;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Fuzzy::defuzzyfication(int index) {
|
||||||
|
return this->a[index].getValueAtTop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fuzzy::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("countFuzzyParts") == 0) {
|
||||||
|
this->countFuzzyParts = value;
|
||||||
|
} else if (paramName.compare("countRulesIn") == 0) {
|
||||||
|
if (this->xLearning.size() < value) {
|
||||||
|
this->countRulesIn = this->xLearning.size();
|
||||||
|
} else {
|
||||||
|
this->countRulesIn = value;
|
||||||
|
}
|
||||||
|
} else if (paramName.compare("p") == 0) {
|
||||||
|
this->p = value;
|
||||||
|
} else if (paramName.compare("gamma") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
} else if (paramName.compare("delta") == 0) {
|
||||||
|
this->delta = value;
|
||||||
|
}
|
||||||
|
if (paramName.compare("0") == 0) {
|
||||||
|
this->countFuzzyParts = value * 100;
|
||||||
|
} else if (paramName.compare("1") == 0) {
|
||||||
|
if (this->xLearning.size() < value * 5) {
|
||||||
|
this->countRulesIn = this->xLearning.size();
|
||||||
|
} else {
|
||||||
|
this->countRulesIn = value * 5;
|
||||||
|
}
|
||||||
|
} else if (paramName.compare("2") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
} else if (paramName.compare("3") == 0) {
|
||||||
|
this->delta = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double Fuzzy::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(3, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* Fuzzy::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double gam = 0; gam < 1; gam+= 0.1) {
|
||||||
|
cout << "fuzzy " << gam << " èç 1" <<"\n";;
|
||||||
|
for (double del = 0; del < 1;del+= 0.1) {
|
||||||
|
for (double cri = 1; cri < 5;cri+= 1) {
|
||||||
|
for (double cfp = 2; cfp < 50;cfp+= 2) {
|
||||||
|
this->setParam("gamma", gam);
|
||||||
|
this->setParam("delta", del);
|
||||||
|
this->setParam("countRulesIn", cri);
|
||||||
|
this->setParam("countFuzzyParts", cfp);
|
||||||
|
double smapeValue = 0;
|
||||||
|
int maxShift = 5;
|
||||||
|
if (maxShift > this->countPointForecast) {
|
||||||
|
maxShift = this->countPointForecast-1;
|
||||||
|
}
|
||||||
|
this->countPointForecast -= maxShift;
|
||||||
|
for (int shift=0; shift <= maxShift; shift++) {
|
||||||
|
this->partition();
|
||||||
|
this->createModelForEstimation();
|
||||||
|
smapeValue += est->getValue(x, getForecast());
|
||||||
|
this->countPointForecast++;
|
||||||
|
}
|
||||||
|
this->countPointForecast--;
|
||||||
|
smapeValue = smapeValue / maxShift;
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->gamma = gam;
|
||||||
|
optimal->delta = del;
|
||||||
|
optimal->estim = smapeValue;
|
||||||
|
optimal->countFuzzyParts = cfp;
|
||||||
|
optimal->countRulesIn = cri;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Fuzzy::getNamberParam() {
|
||||||
|
return 4;
|
||||||
|
}
|
49
project_template/Fuzzy.h
Normal file
49
project_template/Fuzzy.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
#ifndef FUZZY_H
|
||||||
|
#define FUZZY_H
|
||||||
|
#include <vector>
|
||||||
|
#include "A.h"
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class Fuzzy : public Method {
|
||||||
|
private:
|
||||||
|
vector<A> a; // íàáîð ôóíêöèé ïðèíàäëåæíîñòè
|
||||||
|
int countFuzzyParts;// êîëè÷åñòâî èíòåðâàëîâ óíèâåðñóìà
|
||||||
|
vector<vector<int>> rulesIn; // âõîäíàÿ ÷àñòü ïðàâèë
|
||||||
|
vector<int> rulesOut; // âûõîäíàÿ ÷àñòü
|
||||||
|
int countRulesIn; // êîëè÷åñòâî âõîäíûõ ïåðåìåííûõ
|
||||||
|
double universumMin;
|
||||||
|
double universumMax;
|
||||||
|
vector<int> fuzzyTs; // íå÷åòêèé âðåìåííîé ðÿä
|
||||||
|
string trendType;
|
||||||
|
string seasonType;
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
double delta; // ïàðàìåòð ñãëàæèâàíèÿ ñåçîííîé êîìïîíåíòû
|
||||||
|
int p; // ïåðèîä ñåçîííîñòè
|
||||||
|
double phi; // ïàðàìåòð äåìïèíãà
|
||||||
|
|
||||||
|
void defineUniversum(); // îïðåäåëèòü óíèåðñóì äëÿ âðåìåííîãî ðÿäà
|
||||||
|
void createRules(); // ñîçäàòü ïðàâèëà, ïàðàìåòð çàäàåò êîëè÷åñòâî âõîäíûõ ïåðåìåííûõ
|
||||||
|
int fuzzyfication(double); // ïîëó÷èòü íå÷åòêèé âðåìåííîé ðÿä â âèäå ïîñëåäîâàòåëüíîñòè íå÷åòêèõ ìíîæåñòâ
|
||||||
|
double defuzzyfication(int); // ïîëó÷èòü íå÷åòêèé âðåìåííîé ðÿä â âèäå ïîñëåäîâàòåëüíîñòè íå÷åòêèõ ìíîæåñòâ
|
||||||
|
vector<int> searchRules(vector<int>);
|
||||||
|
vector<int> searchRulesForSeason(int);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
Fuzzy(string, string, vector<double>, int);
|
||||||
|
~Fuzzy(void);
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
int getNamberParam();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
498
project_template/FuzzyWithSets.cpp
Normal file
498
project_template/FuzzyWithSets.cpp
Normal file
@ -0,0 +1,498 @@
|
|||||||
|
#include "StdAfx.h"
|
||||||
|
#include "FuzzyWithSets.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include "Param.h"
|
||||||
|
#include "float.h"
|
||||||
|
|
||||||
|
FuzzyWithSets::FuzzyWithSets(string trendType, string seasonType, vector<double> timeSeries, int countPointForecast){
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->trendType = trendType;
|
||||||
|
this->seasonType = seasonType;
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
FuzzyWithSets::~FuzzyWithSets(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void FuzzyWithSets::init() {
|
||||||
|
S.clear();
|
||||||
|
T.clear();
|
||||||
|
I.clear();
|
||||||
|
if (trendType.compare("None") == 0) {
|
||||||
|
if (seasonType.compare("None") == 0) {
|
||||||
|
S.push_back(fuzzyTs[0]);
|
||||||
|
fuzzyForecast.push_back(fuzzyTs[0]);
|
||||||
|
} else if (seasonType.compare("Add") == 0) {
|
||||||
|
A sumS = fuzzyTs[0];
|
||||||
|
for (unsigned int t = 1; t < p; t++) {
|
||||||
|
sumS = plusSet(sumS, fuzzyTs[t]);
|
||||||
|
}
|
||||||
|
S.push_back(divSet(sumS, p));
|
||||||
|
I.resize(p);
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I[t] = minusSet(fuzzyTs[t], S[0]);
|
||||||
|
}
|
||||||
|
fuzzyForecast.push_back(plusSet(S[0], I[0]));
|
||||||
|
} else if (seasonType.compare("Mult") == 0) {
|
||||||
|
A sumS = fuzzyTs[0];
|
||||||
|
for (unsigned int t = 1; t < p; t++) {
|
||||||
|
sumS = plusSet(sumS, fuzzyTs[t]);
|
||||||
|
}
|
||||||
|
S.push_back(divSet(sumS, p));
|
||||||
|
I.resize(p);
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I[t] = divSet(fuzzyTs[t], S[0]);
|
||||||
|
}
|
||||||
|
fuzzyForecast.push_back(multSet(S[0], I[0]));
|
||||||
|
}
|
||||||
|
} else if (trendType.compare("Add") == 0) {
|
||||||
|
if (seasonType.compare("None") == 0) {
|
||||||
|
T.push_back(minusSet(fuzzyTs[1], fuzzyTs[0]));
|
||||||
|
S.push_back(fuzzyTs[0]);
|
||||||
|
fuzzyForecast.push_back(plusSet(S[0], T[0]));
|
||||||
|
} else if (seasonType.compare("Add") == 0) {
|
||||||
|
A sumS = fuzzyTs[0];
|
||||||
|
A sumT = fuzzyTs[0];
|
||||||
|
for (unsigned int t = 1; t < p; t++) {
|
||||||
|
sumS = plusSet(sumS, fuzzyTs[t]);
|
||||||
|
sumT = plusSet(sumT, fuzzyTs[t+p]);
|
||||||
|
}
|
||||||
|
S.push_back(divSet(sumS, p));
|
||||||
|
T.push_back(divSet(minusSet(divSet(sumT, p), S[0]), p));
|
||||||
|
I.resize(p);
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I[t] = minusSet(fuzzyTs[t], S[0]);
|
||||||
|
}
|
||||||
|
fuzzyForecast.push_back(plusSet(S[0], plusSet(T[0], I[0])));
|
||||||
|
} else if (seasonType.compare("Mult") == 0) {
|
||||||
|
A sumS = fuzzyTs[0];
|
||||||
|
A sumT = fuzzyTs[0];
|
||||||
|
for (unsigned int t = 1; t < p; t++) {
|
||||||
|
sumS = plusSet(sumS, fuzzyTs[t]);
|
||||||
|
sumT = plusSet(sumT, fuzzyTs[t+p]);
|
||||||
|
}
|
||||||
|
S.push_back(divSet(sumS, p));
|
||||||
|
T.push_back(divSet(minusSet(divSet(sumT, p), S[0]), p));
|
||||||
|
I.resize(p);
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I[t] = divSet(fuzzyTs[t], S[0]);
|
||||||
|
}
|
||||||
|
fuzzyForecast.push_back(multSet(plusSet(S[0],T[0]), I[0]));
|
||||||
|
}
|
||||||
|
} else if (trendType.compare("Mult") == 0) {
|
||||||
|
if (seasonType.compare("None") == 0) {
|
||||||
|
T.push_back(divSet(fuzzyTs[1], fuzzyTs[0]));
|
||||||
|
S.push_back(fuzzyTs[0]);
|
||||||
|
fuzzyForecast.push_back(multSet(S[0], T[0]));
|
||||||
|
} else if (seasonType.compare("Add") == 0) {
|
||||||
|
A sumS = fuzzyTs[0];
|
||||||
|
A sumT = fuzzyTs[0];
|
||||||
|
for (unsigned int t = 1; t < p; t++) {
|
||||||
|
sumS = plusSet(sumS, fuzzyTs[t]);
|
||||||
|
sumT = plusSet(sumT, fuzzyTs[t+p]);
|
||||||
|
}
|
||||||
|
S.push_back(divSet(sumS, p));
|
||||||
|
T.push_back(divSet(minusSet(divSet(sumT, p), S[0]), p));
|
||||||
|
I.resize(p);
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I[t] = minusSet(fuzzyTs[t], S[0]);
|
||||||
|
}
|
||||||
|
fuzzyForecast.push_back(plusSet(multSet(S[0], T[0]), I[0]));
|
||||||
|
} else if (seasonType.compare("Mult") == 0) {
|
||||||
|
A sumS = fuzzyTs[0];
|
||||||
|
A sumT = fuzzyTs[0];
|
||||||
|
for (unsigned int t = 1; t < p; t++) {
|
||||||
|
sumS = plusSet(sumS, fuzzyTs[t]);
|
||||||
|
sumT = plusSet(sumT, fuzzyTs[t+p]);
|
||||||
|
}
|
||||||
|
S.push_back(divSet(sumS, p));
|
||||||
|
T.push_back(divSet(minusSet(divSet(sumT, p), S[0]), p));
|
||||||
|
I.resize(p);
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I[t] = divSet(fuzzyTs[t], S[0]);
|
||||||
|
}
|
||||||
|
fuzzyForecast.push_back(multSet(multSet(S[0],T[0]), I[0]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïðåäåëèòü óíèâåðñóì äëÿ âðåìåííîãî ðÿäà
|
||||||
|
// èùåì ìàêñèìóì, ìèíèìóì, ïðîèçâîäèì ðàçáèåíèå íà çàäàííûå èíòåðâàëû
|
||||||
|
void FuzzyWithSets::defineUniversum() {
|
||||||
|
this->universumMax = x[0];
|
||||||
|
this->universumMin = x[0];
|
||||||
|
for (int i = 1; i < x.size(); i++) {
|
||||||
|
if (universumMax < x[i]) {
|
||||||
|
universumMax = x[i];
|
||||||
|
}
|
||||||
|
if (universumMin > x[i]) {
|
||||||
|
universumMin = x[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñîçäàåì ôóíêöèè ïðèíàäëåæíîñòè
|
||||||
|
// ïðèíèìàåì ïî óìîë÷àíèþ, ÷òî ñîñåäíèå ïåðåêðûâàþòñÿ íà ïîëîâèíó ìåæäó ñîáîé
|
||||||
|
// ðàç åñòü êîëè÷åñòâî èíòåðâàëîâ, òî âû÷èñëÿåì ðàçìåð îñíîâàíèÿ òðåóãîëüíèêà
|
||||||
|
double baseSize = (universumMax - universumMin) / countFuzzyParts;
|
||||||
|
a.resize(countFuzzyParts + 1);
|
||||||
|
for (int i=0; i < countFuzzyParts + 1;i++){
|
||||||
|
a[i] = (A(universumMin + (i-1) * baseSize, universumMin + (i+1)*baseSize));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïåðàöèÿ âû÷èòàíèÿ ìíîæåñòâ
|
||||||
|
A FuzzyWithSets::minusSet(A a, A b) {
|
||||||
|
return A(a.getLeft()- b.getLeft(), a.getRight() - b.getRight());
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïåðàöèÿ äåëåíèÿ ìíîæåñòâ
|
||||||
|
A FuzzyWithSets::divSet(A a, A b) {
|
||||||
|
return A(a.getLeft()/b.getLeft(), a.getRight()/b.getRight());
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïåðàöèÿ äåëåíèÿ ìíîæåñòâ
|
||||||
|
A FuzzyWithSets::divSet(A a, double b) {
|
||||||
|
return A(a.getLeft()/b, a.getRight()/b);
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïåðàöèÿ óìíîæåíèå ìíîæåñòâà íà ÷èñëî
|
||||||
|
A FuzzyWithSets::multSetNum(double num, A a) {
|
||||||
|
return A(a.getLeft() * num, a.getRight() * num);
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïåðàöèÿ ñëîæåíèÿ ìíîæåñòâ
|
||||||
|
A FuzzyWithSets::plusSet(A a, A b) {
|
||||||
|
return A(a.getLeft()+ b.getLeft(), a.getRight() + b.getRight());
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïåðàöèÿ óìíîæåíèÿ ìíîæåñòâ
|
||||||
|
A FuzzyWithSets::multSet(A a, A b) {
|
||||||
|
return A(a.getLeft()* b.getLeft(), a.getRight() * b.getRight());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ôàççèôèöèðîâàòü òîëüêî îäíó òî÷êó
|
||||||
|
// âîçâðàùàåò èíäåêñ ôóíêöèè ïðèíàäëåæíîñòè ñ ìàêñèìàëüíûì çíà÷åíèåì
|
||||||
|
A FuzzyWithSets::fuzzyfication(double value) {
|
||||||
|
// ïåðåáèðàåì âñå ôóíêöèè ïðèíàäëåæíîñòè,
|
||||||
|
// åñëè íàøëè íàèáîëüøóþ ñòåïåíü ïðèíàäëåæíîñòè, òî ôèêñèðóåì èíäåêñ ôóíêöèè
|
||||||
|
A aMax = a[0];
|
||||||
|
for (int j = 0; j < a.size(); j++) {
|
||||||
|
if (a[j].getValue(value) > aMax.getValue(value)) {
|
||||||
|
aMax = a[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return aMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FuzzyWithSets::createModelForEstimation() {
|
||||||
|
fuzzyTs.clear();
|
||||||
|
fuzzyForecast.clear();
|
||||||
|
defineUniversum();
|
||||||
|
// ôàççèôèêàöèÿ
|
||||||
|
fuzzyTs.resize(xLearning.size());
|
||||||
|
for (int i = 0; i < xLearning.size();i++) {
|
||||||
|
fuzzyTs[i] = (fuzzyfication(xLearning[i]));
|
||||||
|
}
|
||||||
|
init();
|
||||||
|
A fuzzyLast = fuzzyTs[fuzzyTs.size()-1];
|
||||||
|
A e;
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1+this->countPointForecast; t++) {
|
||||||
|
if (trendType.compare("None") == 0) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < fuzzyTs.size()) {
|
||||||
|
e = minusSet(fuzzyTs[t], fuzzyForecast[t]);
|
||||||
|
} else {
|
||||||
|
e = A(0,0);
|
||||||
|
}
|
||||||
|
if (seasonType.compare("None") == 0) {
|
||||||
|
S.push_back(plusSet(S[t],multSetNum(alpha, e)));
|
||||||
|
fuzzyForecast.push_back(S[t+1]);
|
||||||
|
} else if (seasonType.compare("Add") == 0) {
|
||||||
|
S.push_back(plusSet(S[t], multSetNum(alpha, e)));
|
||||||
|
I.push_back(plusSet(I[t], multSetNum(delta, e)));
|
||||||
|
fuzzyForecast.push_back(plusSet(S[t+1], I[t+1]));
|
||||||
|
} else if (seasonType.compare("Mult") == 0) {
|
||||||
|
S.push_back(plusSet(S[t], divSet(multSetNum(alpha, e), I[t])));
|
||||||
|
I.push_back(plusSet(I[t], divSet(multSetNum(delta, e), S[t])));
|
||||||
|
fuzzyForecast.push_back(multSet(S[t+1], I[t+1]));
|
||||||
|
}
|
||||||
|
} else if (trendType.compare("Add") == 0) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < fuzzyTs.size()) {
|
||||||
|
e = minusSet(fuzzyTs[t], fuzzyForecast[t]);
|
||||||
|
} else {
|
||||||
|
e = A(0,0);
|
||||||
|
}
|
||||||
|
if (seasonType.compare("None") == 0) {
|
||||||
|
S.push_back(plusSet(S[t], plusSet(T[t], multSetNum(alpha, e))));
|
||||||
|
T.push_back(plusSet(T[t], multSetNum(alpha, multSetNum(gamma, e))));
|
||||||
|
fuzzyForecast.push_back(plusSet(S[t+1], T[t+1]));
|
||||||
|
} else if (seasonType.compare("Add") == 0) {
|
||||||
|
S.push_back(plusSet(S[t], plusSet(T[t], multSetNum(alpha, e))));
|
||||||
|
T.push_back(plusSet(T[t], multSetNum(alpha, multSetNum(gamma, e))));
|
||||||
|
I.push_back(plusSet(I[t], multSetNum(delta, e)));
|
||||||
|
fuzzyForecast.push_back(plusSet(S[t+1], plusSet(T[t+1], I[t+1])));
|
||||||
|
} else if (seasonType.compare("Mult") == 0) {
|
||||||
|
S.push_back(plusSet(S[t], plusSet(T[t], divSet(multSetNum(alpha, e), I[t]))));
|
||||||
|
T.push_back(plusSet(T[t], divSet(multSetNum(alpha, multSetNum(gamma, e)), I[t])));
|
||||||
|
I.push_back(plusSet(I[t], divSet(multSetNum(delta, e), plusSet(S[t], T[t]))));
|
||||||
|
fuzzyForecast.push_back(multSet(plusSet(S[t+1], T[t+1]), I[t+1]));
|
||||||
|
}
|
||||||
|
} else if (trendType.compare("Mult") == 0) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < fuzzyTs.size()) {
|
||||||
|
e = minusSet(fuzzyTs[t], fuzzyForecast[t]);
|
||||||
|
} else {
|
||||||
|
e = A(0,0);
|
||||||
|
}
|
||||||
|
if (seasonType.compare("None") == 0) {
|
||||||
|
S.push_back(plusSet(multSet(S[t], T[t]), multSetNum(alpha, e)));
|
||||||
|
T.push_back(plusSet(T[t], divSet(multSetNum(alpha, multSetNum(gamma, e)), S[t])));
|
||||||
|
fuzzyForecast.push_back(multSet(S[t+1], T[t+1]));
|
||||||
|
} else if (seasonType.compare("Add") == 0) {
|
||||||
|
S.push_back(plusSet(multSet(S[t], T[t]), multSetNum(alpha, e)));
|
||||||
|
T.push_back(plusSet(T[t], divSet(multSetNum(alpha, multSetNum(gamma, e)), S[t])));
|
||||||
|
I.push_back(plusSet(I[t], multSetNum(delta, e)));
|
||||||
|
fuzzyForecast.push_back(plusSet(multSet(S[t+1], T[t+1]), I[t]));
|
||||||
|
} else if (seasonType.compare("Mult") == 0) {
|
||||||
|
S.push_back(plusSet(multSet(S[t], T[t]), divSet(multSetNum(alpha, e), I[t])));
|
||||||
|
T.push_back(plusSet(
|
||||||
|
T[t],
|
||||||
|
divSet(
|
||||||
|
divSet(
|
||||||
|
multSetNum(
|
||||||
|
alpha,
|
||||||
|
multSetNum(
|
||||||
|
gamma,
|
||||||
|
e)
|
||||||
|
),
|
||||||
|
S[t]),
|
||||||
|
I[t])
|
||||||
|
)
|
||||||
|
);
|
||||||
|
I.push_back(plusSet(I[t], divSet(divSet(multSetNum(delta, e), S[t]), T[t])));
|
||||||
|
fuzzyForecast.push_back(multSet(S[t+1], multSet(T[t+1], I[t])));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ôàççèèêàöèÿ, ñîçäàòü ñïèñîê ôóíêöèé ïðèíàäëåæíîñòè ïî âñåìó ðÿäó
|
||||||
|
void FuzzyWithSets::createModel() {
|
||||||
|
fuzzyTs.clear();
|
||||||
|
fuzzyForecast.clear();
|
||||||
|
defineUniversum();
|
||||||
|
// ôàççèôèêàöèÿ
|
||||||
|
fuzzyTs.resize(x.size());
|
||||||
|
for (int i = 0; i < x.size();i++) {
|
||||||
|
fuzzyTs[i] = (fuzzyfication(x[i]));
|
||||||
|
}
|
||||||
|
init();
|
||||||
|
A fuzzyLast = fuzzyTs[fuzzyTs.size()-1];
|
||||||
|
A e;
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1+this->countPointForecast; t++) {
|
||||||
|
if (trendType.compare("None") == 0) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < fuzzyTs.size()) {
|
||||||
|
e = minusSet(fuzzyTs[t], fuzzyForecast[t]);
|
||||||
|
} else {
|
||||||
|
e = A(0,0);
|
||||||
|
}
|
||||||
|
if (seasonType.compare("None") == 0) {
|
||||||
|
S.push_back(plusSet(S[t],multSetNum(alpha, e)));
|
||||||
|
fuzzyForecast.push_back(S[t+1]);
|
||||||
|
} else if (seasonType.compare("Add") == 0) {
|
||||||
|
S.push_back(plusSet(S[t], multSetNum(alpha, e)));
|
||||||
|
I.push_back(plusSet(I[t], multSetNum(delta, e)));
|
||||||
|
fuzzyForecast.push_back(plusSet(S[t+1], I[t+1]));
|
||||||
|
} else if (seasonType.compare("Mult") == 0) {
|
||||||
|
S.push_back(plusSet(S[t], divSet(multSetNum(alpha, e), I[t])));
|
||||||
|
I.push_back(plusSet(I[t], divSet(multSetNum(delta, e), S[t])));
|
||||||
|
fuzzyForecast.push_back(multSet(S[t+1], I[t+1]));
|
||||||
|
}
|
||||||
|
} else if (trendType.compare("Add") == 0) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < fuzzyTs.size()) {
|
||||||
|
e = minusSet(fuzzyTs[t], fuzzyForecast[t]);
|
||||||
|
} else {
|
||||||
|
e = A(0,0);
|
||||||
|
}
|
||||||
|
if (seasonType.compare("None") == 0) {
|
||||||
|
S.push_back(plusSet(S[t], plusSet(T[t], multSetNum(alpha, e))));
|
||||||
|
T.push_back(plusSet(T[t], multSetNum(alpha, multSetNum(gamma, e))));
|
||||||
|
fuzzyForecast.push_back(plusSet(S[t+1], T[t+1]));
|
||||||
|
} else if (seasonType.compare("Add") == 0) {
|
||||||
|
S.push_back(plusSet(S[t], plusSet(T[t], multSetNum(alpha, e))));
|
||||||
|
T.push_back(plusSet(T[t], multSetNum(alpha, multSetNum(gamma, e))));
|
||||||
|
I.push_back(plusSet(I[t], multSetNum(delta, e)));
|
||||||
|
fuzzyForecast.push_back(plusSet(S[t+1], plusSet(T[t+1], I[t+1])));
|
||||||
|
} else if (seasonType.compare("Mult") == 0) {
|
||||||
|
S.push_back(plusSet(S[t], plusSet(T[t], divSet(multSetNum(alpha, e), I[t]))));
|
||||||
|
T.push_back(plusSet(T[t], divSet(multSetNum(alpha, multSetNum(gamma, e)), I[t])));
|
||||||
|
I.push_back(plusSet(I[t], divSet(multSetNum(delta, e), plusSet(S[t], T[t]))));
|
||||||
|
fuzzyForecast.push_back(multSet(plusSet(S[t+1], T[t+1]), I[t+1]));
|
||||||
|
}
|
||||||
|
} else if (trendType.compare("Mult") == 0) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < fuzzyTs.size()) {
|
||||||
|
e = minusSet(fuzzyTs[t], fuzzyForecast[t]);
|
||||||
|
} else {
|
||||||
|
e = A(0,0);
|
||||||
|
}
|
||||||
|
if (seasonType.compare("None") == 0) {
|
||||||
|
S.push_back(plusSet(multSet(S[t], T[t]), multSetNum(alpha, e)));
|
||||||
|
T.push_back(plusSet(T[t], divSet(multSetNum(alpha, multSetNum(gamma, e)), S[t])));
|
||||||
|
fuzzyForecast.push_back(multSet(S[t+1], T[t+1]));
|
||||||
|
} else if (seasonType.compare("Add") == 0) {
|
||||||
|
S.push_back(plusSet(multSet(S[t], T[t]), multSetNum(alpha, e)));
|
||||||
|
T.push_back(plusSet(T[t], divSet(multSetNum(alpha, multSetNum(gamma, e)), S[t])));
|
||||||
|
I.push_back(plusSet(I[t], multSetNum(delta, e)));
|
||||||
|
fuzzyForecast.push_back(plusSet(multSet(S[t+1], T[t+1]), I[t]));
|
||||||
|
} else if (seasonType.compare("Mult") == 0) {
|
||||||
|
S.push_back(plusSet(multSet(S[t], T[t]), divSet(multSetNum(alpha, e), I[t])));
|
||||||
|
T.push_back(plusSet(
|
||||||
|
T[t],
|
||||||
|
divSet(
|
||||||
|
divSet(
|
||||||
|
multSetNum(
|
||||||
|
alpha,
|
||||||
|
multSetNum(
|
||||||
|
gamma,
|
||||||
|
e)
|
||||||
|
),
|
||||||
|
S[t]),
|
||||||
|
I[t])
|
||||||
|
)
|
||||||
|
);
|
||||||
|
I.push_back(plusSet(I[t], divSet(divSet(multSetNum(delta, e), S[t]), T[t])));
|
||||||
|
fuzzyForecast.push_back(multSet(S[t+1], multSet(T[t+1], I[t])));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> FuzzyWithSets::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
/* result.resize(countPointForecast);
|
||||||
|
for (unsigned int i = fuzzyForecast.size() - countPointForecast; i < fuzzyForecast.size(); i++) {
|
||||||
|
if (_finite(defuzzyfication(fuzzyForecast[i])) == 0){
|
||||||
|
result[i - (fuzzyForecast.size() - countPointForecast)] = (x[x.size()-1]);
|
||||||
|
} else {
|
||||||
|
result[i - (fuzzyForecast.size() - countPointForecast)] = (defuzzyfication(fuzzyForecast[i]));
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
result.resize(fuzzyForecast.size());
|
||||||
|
for (unsigned int i = 0; i < fuzzyForecast.size(); i++) {
|
||||||
|
if (_finite(defuzzyfication(fuzzyForecast[i])) == 0){
|
||||||
|
result[i] = (x[x.size()-1]);
|
||||||
|
} else {
|
||||||
|
result[i] = (defuzzyfication(fuzzyForecast[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
double FuzzyWithSets::defuzzyfication(A a) {
|
||||||
|
return a.getValueAtTop();
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> FuzzyWithSets::defuzzyfication(vector<A> fuz) {
|
||||||
|
vector<double> result;
|
||||||
|
for (int i =0; i < fuz.size(); i++) {
|
||||||
|
result.push_back(defuzzyfication(fuz[i]));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FuzzyWithSets::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("countFuzzyParts") == 0) {
|
||||||
|
this->countFuzzyParts = value;
|
||||||
|
} else if (paramName.compare("p") == 0) {
|
||||||
|
this->p = value;
|
||||||
|
} else if (paramName.compare("gamma") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
} else if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("delta") == 0) {
|
||||||
|
this->delta = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (paramName.compare("0") == 0) {
|
||||||
|
this->countFuzzyParts = value * 100;
|
||||||
|
} else if (paramName.compare("1") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("2") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
} else if (paramName.compare("3") == 0) {
|
||||||
|
this->delta = value;
|
||||||
|
} else if (paramName.compare("4") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double FuzzyWithSets::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(3, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* FuzzyWithSets::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0; al < 1; al+= 0.1) {
|
||||||
|
cout << "FWS " << al << " èç 1" <<"\n";
|
||||||
|
for (double gam = 0; gam < 1; gam+= 0.1) {
|
||||||
|
for (double del = 0; del < 1;del+= 0.1) {
|
||||||
|
for (double cfp = 2; cfp < 50;cfp+= 2) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->setParam("gamma", gam);
|
||||||
|
this->setParam("delta", del);
|
||||||
|
this->setParam("countFuzzyParts", cfp);
|
||||||
|
double smapeValue = 0;
|
||||||
|
int maxShift = 5;
|
||||||
|
if (maxShift > this->countPointForecast) {
|
||||||
|
maxShift = this->countPointForecast-1;
|
||||||
|
}
|
||||||
|
this->countPointForecast -= maxShift;
|
||||||
|
for (int shift=0; shift <= maxShift; shift++) {
|
||||||
|
this->partition();
|
||||||
|
this->createModelForEstimation();
|
||||||
|
smapeValue += est->getValue(x, getForecast());
|
||||||
|
this->countPointForecast++;
|
||||||
|
}
|
||||||
|
this->countPointForecast--;
|
||||||
|
smapeValue = smapeValue / maxShift;
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
optimal->gamma = gam;
|
||||||
|
optimal->delta = del;
|
||||||
|
optimal->estim = smapeValue;
|
||||||
|
optimal->countFuzzyParts = cfp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int FuzzyWithSets::getNamberParam() {
|
||||||
|
return 5;
|
||||||
|
}
|
55
project_template/FuzzyWithSets.h
Normal file
55
project_template/FuzzyWithSets.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#ifndef FUZZYWITHSETS_H
|
||||||
|
#define FUZZYWITHSETS_H
|
||||||
|
#include <vector>
|
||||||
|
#include "A.h"
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class FuzzyWithSets : public Method {
|
||||||
|
private:
|
||||||
|
vector<A> a; // íàáîð ôóíêöèé ïðèíàäëåæíîñòè
|
||||||
|
int countFuzzyParts;// êîëè÷åñòâî èíòåðâàëîâ óíèâåðñóìà
|
||||||
|
double universumMin;
|
||||||
|
double universumMax;
|
||||||
|
vector<A> fuzzyTs; // íå÷åòêèé âðåìåííîé ðÿä
|
||||||
|
vector<A> fuzzyForecast; // íå÷åòêèé âðåìåííîé ðÿä
|
||||||
|
double w;
|
||||||
|
string trendType;
|
||||||
|
string seasonType;
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
double delta; // ïàðàìåòð ñãëàæèâàíèÿ ñåçîííîé êîìïîíåíòû
|
||||||
|
int p; // ïåðèîä ñåçîííîñòè
|
||||||
|
double phi; // ïàðàìåòð äåìïèíãà
|
||||||
|
vector<A> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
vector<A> I;
|
||||||
|
vector<A> T;
|
||||||
|
|
||||||
|
void defineUniversum(); // îïðåäåëèòü óíèåðñóì äëÿ âðåìåííîãî ðÿäà
|
||||||
|
A fuzzyfication(double);
|
||||||
|
double defuzzyfication(A);
|
||||||
|
vector<double> defuzzyfication(vector<A>);
|
||||||
|
A minusSet(A, A);
|
||||||
|
A plusSet(A, A);
|
||||||
|
A divSet(A, A);
|
||||||
|
A divSet(A, double);
|
||||||
|
A multSet(A, A);
|
||||||
|
A multSetNum(double, A);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
FuzzyWithSets(string, string, vector<double>, int);
|
||||||
|
~FuzzyWithSets(void);
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
int getNamberParam();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
29
project_template/Mape.cpp
Normal file
29
project_template/Mape.cpp
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "Mape.h"
|
||||||
|
#include "Math.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
// êðèòåðèé Mape. Íàñëåäóåòñÿ îò êëàññà Estimation.
|
||||||
|
// ðåàëèçóåò ìåòîä "ïîëó÷èòü çíà÷åíèå êðèòåðèÿ"
|
||||||
|
|
||||||
|
Mape::Mape() {
|
||||||
|
}
|
||||||
|
|
||||||
|
Mape::~Mape() {
|
||||||
|
}
|
||||||
|
|
||||||
|
double Mape::getValue(int paramCount, vector<double> original, vector<double> model) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
double Mape::getValue(vector<double> original, vector<double> model) {
|
||||||
|
double mape = 0;
|
||||||
|
for (int i = 0; i < original.size(); i++) {
|
||||||
|
mape += fabs((fabs(original[i] - model[i])) / original[i]);
|
||||||
|
}
|
||||||
|
mape = mape / original.size();
|
||||||
|
mape = mape * 100;
|
||||||
|
|
||||||
|
return mape;
|
||||||
|
|
||||||
|
}
|
15
project_template/Mape.h
Normal file
15
project_template/Mape.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef MAPE_H
|
||||||
|
#define MAPE_H
|
||||||
|
#include "Estimation.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
// êðèòåðèé Mape. Íàñëåäóåòñÿ îò êëàññà Estimation.
|
||||||
|
// ðåàëèçóåò ìåòîä "ïîëó÷èòü çíà÷åíèå êðèòåðèÿ"
|
||||||
|
class Mape : public Estimation {
|
||||||
|
public:
|
||||||
|
Mape();
|
||||||
|
~Mape();
|
||||||
|
double getValue(vector<double>, vector<double>);
|
||||||
|
double getValue(int, vector<double>, vector<double>);
|
||||||
|
};
|
||||||
|
#endif
|
65
project_template/Median.cpp
Normal file
65
project_template/Median.cpp
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#include "StdAfx.h"
|
||||||
|
#include "Median.h"
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
|
||||||
|
Median::Median() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Median::~Median() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
double Median::getValue(int, vector<double>, vector<double>){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
double Median::getValue(vector<double>, vector<double>){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double Median::getValue(vector<double> ts){
|
||||||
|
|
||||||
|
double median;
|
||||||
|
|
||||||
|
int size = ts.size();
|
||||||
|
sort(ts.begin(), ts.end());
|
||||||
|
|
||||||
|
if (size % 2 == 0)
|
||||||
|
{
|
||||||
|
median = (ts[size % 2 - 1] + ts[size % 2 + 1]) / 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
median = ts[size / 2];
|
||||||
|
}
|
||||||
|
|
||||||
|
return median;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Median::getValue(vector<double> ts, int period){
|
||||||
|
|
||||||
|
int size = ts.size();
|
||||||
|
int amtPeriod = size / period;
|
||||||
|
int shift = size - amtPeriod * period;
|
||||||
|
|
||||||
|
vector <double> median(amtPeriod);
|
||||||
|
vector <double> temp(period);
|
||||||
|
|
||||||
|
int begin;
|
||||||
|
int end;
|
||||||
|
|
||||||
|
for (int i = 0; i < amtPeriod; i++)
|
||||||
|
{
|
||||||
|
begin = shift + i * period;
|
||||||
|
end = begin + period;
|
||||||
|
|
||||||
|
std::copy(ts.begin() + begin, ts.begin() + end, temp.begin());
|
||||||
|
|
||||||
|
median[i] = getValue(temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return median;
|
||||||
|
}
|
20
project_template/Median.h
Normal file
20
project_template/Median.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#ifndef MEDIAN_H
|
||||||
|
#define MEDIAN_H
|
||||||
|
#include "Estimation.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
class Median :public Estimation {
|
||||||
|
public:
|
||||||
|
|
||||||
|
Median();
|
||||||
|
~Median();
|
||||||
|
|
||||||
|
double getValue(vector<double>);
|
||||||
|
vector<double> getValue(vector<double>, int);
|
||||||
|
|
||||||
|
double getValue(int, vector<double>, vector<double>);
|
||||||
|
double getValue(vector<double>, vector<double>);
|
||||||
|
};
|
||||||
|
#endif
|
34
project_template/Method.cpp
Normal file
34
project_template/Method.cpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// àääèòèâíûé òðåíä, àääèòèâíàÿ ñåçîííîñòü
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "Method.h"
|
||||||
|
|
||||||
|
void Method::partition() {
|
||||||
|
this->xLearning.clear();
|
||||||
|
this->xEstimation.clear();
|
||||||
|
this->xLearning.resize(x.size() - countPointForecast);
|
||||||
|
this->xEstimation.resize(this->countPointForecast);
|
||||||
|
//ñîõðàíÿåì ÷àñòü äëÿ òåñòèðîâàíèÿ
|
||||||
|
for (unsigned int i = 0; i < x.size() - countPointForecast; i++) {
|
||||||
|
this->xLearning[i] = x[i];
|
||||||
|
}
|
||||||
|
// ñîõðàíÿåì ÷àñòü ÂÐ äëÿ òåñòèðîâàíèÿ
|
||||||
|
int j=0;
|
||||||
|
for (unsigned int i = x.size() - countPointForecast; i < x.size(); i++) {
|
||||||
|
this->xEstimation[j++] = x[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Method::getXEstimation() {
|
||||||
|
return this->xEstimation;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Method::getNamberParam() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
45
project_template/Method.h
Normal file
45
project_template/Method.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#ifndef METHOD_H
|
||||||
|
#define METHOD_H
|
||||||
|
#include "Estimation.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// абстрактный класс метода сглаживания и прогнозирования временных рядов
|
||||||
|
// хранит в себе поля, отвечающие за части ряда для обучения, тестирования, прогнозную часть
|
||||||
|
//
|
||||||
|
class Method {
|
||||||
|
public:
|
||||||
|
vector<double> x; // первоначальный временной ряд
|
||||||
|
vector<double> xLearning; // временной ряд для обучения
|
||||||
|
vector<double> xEstimation; // временной ряд для тестирования
|
||||||
|
vector<double> forecast; // прогноз ряда
|
||||||
|
unsigned int countPointForecast; // количеcтво прогнозируемых точек
|
||||||
|
|
||||||
|
//Vovks variables
|
||||||
|
char * name;
|
||||||
|
//double weight = 0.5; //start weight
|
||||||
|
//double value = 0; //last forecast
|
||||||
|
double weight; //start weight
|
||||||
|
double value; //last forecast
|
||||||
|
|
||||||
|
//bool isActive = true;
|
||||||
|
bool isActive;
|
||||||
|
//Vovks variables
|
||||||
|
virtual vector<double> getForecast() = 0; // виртуальный метод получения прогноза
|
||||||
|
virtual void createModel() = 0; // виртуальный метод для формирования модели
|
||||||
|
virtual void createModelForEstimation() = 0; // виртуальный метод для формирования модели на участке для обучения
|
||||||
|
virtual double calcEstimation(Aic *) = 0; // виртуальный метод получения оценки модели
|
||||||
|
//virtual double calcEstimation(Aicc *) = 0; // виртуальный метод получения оценки модели
|
||||||
|
//virtual double calcEstimation(Bic *) = 0; // виртуальный метод получения оценки модели
|
||||||
|
virtual Param* optimize(Estimation *) = 0; // виртуальный метод оптимизации одного параметра
|
||||||
|
virtual void setParam(string, double) = 0; // виртуальный метод оптимизации задания параметров
|
||||||
|
void partition(); // разделить временной ряд на части для обучения и тестирования
|
||||||
|
void partition(int); // разделить временной ряд на части для обучения и тестирования
|
||||||
|
vector<double> getXLearning(); // метод получения части временного ряда для обучения
|
||||||
|
vector<double> getXEstimation(); // метод получения части временного ряда для тестирования
|
||||||
|
virtual int getNamberParam();
|
||||||
|
};
|
||||||
|
#endif
|
146
project_template/MultTrendAddSeasonality.cpp
Normal file
146
project_template/MultTrendAddSeasonality.cpp
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// àääèòèâíûé òðåíä, àääèòèâíàÿ ñåçîííîñòü
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "MultTrendAddSeasonality.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
// êîíñòðóêòîð ñ çàäàííûìè íåïîñðåäñòâåííî ïàðàìåòðàìè
|
||||||
|
MultTrendAddSeasonality::MultTrendAddSeasonality(vector<double> timeSeries, int countPointForecast) {
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
MultTrendAddSeasonality::~MultTrendAddSeasonality() {
|
||||||
|
// îñâîáîæäàåòñÿ ïàìÿòü
|
||||||
|
std::vector<double> ().swap(S);
|
||||||
|
std::vector<double> ().swap(x);
|
||||||
|
std::vector<double> ().swap(T);
|
||||||
|
std::vector<double> ().swap(I);
|
||||||
|
std::vector<double> ().swap(forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// èíèöèàëèçàöèÿ ìîäåëè, çàäàíèå ïåðâîíà÷àëüíûõ çíà÷åíèé
|
||||||
|
void MultTrendAddSeasonality::init() {
|
||||||
|
S.clear();
|
||||||
|
T.clear();
|
||||||
|
I.clear();
|
||||||
|
forecast.clear();
|
||||||
|
|
||||||
|
double sumS = 0;
|
||||||
|
double sumT = 0;
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
sumS += x[t];
|
||||||
|
sumT += x[t+p];
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(sumS / p);
|
||||||
|
T.push_back((sumT/ p - S[0]) / p);
|
||||||
|
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I.push_back(x[t] - S[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
forecast.push_back(S[0] * T[0] + I[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Çàäàòü ïàðàìåòð
|
||||||
|
void MultTrendAddSeasonality::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("gamma") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
} else if (paramName.compare("p") == 0) {
|
||||||
|
this->p = value;
|
||||||
|
} else if (paramName.compare("delta") == 0) {
|
||||||
|
this->delta = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void MultTrendAddSeasonality::createModel() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = x[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] * T[t] + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(T[t] + alpha * gamma * e / S[t]); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] * T[t+1] + I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void MultTrendAddSeasonality::createModelForEstimation() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = xLearning[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] * T[t] + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(T[t] + alpha * gamma * e / S[t]); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] * T[t+1] + I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ ïðîãíîçà
|
||||||
|
vector<double> MultTrendAddSeasonality::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double MultTrendAddSeasonality::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(3, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* MultTrendAddSeasonality::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0.1; al < 1; al+= 0.01) {
|
||||||
|
for (double gam = 0.1; gam < 1; gam+= 0.01) {
|
||||||
|
for (double del = 0.1; del < 1;del+= 0.01) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->setParam("gamma", gam);
|
||||||
|
this->setParam("delta", del);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
optimal->gamma = gam;
|
||||||
|
optimal->delta = del;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
||||||
|
|
34
project_template/MultTrendAddSeasonality.h
Normal file
34
project_template/MultTrendAddSeasonality.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#ifndef MULTTRENDADDSEASONALITY_H
|
||||||
|
#define MULTTRENDADDSEASONALITY_H
|
||||||
|
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êîíêðåòíàÿ ðåàëèçàöèÿ àáñòðàêòíîãî êëàññà Method
|
||||||
|
// ðåàëèçóåò ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ ñ ìóëüòèïëèêàòâíûì òðåíäîì, àääèòèâíîé ñåçîííîñòüþ
|
||||||
|
class MultTrendAddSeasonality : public Method {
|
||||||
|
public:
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
vector<double> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
double delta; // ïàðàìåòð ñãëàæèâàíèÿ ñåçîííîé êîìïîíåíòû
|
||||||
|
vector<double> T; // ñãëàæåííûé òðåíä
|
||||||
|
vector<double> I; // ñåçîííàÿ êîìïîíåíòà
|
||||||
|
int p; // ïåðèîä ñåçîííîñòè
|
||||||
|
|
||||||
|
MultTrendAddSeasonality(vector<double>, int);
|
||||||
|
~MultTrendAddSeasonality();
|
||||||
|
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
145
project_template/MultTrendMultSeasonality.cpp
Normal file
145
project_template/MultTrendMultSeasonality.cpp
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// àääèòèâíûé òðåíä, ìóëüòèïëèêàòèâíàÿ ñåçîííîñòü
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "MultTrendMultSeasonality.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
// êîíñòðóêòîð ñ çàäàííûìè íåïîñðåäñòâåííî ïàðàìåòðàìè
|
||||||
|
MultTrendMultSeasonality::MultTrendMultSeasonality(vector<double> timeSeries, int countPointForecast) {
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
MultTrendMultSeasonality::~MultTrendMultSeasonality() {
|
||||||
|
// îñâîáîæäàåòñÿ ïàìÿòü
|
||||||
|
std::vector<double> ().swap(S);
|
||||||
|
std::vector<double> ().swap(x);
|
||||||
|
std::vector<double> ().swap(T);
|
||||||
|
std::vector<double> ().swap(I);
|
||||||
|
std::vector<double> ().swap(forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// èíèöèàëèçàöèÿ ìîäåëè, çàäàíèå ïåðâîíà÷àëüíûõ çíà÷åíèé
|
||||||
|
void MultTrendMultSeasonality::init() {
|
||||||
|
S.clear();
|
||||||
|
T.clear();
|
||||||
|
I.clear();
|
||||||
|
forecast.clear();
|
||||||
|
|
||||||
|
double sumS = 0;
|
||||||
|
double sumT = 0;
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
sumS += x[t];
|
||||||
|
sumT += x[t+p];
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(sumS / p);
|
||||||
|
T.push_back((sumT/ p - S[0]) / p);
|
||||||
|
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I.push_back(x[t] / S[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
forecast.push_back(S[0] * T[0] * I[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Çàäàòü ïàðàìåòð
|
||||||
|
void MultTrendMultSeasonality::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("gamma") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
} else if (paramName.compare("p") == 0) {
|
||||||
|
this->p = value;
|
||||||
|
} else if (paramName.compare("delta") == 0) {
|
||||||
|
this->delta = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void MultTrendMultSeasonality::createModel() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = x[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] * T[t] + alpha * e / I[t]); // óðîâåíü
|
||||||
|
T.push_back(T[t] + alpha * gamma * e / (I[t] * S[t])); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e / (S[t] * T[t])); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] * T[t+1] * I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü ñ íîâûì çíà÷åíèåì ïàðàìåòðà. ïåðåãðóæåííûé ìåòîä
|
||||||
|
void MultTrendMultSeasonality::createModelForEstimation() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = xLearning[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] * T[t] + alpha * e / I[t]); // óðîâåíü
|
||||||
|
T.push_back(T[t] + alpha * gamma * e / (I[t] * S[t])); // òðåíä
|
||||||
|
I.push_back(I[t] + delta * e / (S[t] * T[t])); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] * T[t+1] * I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ ïðîãíîçà
|
||||||
|
vector<double> MultTrendMultSeasonality::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double MultTrendMultSeasonality::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(3, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* MultTrendMultSeasonality::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0.1; al < 1; al+= 0.01) {
|
||||||
|
for (double gam = 0.1; gam < 1; gam+= 0.01) {
|
||||||
|
for (double del = 0.1; del < 1;del+= 0.01) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->setParam("gamma", gam);
|
||||||
|
this->setParam("delta", del);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
optimal->gamma = gam;
|
||||||
|
optimal->delta = del;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
||||||
|
|
34
project_template/MultTrendMultSeasonality.h
Normal file
34
project_template/MultTrendMultSeasonality.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#ifndef MULTTRENDMULTSEASONALITY_H
|
||||||
|
#define MULTTRENDMULTSEASONALITY_H
|
||||||
|
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êîíêðåòíàÿ ðåàëèçàöèÿ àáñòðàêòíîãî êëàññà Method
|
||||||
|
// ðåàëèçóåò ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ ñ ìóëüòèïëèêàòâíûì òðåíäîì, ìóëüòèïëèêàòèâíîé ñåçîííîñòüþ
|
||||||
|
class MultTrendMultSeasonality : public Method {
|
||||||
|
public:
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
vector<double> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
vector<double> T; // ñãëàæåííûé òðåíä
|
||||||
|
double delta; // ïàðàìåòð ñãëàæèâàíèÿ ñåçîííîé êîìïîíåíòû
|
||||||
|
vector<double> I; // ñåçîííàÿ êîìïîíåíòà
|
||||||
|
int p; // ïåðèîä ñåçîííîñòè
|
||||||
|
|
||||||
|
MultTrendMultSeasonality(vector<double>, int);
|
||||||
|
~MultTrendMultSeasonality();
|
||||||
|
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
121
project_template/MultTrendNoSeasonality.cpp
Normal file
121
project_template/MultTrendNoSeasonality.cpp
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// ìóëüòèïëèêàòèâíûé òðåíä, áåç ñåçîííîñòè
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "MultTrendNoSeasonality.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
|
||||||
|
// êîíñòðóêòîð ñ çàäàííûìè íåïîñðåäñòâåííî ïàðàìåòðàìè
|
||||||
|
MultTrendNoSeasonality::MultTrendNoSeasonality(vector<double> timeSeries, int countPointForecast) {
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
MultTrendNoSeasonality::~MultTrendNoSeasonality() {
|
||||||
|
// îñâîáîæäàåòñÿ ïàìÿòü
|
||||||
|
std::vector<double> ().swap(S);
|
||||||
|
std::vector<double> ().swap(x);
|
||||||
|
std::vector<double> ().swap(T);
|
||||||
|
std::vector<double> ().swap(forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// èíèöèàëèçàöèÿ ìîäåëè, çàäàíèå ïåðâîíà÷àëüíûõ çíà÷åíèé
|
||||||
|
void MultTrendNoSeasonality::init() {
|
||||||
|
S.clear();
|
||||||
|
T.clear();
|
||||||
|
forecast.clear();
|
||||||
|
|
||||||
|
T.push_back(x[1] / x[0]);
|
||||||
|
S.push_back(x[0]);
|
||||||
|
forecast.push_back(S[0] * T[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Çàäàòü ïàðàìåòð
|
||||||
|
void MultTrendNoSeasonality::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("gamma") == 0) {
|
||||||
|
this->gamma = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void MultTrendNoSeasonality::createModel() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = x[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] * T[t] + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(T[t] + alpha * gamma * e / S[t]); // òðåíä
|
||||||
|
forecast.push_back(S[t+1] * T[t+1]); // ïðîãíîç
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void MultTrendNoSeasonality::createModelForEstimation() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = xLearning[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] * T[t] + alpha * e); // óðîâåíü
|
||||||
|
T.push_back(T[t] + alpha * gamma * e / S[t]); // òðåíä
|
||||||
|
forecast.push_back(S[t+1] * T[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ ïðîãíîçà
|
||||||
|
vector<double> MultTrendNoSeasonality::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double MultTrendNoSeasonality::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(2, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* MultTrendNoSeasonality::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0.1; al < 1; al+= 0.01) {
|
||||||
|
for (double gam = 0.1; gam < 1; gam+= 0.01) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->setParam("gamma", gam);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
optimal->gamma = gam;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
||||||
|
|
32
project_template/MultTrendNoSeasonality.h
Normal file
32
project_template/MultTrendNoSeasonality.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#ifndef MULTTRENDNOSEASONALITY_H
|
||||||
|
#define MULTTRENDNOSEASONALITY_H
|
||||||
|
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êîíêðåòíàÿ ðåàëèçàöèÿ àáñòðàêòíîãî êëàññà Method
|
||||||
|
// ðåàëèçóåò ìåòîä ýêñïîíåíöèàëüíîãî ñ ìóëüòèïëèêàòèâíûì òðåíäîì, áåç ñåçîííîñòè
|
||||||
|
class MultTrendNoSeasonality : public Method {
|
||||||
|
public:
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
vector<double> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
vector<double> T; // ñãëàæåííûé òðåíä
|
||||||
|
|
||||||
|
MultTrendNoSeasonality(vector<double>, int);
|
||||||
|
~MultTrendNoSeasonality();
|
||||||
|
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
130
project_template/NoTrendAddSeasonality.cpp
Normal file
130
project_template/NoTrendAddSeasonality.cpp
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// áåç òðåíäà, àääèòèâíàÿ ñåçîííîñòü
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "NoTrendAddSeasonality.h"
|
||||||
|
|
||||||
|
// êîíñòðóêòîð ñ çàäàííûìè íåïîñðåäñòâåííî ïàðàìåòðàìè
|
||||||
|
NoTrendAddSeasonality::NoTrendAddSeasonality(vector<double> timeSeries, int countPointForecast) {
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
NoTrendAddSeasonality::~NoTrendAddSeasonality() {
|
||||||
|
// îñâîáîæäàåòñÿ ïàìÿòü
|
||||||
|
std::vector<double> ().swap(S);
|
||||||
|
std::vector<double> ().swap(I);
|
||||||
|
std::vector<double> ().swap(x);
|
||||||
|
std::vector<double> ().swap(forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// èíèöèàëèçàöèÿ ìîäåëè, çàäàíèå ïåðâîíà÷àëüíûõ çíà÷åíèé
|
||||||
|
void NoTrendAddSeasonality::init() {
|
||||||
|
S.clear();
|
||||||
|
I.clear();
|
||||||
|
forecast.clear();
|
||||||
|
|
||||||
|
double sumS = 0;
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
sumS += x[t];
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(sumS / p);
|
||||||
|
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I.push_back(x[t] - S[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
forecast.push_back(S[0] + I[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void NoTrendAddSeasonality::createModel() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = x[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + alpha * e); // óðîâåíü
|
||||||
|
I.push_back(I[t] + delta * e); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] + I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void NoTrendAddSeasonality::createModelForEstimation() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = xLearning[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + alpha * e); // óðîâåíü
|
||||||
|
I.push_back(I[t] + delta * e); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] + I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä çàäàíèÿ ïàðàìåòðîâ
|
||||||
|
void NoTrendAddSeasonality::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("delta") == 0) {
|
||||||
|
this->delta = value;
|
||||||
|
} else if (paramName.compare("p") == 0) {
|
||||||
|
this->p = (int) value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ ïðîãíîçà
|
||||||
|
vector<double> NoTrendAddSeasonality::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double NoTrendAddSeasonality::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(2, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* NoTrendAddSeasonality::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0.1; al < 1; al+= 0.01) {
|
||||||
|
for (double del = 0.1; del < 1; del+= 0.01) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->setParam("delta", del);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
optimal->delta = del;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
||||||
|
|
33
project_template/NoTrendAddSeasonality.h
Normal file
33
project_template/NoTrendAddSeasonality.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#ifndef NOTRENDADDSEASONALITY_H
|
||||||
|
#define NOTRENDADDSEASONALITY_H
|
||||||
|
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êîíêðåòíàÿ ðåàëèçàöèÿ àáñòðàêòíîãî êëàññà Method
|
||||||
|
// ðåàëèçóåò ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ áåç òðåíäà c àääèòèâíîé ñåçîííîñòüþ
|
||||||
|
class NoTrendAddSeasonality : public Method {
|
||||||
|
public:
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
vector<double> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
double delta; // ïàðàìåòð ñãëàæèâàíèÿ ñåçîííîñòè
|
||||||
|
vector<double> I; // ñåçîííàÿ êîìïîíåíòà
|
||||||
|
int p; // ïåðèîä ñåçîííîñòè
|
||||||
|
|
||||||
|
NoTrendAddSeasonality(vector<double>, int);
|
||||||
|
~NoTrendAddSeasonality();
|
||||||
|
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
vector<double> getS();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
132
project_template/NoTrendMultSeasonality.cpp
Normal file
132
project_template/NoTrendMultSeasonality.cpp
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// áåç òðåíäà, ìóëüòèïëèêàòèâíàÿ ñåçîííîñòü
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "NoTrendMultSeasonality.h"
|
||||||
|
|
||||||
|
// êîíñòðóêòîð ñ çàäàííûìè íåïîñðåäñòâåííî ïàðàìåòðàìè
|
||||||
|
NoTrendMultSeasonality::NoTrendMultSeasonality(vector<double> timeSeries, int countPointForecast) {
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
NoTrendMultSeasonality::~NoTrendMultSeasonality() {
|
||||||
|
// îñâîáîæäàåòñÿ ïàìÿòü
|
||||||
|
std::vector<double> ().swap(S);
|
||||||
|
std::vector<double> ().swap(I);
|
||||||
|
std::vector<double> ().swap(x);
|
||||||
|
std::vector<double> ().swap(forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä çàäàíèÿ ïàðàìåòðîâ
|
||||||
|
void NoTrendMultSeasonality::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("delta") == 0) {
|
||||||
|
this->delta = value;
|
||||||
|
} else if (paramName.compare("p") == 0) {
|
||||||
|
this->p = (int) value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// èíèöèàëèçàöèÿ ìîäåëè, çàäàíèå ïåðâîíà÷àëüíûõ çíà÷åíèé
|
||||||
|
void NoTrendMultSeasonality::init() {
|
||||||
|
S.clear();
|
||||||
|
I.clear();
|
||||||
|
forecast.clear();
|
||||||
|
|
||||||
|
double sumS = 0;
|
||||||
|
for (int t = 0; t < p; t++) {
|
||||||
|
sumS += x[t];
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(sumS / p);
|
||||||
|
|
||||||
|
for (unsigned int t = 0; t < p; t++) {
|
||||||
|
I.push_back(x[t] / S[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
forecast.push_back(S[0] * I[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void NoTrendMultSeasonality::createModel() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = x[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + alpha * e / I[t]); // óðîâåíü
|
||||||
|
I.push_back(I[t] + delta * e / S[t]); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] * I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void NoTrendMultSeasonality::createModelForEstimation() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = xLearning[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t] + alpha * e / I[t]); // óðîâåíü
|
||||||
|
I.push_back(I[t] + delta * e / S[t]); // ñåçîííîñòü
|
||||||
|
forecast.push_back(S[t+1] * I[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ ïðîãíîçà
|
||||||
|
vector<double> NoTrendMultSeasonality::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double NoTrendMultSeasonality::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(3, this->xEstimation, this->getForecast());
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* NoTrendMultSeasonality::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0.1; al < 1; al+= 0.01) {
|
||||||
|
for (double del = 0.1; del < 1; del+= 0.01) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->setParam("delta", del);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
optimal->delta = del;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
||||||
|
|
30
project_template/NoTrendMultSeasonality.h
Normal file
30
project_template/NoTrendMultSeasonality.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#ifndef NOTRENDMULTSEASONALITY_H
|
||||||
|
#define NOTRENDMULTSEASONALITY_H
|
||||||
|
|
||||||
|
#include "Method.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êîíêðåòíàÿ ðåàëèçàöèÿ àáñòðàêòíîãî êëàññà Method
|
||||||
|
// ðåàëèçóåò ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ áåç òðåíäà c àääèòèâíîé ñåçîííîñòüþ
|
||||||
|
class NoTrendMultSeasonality : public Method {
|
||||||
|
public:
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
vector<double> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
double delta; // ïàðàìåòð ñãëàæèâàíèÿ ñåçîííîñòè
|
||||||
|
vector<double> I; // ñåçîííàÿ êîìïîíåíòà
|
||||||
|
int p; // ïåðèîä ñåçîííîñòè
|
||||||
|
|
||||||
|
NoTrendMultSeasonality(vector<double>, int);
|
||||||
|
~NoTrendMultSeasonality();
|
||||||
|
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *); // âèðòóàëüíûé ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
109
project_template/NoTrendNoSeasonality.cpp
Normal file
109
project_template/NoTrendNoSeasonality.cpp
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
//
|
||||||
|
// Ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ è ïðîãíîçèðîâàíèÿ:
|
||||||
|
// áåç òðåíäà, áåç ñåçîííîñòè
|
||||||
|
//
|
||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "NoTrendNoSeasonality.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
// êîíñòðóêòîð ñ çàäàííûìè íåïîñðåäñòâåííî ïàðàìåòðàìè
|
||||||
|
NoTrendNoSeasonality::NoTrendNoSeasonality(vector<double> timeSeries, int countPointForecast) {
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
NoTrendNoSeasonality::~NoTrendNoSeasonality() {
|
||||||
|
// îñâîáîæäàåòñÿ ïàìÿòü
|
||||||
|
std::vector<double> ().swap(S);
|
||||||
|
std::vector<double> ().swap(x);
|
||||||
|
std::vector<double> ().swap(forecast);
|
||||||
|
}
|
||||||
|
|
||||||
|
// èíèöèàëèçàöèÿ ìîäåëè, çàäàíèå ïåðâîíà÷àëüíûõ çíà÷åíèé
|
||||||
|
void NoTrendNoSeasonality::init() {
|
||||||
|
S.clear();
|
||||||
|
forecast.clear();
|
||||||
|
|
||||||
|
S.push_back(x[0]);
|
||||||
|
forecast.push_back(S[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä çàäàíèÿ ïàðàìåòðîâ
|
||||||
|
void NoTrendNoSeasonality::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void NoTrendNoSeasonality::createModel() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = x[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
S.push_back(S[t]+alpha * e); // óðîâåíü
|
||||||
|
forecast.push_back(S[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñôîðìèðîâàòü ìîäåëü
|
||||||
|
void NoTrendNoSeasonality::createModelForEstimation() {
|
||||||
|
this->init(); // èíèöèàëèçèðîâàòü ìîäåëü
|
||||||
|
double e = 0;
|
||||||
|
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1 + this->countPointForecast; t++) {
|
||||||
|
// ïîêà íå äîøëè äî êîíöà ðÿäà - ñãëàæèâàåì, èíà÷å ñòðîèì ïðîãíîç
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = xLearning[t]-forecast[t];
|
||||||
|
} else {
|
||||||
|
e = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
S.push_back(S[t]+alpha * e); // óðîâåíü
|
||||||
|
forecast.push_back(S[t+1]); // ïðîãíîç
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ ïðîãíîçà
|
||||||
|
vector<double> NoTrendNoSeasonality::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double NoTrendNoSeasonality::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(2, this->xEstimation, this->getForecast());
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* NoTrendNoSeasonality::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double al = 0.1; al < 1; al+= 0.01) {
|
||||||
|
this->setParam("alpha", al);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->alpha = al;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
||||||
|
|
30
project_template/NoTrendNoSeasonality.h
Normal file
30
project_template/NoTrendNoSeasonality.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#ifndef NOTRENDNOSEASONALITY_H
|
||||||
|
#define NOTRENDNOSEASONALITY_H
|
||||||
|
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "Param.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// êîíêðåòíàÿ ðåàëèçàöèÿ àáñòðàêòíîãî êëàññà Method
|
||||||
|
// ðåàëèçóåò ìåòîä ýêñïîíåíöèàëüíîãî ñãëàæèâàíèÿ áåç òðåíäà è ñåçîííîñòè
|
||||||
|
class NoTrendNoSeasonality : public Method {
|
||||||
|
public:
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
vector<double> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
|
||||||
|
NoTrendNoSeasonality(vector<double>, int);
|
||||||
|
~NoTrendNoSeasonality();
|
||||||
|
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double); // âèðòóàëüíûé ìåòîä çàäàíèÿ ïàðàìåòðîâ
|
||||||
|
double calcEstimation(Aic *); // âèðòóàëüíûé ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
vector<double> getS();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
57
project_template/Normalization.cpp
Normal file
57
project_template/Normalization.cpp
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
#include "Math.h"
|
||||||
|
#include "Normalization.h"
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
Normalization::Normalization() {
|
||||||
|
timeSeriaShiftValue = 0;
|
||||||
|
maxTimePoint = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Normalization::shift(vector<double> timeSeria){
|
||||||
|
double timeSeriaShiftValue = timeSeria[0];
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
if (timeSeria[i] < timeSeriaShiftValue && timeSeria[i] < 0){
|
||||||
|
timeSeriaShiftValue = timeSeria[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timeSeriaShiftValue < 0){
|
||||||
|
timeSeriaShiftValue = fabs(timeSeriaShiftValue);
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
timeSeria[i] += timeSeriaShiftValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return timeSeria;
|
||||||
|
}
|
||||||
|
vector<double> Normalization::deShift(vector<double> timeSeria){
|
||||||
|
|
||||||
|
if (timeSeriaShiftValue < 0){
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
timeSeria[i] -= timeSeriaShiftValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return timeSeria;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Normalization::normalizeTimeSeria(vector<double> timeSeria){
|
||||||
|
shift(timeSeria);
|
||||||
|
maxTimePoint = timeSeria[0];
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
if (timeSeria[i] > maxTimePoint)
|
||||||
|
maxTimePoint = timeSeria[i];
|
||||||
|
}
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
timeSeria[i] /= maxTimePoint;
|
||||||
|
}
|
||||||
|
return timeSeria;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Normalization::deNormalizeTimeSeria(vector<double> timeSeria){
|
||||||
|
//shift(timeSeria);
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
timeSeria[i] *= maxTimePoint;
|
||||||
|
}
|
||||||
|
timeSeria = deShift(timeSeria);
|
||||||
|
return timeSeria;
|
||||||
|
}
|
17
project_template/Normalization.h
Normal file
17
project_template/Normalization.h
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#ifndef NORMALIZATION_H
|
||||||
|
#define NORMALIZATION_H
|
||||||
|
#include "Method.h"
|
||||||
|
#include <vector>
|
||||||
|
using namespace std;
|
||||||
|
class Normalization {
|
||||||
|
private:
|
||||||
|
double timeSeriaShiftValue;
|
||||||
|
double maxTimePoint;
|
||||||
|
vector<double> shift(vector<double>); // ñäâèã âðåìåííîãî ðÿäà èç îòðèöàòåëüíîé îáëàñòè
|
||||||
|
vector<double> deShift(vector<double>); // ñäâèã âðåìåííîãî ðÿäà â îáðàòíóþ ñòîðîíó
|
||||||
|
public:
|
||||||
|
Normalization();
|
||||||
|
vector<double> normalizeTimeSeria(vector<double>); // íîðìàëèçàöèÿ âðåìåííîãî ðÿäà
|
||||||
|
vector<double> deNormalizeTimeSeria(vector<double>); // äåíîðìàëèçàöèÿ âðåìåííîãî ðÿäà
|
||||||
|
};
|
||||||
|
#endif
|
36
project_template/Param.cpp
Normal file
36
project_template/Param.cpp
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#include "StdAfx.h"
|
||||||
|
#include "Param.h"
|
||||||
|
#include "string.h"
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
|
||||||
|
Param::Param() {
|
||||||
|
alpha =0;
|
||||||
|
delta =0;
|
||||||
|
gamma =0;
|
||||||
|
phi =0;
|
||||||
|
countRulesIn =0;
|
||||||
|
countFuzzyParts =0;
|
||||||
|
sizeLabels =1;
|
||||||
|
lb1 = 0;
|
||||||
|
rb1 = 0;
|
||||||
|
lb2 = 0;
|
||||||
|
rb2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
string Param::toString() {
|
||||||
|
stringstream ss1;
|
||||||
|
ss1 << "alpha: " <<alpha <<
|
||||||
|
" delta " << delta <<
|
||||||
|
" gamma: " << gamma <<
|
||||||
|
" phi: " << phi <<
|
||||||
|
" countRulesIn: " << countRulesIn <<
|
||||||
|
" countFuzzyParts: " << countFuzzyParts <<
|
||||||
|
" sizeLabels: " << sizeLabels <<
|
||||||
|
" lb1: " << lb1 <<
|
||||||
|
" rb1: " << rb1 <<
|
||||||
|
" lb2: " << lb2 <<
|
||||||
|
" rb2: " << rb2;
|
||||||
|
return ss1.str();
|
||||||
|
|
||||||
|
}
|
24
project_template/Param.h
Normal file
24
project_template/Param.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#ifndef PARAM_H
|
||||||
|
#define PARAM_H
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class Param {
|
||||||
|
public:
|
||||||
|
double alpha;
|
||||||
|
double delta;
|
||||||
|
double gamma;
|
||||||
|
double phi;
|
||||||
|
int countRulesIn;
|
||||||
|
int countFuzzyParts;
|
||||||
|
double sizeLabels;
|
||||||
|
double lb1;
|
||||||
|
double rb1;
|
||||||
|
double lb2;
|
||||||
|
double rb2;
|
||||||
|
double estim;
|
||||||
|
Param();
|
||||||
|
string toString(void);
|
||||||
|
};
|
||||||
|
#endif
|
181
project_template/Preparator.cpp
Normal file
181
project_template/Preparator.cpp
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
#include "Preparator.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <math.h>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
int Preparator::sgn(double val){
|
||||||
|
if (val > 0)
|
||||||
|
return 1;
|
||||||
|
if (val == 0)
|
||||||
|
return 0;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
void Preparator::setLog(bool log){
|
||||||
|
IsLogarithm = log;
|
||||||
|
}
|
||||||
|
void Preparator::setBoxCox(bool boxcox){
|
||||||
|
IsBoxCox = boxcox;
|
||||||
|
}
|
||||||
|
void Preparator::setBoxCoxGamma(double gamma){
|
||||||
|
if (gamma > 0 && gamma < 1){
|
||||||
|
boxCoxGamma = gamma;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Preparator::boxcox(vector<double> timeSeria){
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
timeSeria[i] = (pow(timeSeria[i], boxCoxGamma) - 1) / boxCoxGamma;
|
||||||
|
}
|
||||||
|
return timeSeria;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Preparator::deboxcox(vector<double> timeSeria){
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
timeSeria[i] = sgn(boxCoxGamma * timeSeria[i] + 1) *
|
||||||
|
pow((abs(boxCoxGamma * timeSeria[i] + 1)), 1 / boxCoxGamma);
|
||||||
|
}
|
||||||
|
return timeSeria;
|
||||||
|
}
|
||||||
|
|
||||||
|
Preparator::Preparator(bool _IsLogarithm, bool _IsBoxCox){
|
||||||
|
IsBoxCox = _IsBoxCox;
|
||||||
|
IsLogarithm = _IsLogarithm;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vector<double> Preparator::logarithm(vector<double> timeSeria){
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
timeSeria[i] = log(timeSeria[i]);
|
||||||
|
}
|
||||||
|
return timeSeria;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Preparator::delogarithm(vector<double> timeSeria){
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
timeSeria[i] = exp(timeSeria[i]);
|
||||||
|
}
|
||||||
|
return timeSeria;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Preparator::shift(vector<double> timeSeria){
|
||||||
|
double timeSeriaShiftValue = timeSeria[0];
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
if (timeSeria[i] < timeSeriaShiftValue && timeSeria[i] < 0){
|
||||||
|
timeSeriaShiftValue = timeSeria[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timeSeriaShiftValue < 0){
|
||||||
|
timeSeriaShiftValue = fabs(timeSeriaShiftValue);
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
timeSeria[i] += timeSeriaShiftValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return timeSeria;
|
||||||
|
}
|
||||||
|
vector<double> Preparator::deShift(vector<double> timeSeria){
|
||||||
|
|
||||||
|
if (timeSeriaShiftValue < 0){
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
timeSeria[i] -= timeSeriaShiftValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return timeSeria;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Preparator::normalizeTimeSeria(vector<double> timeSeria){
|
||||||
|
timeSeria = shift(timeSeria);
|
||||||
|
if (IsLogarithm)
|
||||||
|
timeSeria = logarithm(timeSeria);
|
||||||
|
if (IsBoxCox)
|
||||||
|
timeSeria = boxcox(timeSeria);
|
||||||
|
maxTimePoint = timeSeria[0];
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
if (timeSeria[i] > maxTimePoint)
|
||||||
|
maxTimePoint = timeSeria[i];
|
||||||
|
}
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
timeSeria[i] /= maxTimePoint;
|
||||||
|
}
|
||||||
|
return timeSeria;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Preparator::deNormalizeTimeSeria(vector<double> timeSeria){
|
||||||
|
//shift(timeSeria);
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
timeSeria[i] *= maxTimePoint;
|
||||||
|
}
|
||||||
|
if (IsLogarithm)
|
||||||
|
timeSeria = delogarithm(timeSeria);
|
||||||
|
if (IsBoxCox)
|
||||||
|
timeSeria = deboxcox(timeSeria);
|
||||||
|
deShift(timeSeria);
|
||||||
|
return timeSeria;
|
||||||
|
}
|
||||||
|
//bool Preparator::TestCommon(vector<double> timeSeria, vector<double>(*direct)(vector<double>),
|
||||||
|
// vector<double>(*inverse)(vector<double>)){
|
||||||
|
// vector<double> initTimeSeria = timeSeria;
|
||||||
|
// timeSeria = direct(inverse(timeSeria));
|
||||||
|
// double res = 0;
|
||||||
|
// for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
// res += initTimeSeria[i] - timeSeria[i];
|
||||||
|
// }
|
||||||
|
// return res == 0;
|
||||||
|
//}
|
||||||
|
double Preparator::TestPreparator(vector<double> timeSeria){
|
||||||
|
double resLog = TestLogarithm(timeSeria);
|
||||||
|
cout << "log func works with " << resLog << " error" << endl;
|
||||||
|
double resBoxCox = TestBoxCox(timeSeria);
|
||||||
|
cout << "BoxCox func works with " << resBoxCox << " error" << endl;
|
||||||
|
double resShift = TestShift(timeSeria);
|
||||||
|
cout << "Shift func works with " << resShift << " error" << endl;
|
||||||
|
double resNormalize = TestNormalize(timeSeria);
|
||||||
|
cout << "Normalize func works with " << resShift << " error" << endl;
|
||||||
|
return resNormalize + resLog + resBoxCox + resShift;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Preparator::TestLogarithm(vector<double> timeSeria){
|
||||||
|
vector<double> initTimeSeria = timeSeria;
|
||||||
|
timeSeria = delogarithm(logarithm(timeSeria));
|
||||||
|
double res = 0;
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
res += initTimeSeria[i] - timeSeria[i];
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Preparator::TestBoxCox(vector<double> timeSeria){
|
||||||
|
vector<double> initTimeSeria = timeSeria;
|
||||||
|
timeSeria = deboxcox(boxcox(timeSeria));
|
||||||
|
double res = 0;
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
res += initTimeSeria[i] - timeSeria[i];
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Preparator::TestShift(vector<double> timeSeria){
|
||||||
|
vector<double> initTimeSeria = timeSeria;
|
||||||
|
timeSeria = deboxcox(boxcox(timeSeria));
|
||||||
|
double res = 0;
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
res += initTimeSeria[i] - timeSeria[i];
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Preparator::TestNormalize(vector<double> timeSeria){
|
||||||
|
timeSeriaShiftValue = 0;
|
||||||
|
maxTimePoint = 0;
|
||||||
|
IsLogarithm = false;
|
||||||
|
IsBoxCox = false;
|
||||||
|
boxCoxGamma = 0.5;
|
||||||
|
vector<double> initTimeSeria = timeSeria;
|
||||||
|
timeSeria = deboxcox(boxcox(timeSeria));
|
||||||
|
double res = 0;
|
||||||
|
for (int i = 0; i < timeSeria.size(); i++){
|
||||||
|
res += initTimeSeria[i] - timeSeria[i];
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
35
project_template/Preparator.h
Normal file
35
project_template/Preparator.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#ifndef PREPARATOR_H
|
||||||
|
#define PREPARATOR_H
|
||||||
|
#include "Method.h"
|
||||||
|
#include <vector>
|
||||||
|
using namespace std;
|
||||||
|
class Preparator {
|
||||||
|
private:
|
||||||
|
/*bool TestCommon(vector<double> timeSeria, vector<double>(*)(vector<double>),
|
||||||
|
vector<double>(*)(vector<double>)){}*/
|
||||||
|
double timeSeriaShiftValue;
|
||||||
|
double maxTimePoint;
|
||||||
|
bool IsLogarithm;
|
||||||
|
bool IsBoxCox;
|
||||||
|
double boxCoxGamma;
|
||||||
|
int sgn(double);
|
||||||
|
vector<double> logarithm(vector<double>); //ëîăîđčôěčđîâŕíčĺ ÂĐ
|
||||||
|
vector<double> delogarithm(vector<double>);
|
||||||
|
vector<double> boxcox(vector<double>); // áîęń-ęîęń ďđĺáđŕçîâŕíčĺ ÂĐ
|
||||||
|
vector<double> deboxcox(vector<double>);
|
||||||
|
vector<double> shift(vector<double>); // ńäâčă âđĺěĺííîăî đ˙äŕ čç îňđčöŕňĺëüíîé îáëŕńňč
|
||||||
|
vector<double> deShift(vector<double>); // ńäâčă âđĺěĺííîăî đ˙äŕ â îáđŕňíóţ ńňîđîíó
|
||||||
|
public:
|
||||||
|
double TestPreparator(vector<double> timeSeria);
|
||||||
|
double TestLogarithm(vector<double> timeSeria);
|
||||||
|
double TestBoxCox(vector<double> timeSeria);
|
||||||
|
double TestShift(vector<double> timeSeria);
|
||||||
|
double TestNormalize(vector<double>);
|
||||||
|
Preparator(bool IsLogarithm, bool IsBoxCox);
|
||||||
|
void setBoxCoxGamma(double gamma);
|
||||||
|
void setLog(bool log);
|
||||||
|
void setBoxCox(bool boxcox);
|
||||||
|
vector<double> normalizeTimeSeria(vector<double> timeSeria); // íîđěŕëčçŕöč˙ âđĺěĺííîăî đ˙äŕ
|
||||||
|
vector<double> deNormalizeTimeSeria(vector<double> timeSeria); // äĺíîđěŕëčçŕöč˙ âđĺěĺííîăî đ˙äŕ
|
||||||
|
};
|
||||||
|
#endif
|
29
project_template/RMSE.cpp
Normal file
29
project_template/RMSE.cpp
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#include "StdAfx.h"
|
||||||
|
#include "RMSE.h"
|
||||||
|
#include <vector>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
|
||||||
|
Rmse::Rmse() {
|
||||||
|
}
|
||||||
|
|
||||||
|
Rmse::~Rmse() {
|
||||||
|
}
|
||||||
|
|
||||||
|
double Rmse::getValue(int paramCount, vector<double> original, vector<double> model) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
double Rmse::getValue(vector<double> original, vector<double> model) {
|
||||||
|
|
||||||
|
double valueRMSE = 0;
|
||||||
|
int sampleSize = original.size();
|
||||||
|
|
||||||
|
for (int i = 0; i < sampleSize; i++) {
|
||||||
|
valueRMSE += pow(original[i] - model[i], 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
valueRMSE = sqrt(valueRMSE / sampleSize);
|
||||||
|
|
||||||
|
return valueRMSE;
|
||||||
|
|
||||||
|
}
|
14
project_template/RMSE.h
Normal file
14
project_template/RMSE.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#ifndef RMSE_H
|
||||||
|
#define RMSE_H
|
||||||
|
#include "Estimation.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class Rmse : public Estimation {
|
||||||
|
public:
|
||||||
|
Rmse();
|
||||||
|
~Rmse();
|
||||||
|
double getValue(vector<double>, vector<double>);
|
||||||
|
double getValue(int, vector<double>, vector<double>);
|
||||||
|
};
|
||||||
|
#endif
|
33
project_template/ReadMe.txt
Normal file
33
project_template/ReadMe.txt
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
========================================================================
|
||||||
|
CONSOLE APPLICATION : project_template Project Overview
|
||||||
|
========================================================================
|
||||||
|
|
||||||
|
AppWizard has created this project_template application for you.
|
||||||
|
|
||||||
|
This file contains a summary of what you will find in each of the files that
|
||||||
|
make up your project_template application.
|
||||||
|
|
||||||
|
|
||||||
|
project_template.vcproj
|
||||||
|
This is the main project file for VC++ projects generated using an Application Wizard.
|
||||||
|
It contains information about the version of Visual C++ that generated the file, and
|
||||||
|
information about the platforms, configurations, and project features selected with the
|
||||||
|
Application Wizard.
|
||||||
|
|
||||||
|
project_template.cpp
|
||||||
|
This is the main application source file.
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
Other standard files:
|
||||||
|
|
||||||
|
StdAfx.h, StdAfx.cpp
|
||||||
|
These files are used to build a precompiled header (PCH) file
|
||||||
|
named project_template.pch and a precompiled types file named StdAfx.obj.
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
Other notes:
|
||||||
|
|
||||||
|
AppWizard uses "TODO:" comments to indicate parts of the source code you
|
||||||
|
should add to or customize.
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
35
project_template/SMape.cpp
Normal file
35
project_template/SMape.cpp
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#include "StdAfx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "SMape.h"
|
||||||
|
#include "Math.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
// êðèòåðèé SMape. Íàñëåäóåòñÿ îò êëàññà Estimation.
|
||||||
|
// ðåàëèçóåò ìåòîä "ïîëó÷èòü çíà÷åíèå êðèòåðèÿ"
|
||||||
|
|
||||||
|
SMape::SMape() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
SMape::~SMape() {
|
||||||
|
}
|
||||||
|
|
||||||
|
double SMape::getValue(int countParams, vector<double> original, vector<double> model) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
double SMape::getValue(vector<double> original, vector<double> model) {
|
||||||
|
double smape = 0;
|
||||||
|
for (int i = 0; i < original.size(); i++) {
|
||||||
|
/*double a = original[i] - model[i];
|
||||||
|
double b = (original[i] + model[i]) / 2;
|
||||||
|
double c = fabs(a);
|
||||||
|
double d = fabs(b);*/
|
||||||
|
smape += (fabs((double)original[i] - model[i])) /
|
||||||
|
(((fabs((double)(original[i])) + fabs((double)model[i]))) / 2);
|
||||||
|
}
|
||||||
|
smape = smape / original.size();
|
||||||
|
smape = smape * 100;
|
||||||
|
|
||||||
|
return smape;
|
||||||
|
}
|
15
project_template/SMape.h
Normal file
15
project_template/SMape.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#ifndef SMAPE_H
|
||||||
|
#define SMAPE_H
|
||||||
|
#include "Estimation.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
// êðèòåðèé SMape. Íàñëåäóåòñÿ îò êëàññà Estimation.
|
||||||
|
// ðåàëèçóåò ìåòîä "ïîëó÷èòü çíà÷åíèå êðèòåðèÿ"
|
||||||
|
class SMape :public Estimation {
|
||||||
|
public:
|
||||||
|
SMape();
|
||||||
|
~SMape();
|
||||||
|
double getValue(int, vector<double>, vector<double>);
|
||||||
|
double getValue(vector<double>, vector<double>);
|
||||||
|
};
|
||||||
|
#endif
|
88
project_template/TrackingControlSignal.h
Normal file
88
project_template/TrackingControlSignal.h
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
#ifndef TCS_H
|
||||||
|
#define TCS_H
|
||||||
|
|
||||||
|
#include "math.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class TrackingControlSignal {
|
||||||
|
|
||||||
|
private:
|
||||||
|
map<double, double> Quant;
|
||||||
|
|
||||||
|
double AlphaQuant(double alpha){
|
||||||
|
return alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Eps;
|
||||||
|
double Eps1;
|
||||||
|
double Eps2;
|
||||||
|
double alpha; // 0~1
|
||||||
|
double gamma; //0.05 ~ 0.1
|
||||||
|
bool estimateTCS(double TCS){
|
||||||
|
return ((-1.2 * AlphaQuant(alpha / 2) * sqrt(gamma / (2 - gamma)) < TCS) &&
|
||||||
|
(1.2 * AlphaQuant(1 - alpha / 2) * sqrt(gamma / (2 - gamma)) > TCS));
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
TrackingControlSignal::TrackingControlSignal(){
|
||||||
|
|
||||||
|
}
|
||||||
|
bool TrackingControlSignal::calcTCS(double realData, double forecastedData){
|
||||||
|
//calcEps
|
||||||
|
Eps = realData - forecastedData;
|
||||||
|
//eps^ n eps~
|
||||||
|
Eps1 = gamma * Eps + (1 - gamma) * Eps1;
|
||||||
|
Eps2 = gamma * fabs(Eps) + (1 - gamma) * Eps2;
|
||||||
|
return estimateTCS(Eps1 / Eps2);
|
||||||
|
}
|
||||||
|
vector<bool> TrackingControlSignal::HistoricalExpertControl(Method** values, double tsdiffval, int expertsCount){
|
||||||
|
//init
|
||||||
|
double diff = 0.0;
|
||||||
|
vector<bool> res;
|
||||||
|
vector<double> diffs;
|
||||||
|
int activeExperts = expertsCount;
|
||||||
|
for (int i = 0; i < expertsCount; i++){
|
||||||
|
res.push_back(true);
|
||||||
|
diffs.push_back(0.0);
|
||||||
|
}
|
||||||
|
int indMaxDiff = 0;
|
||||||
|
bool isExcluded = true;
|
||||||
|
//main algo
|
||||||
|
while (isExcluded){
|
||||||
|
//set exit flag
|
||||||
|
isExcluded = false;
|
||||||
|
//calc diffs between experts
|
||||||
|
for (int i = 0; i < expertsCount; i++){
|
||||||
|
for (int j = 0; j < expertsCount; j++){
|
||||||
|
if ((i != j) && res[i] && res[j]){
|
||||||
|
diffs[j] += fabs(values[j]->value - values[i]->value);
|
||||||
|
if (diffs[j] > diffs[indMaxDiff]){
|
||||||
|
indMaxDiff = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//check max diff on trashhold
|
||||||
|
if ((diffs[indMaxDiff] / activeExperts - 1) > tsdiffval){
|
||||||
|
res[indMaxDiff] = false;
|
||||||
|
isExcluded = true;
|
||||||
|
activeExperts--;
|
||||||
|
for (int i = 0; i < expertsCount; i++){
|
||||||
|
diffs[i] = 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (activeExperts - 1 == 0){
|
||||||
|
cout << "Something went wrong, all experts exept one was filltered." << endl;
|
||||||
|
cout << "Hight probability that last expert wasn't correct!" << endl;
|
||||||
|
cout << "See logs" << endl;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
#endif
|
559
project_template/Transformation.cpp
Normal file
559
project_template/Transformation.cpp
Normal file
@ -0,0 +1,559 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
#include "Transformation.h"
|
||||||
|
#include "Median.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <iostream>
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
Transformation::Transformation(vector <double> ts)
|
||||||
|
{
|
||||||
|
setTimeSeries(ts);
|
||||||
|
INFINITY = std::numeric_limits<double>::infinity();
|
||||||
|
}
|
||||||
|
|
||||||
|
Transformation::~Transformation()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void Transformation::setTimeSeries(vector<double> ts){
|
||||||
|
|
||||||
|
TimeSeries = ts;
|
||||||
|
tsSizeValue = ts.size();
|
||||||
|
|
||||||
|
tsShiftValue = 0;
|
||||||
|
GeometricAverage = 1;
|
||||||
|
valueMean = 0;
|
||||||
|
|
||||||
|
double min = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
if ((TimeSeries[i] < 0) && (TimeSeries[i] < min))
|
||||||
|
{
|
||||||
|
min = TimeSeries[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
GeometricAverage = GeometricAverage * TimeSeries[i];
|
||||||
|
|
||||||
|
valueMean += TimeSeries[i];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (min != 0)
|
||||||
|
{
|
||||||
|
tsShiftValue = abs(min) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tsSizeValue != 0)
|
||||||
|
{
|
||||||
|
GeometricAverage = pow(GeometricAverage, 1 / tsSizeValue);
|
||||||
|
valueMean /= tsSizeValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int Transformation::sign(double value)
|
||||||
|
{
|
||||||
|
if (value >= 0)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double Transformation::lambdaEstimationGuerrero(double param){
|
||||||
|
|
||||||
|
double result;
|
||||||
|
|
||||||
|
int begin; // iterator
|
||||||
|
int end; // iterator
|
||||||
|
double sumRow; // sum row matrix
|
||||||
|
double sumSd; // sum for estimation standard deviation
|
||||||
|
double meanRat;
|
||||||
|
int lengthPeriod = 2;
|
||||||
|
|
||||||
|
if (seasonalPeriod > lengthPeriod)
|
||||||
|
{
|
||||||
|
lengthPeriod = seasonalPeriod;
|
||||||
|
}
|
||||||
|
|
||||||
|
int amtlengthPeriod = floor((double)tsSizeValue / lengthPeriod);
|
||||||
|
int shift = tsSizeValue - floor((double)amtlengthPeriod * lengthPeriod);
|
||||||
|
|
||||||
|
vector <double> mean(amtlengthPeriod); // mean row matrix
|
||||||
|
vector <double> sd(amtlengthPeriod); // standard deviation
|
||||||
|
vector <double> rat(amtlengthPeriod);
|
||||||
|
|
||||||
|
for (int i = 0; i < amtlengthPeriod; i++)
|
||||||
|
{
|
||||||
|
begin = shift + i * lengthPeriod;
|
||||||
|
end = begin + lengthPeriod;
|
||||||
|
|
||||||
|
sumRow = 0;
|
||||||
|
|
||||||
|
for (int row = begin; row < end; row++)
|
||||||
|
{
|
||||||
|
sumRow += TimeSeries[row];
|
||||||
|
}
|
||||||
|
|
||||||
|
mean[i] = sumRow / lengthPeriod;
|
||||||
|
|
||||||
|
sumSd = 0;
|
||||||
|
|
||||||
|
for (int row = begin; row < end; row++)
|
||||||
|
{
|
||||||
|
sumSd += pow(TimeSeries[row] - mean[i], 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
sd[i] = sqrt(sumSd / (lengthPeriod - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < amtlengthPeriod; i++)
|
||||||
|
{
|
||||||
|
rat[i] = sd[i] / (pow(mean[i], 1 - param));
|
||||||
|
}
|
||||||
|
|
||||||
|
meanRat = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < amtlengthPeriod; i++)
|
||||||
|
{
|
||||||
|
meanRat += rat[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
meanRat /= amtlengthPeriod;
|
||||||
|
|
||||||
|
sumSd = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < amtlengthPeriod; i++)
|
||||||
|
{
|
||||||
|
sumSd += pow(rat[i] - meanRat, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
result = sqrt(sumSd / (amtlengthPeriod - 1)) / meanRat;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Transformation::lambdaEstimation(){
|
||||||
|
|
||||||
|
double cv = INFINITY; //cv - coefficient of variation
|
||||||
|
|
||||||
|
for (double i = -1; i <= 2; i += 0.01)
|
||||||
|
{
|
||||||
|
//double i = 0.7;
|
||||||
|
double result = lambdaEstimationGuerrero(i);
|
||||||
|
if (result < cv)
|
||||||
|
{
|
||||||
|
cv = result;
|
||||||
|
lambda = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vector<double> Transformation::BoxCox(){
|
||||||
|
|
||||||
|
vector <double> tsTransformation(tsSizeValue);
|
||||||
|
|
||||||
|
if (lambda == 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = log(TimeSeries[i] + tsShiftValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < TimeSeries.size(); i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = (pow(TimeSeries[i] + tsShiftValue, lambda) - 1) / lambda;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsTransformation;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Transformation::invBoxCox(){
|
||||||
|
|
||||||
|
vector <double> tsTransformation(tsSizeValue);
|
||||||
|
|
||||||
|
if (lambda == 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = exp(TimeSeries[i]) - tsShiftValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < TimeSeries.size(); i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = pow((lambda * TimeSeries[i] + 1), 1 / lambda) - tsShiftValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsTransformation;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vector<double> Transformation::ExponentialTransformation(){
|
||||||
|
|
||||||
|
vector <double> tsTransformation(tsSizeValue);
|
||||||
|
|
||||||
|
if (lambda != 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = (exp(TimeSeries[i] * lambda) - 1) / lambda;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsTransformation;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Transformation::invExponentialTransformation(){
|
||||||
|
|
||||||
|
vector <double> tsTransformation(tsSizeValue);
|
||||||
|
|
||||||
|
if (lambda != 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = log(1 + TimeSeries[i] * lambda) / lambda;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsTransformation;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vector<double> Transformation::ModulusTransformation(){
|
||||||
|
|
||||||
|
vector <double> tsTransformation(tsSizeValue);
|
||||||
|
|
||||||
|
if (lambda == 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = sign(TimeSeries[i]) * log(abs(TimeSeries[i]) + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = sign(TimeSeries[i]) * (pow(abs(TimeSeries[i]) + 1, lambda) - 1) / lambda;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsTransformation;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Transformation::invModulusTransformation(){
|
||||||
|
|
||||||
|
vector <double> tsTransformation(tsSizeValue);
|
||||||
|
|
||||||
|
if (lambda == 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = sign(TimeSeries[i]) * (exp(abs(TimeSeries[i])) - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = pow(TimeSeries[i] * lambda / sign(TimeSeries[i]) + 1, 1 / lambda) - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsTransformation;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vector<double> Transformation::AsymptoticBoxCox(){
|
||||||
|
|
||||||
|
vector <double> tsTransformation(tsSizeValue);
|
||||||
|
|
||||||
|
if (lambda > 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = (sign(TimeSeries[i]) * pow(abs(TimeSeries[i]), lambda) - 1) / lambda;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsTransformation;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Transformation::invAsymptoticBoxCox(){
|
||||||
|
|
||||||
|
vector <double> tsTransformation(tsSizeValue);
|
||||||
|
|
||||||
|
if (lambda > 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = pow((TimeSeries[i] * lambda - 1) / sign(TimeSeries[i]), 1 / lambda);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsTransformation;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vector<double> Transformation::ModifiedBoxCox(){
|
||||||
|
|
||||||
|
vector <double> tsTransformation(tsSizeValue);
|
||||||
|
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
if ((TimeSeries[i] >= 0) && (lambda != 0))
|
||||||
|
{
|
||||||
|
tsTransformation[i] = (pow(TimeSeries[i] + 1, lambda) - 1) / lambda;
|
||||||
|
}
|
||||||
|
else if ((TimeSeries[i] >= 0) && (lambda == 0))
|
||||||
|
{
|
||||||
|
tsTransformation[i] = log(TimeSeries[i] + 1);
|
||||||
|
}
|
||||||
|
else if ((TimeSeries[i] < 0) && (lambda != 0))
|
||||||
|
{
|
||||||
|
tsTransformation[i] = -(pow(-TimeSeries[i] + 1, 2 - lambda) - 1) / (2 - lambda);
|
||||||
|
}
|
||||||
|
else if ((TimeSeries[i] < 0) && (lambda == 0))
|
||||||
|
{
|
||||||
|
tsTransformation[i] = -log(-TimeSeries[i] + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsTransformation;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Transformation::invModifiedBoxCox(){
|
||||||
|
|
||||||
|
vector <double> tsTransformation(tsSizeValue);
|
||||||
|
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
if ((TimeSeries[i] >= 0) && (lambda != 0))
|
||||||
|
{
|
||||||
|
tsTransformation[i] = pow(TimeSeries[i] * lambda + 1, 1 / lambda) - 1;
|
||||||
|
}
|
||||||
|
else if ((TimeSeries[i] >= 0) && (lambda == 0))
|
||||||
|
{
|
||||||
|
tsTransformation[i] = exp(TimeSeries[i]) - 1;
|
||||||
|
}
|
||||||
|
else if ((TimeSeries[i] < 0) && (lambda != 2))
|
||||||
|
{
|
||||||
|
tsTransformation[i] = -(pow(-(TimeSeries[i] * (2 - lambda) - 1), 1 / (2 - lambda)) - 1);
|
||||||
|
}
|
||||||
|
else if ((TimeSeries[i] < 0) && (lambda == 2))
|
||||||
|
{
|
||||||
|
tsTransformation[i] = -exp(-TimeSeries[i]) + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsTransformation;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vector<double> Transformation::NormalizedBoxCox(){
|
||||||
|
|
||||||
|
vector <double> tsTransformation(tsSizeValue);
|
||||||
|
|
||||||
|
if (lambda == 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = GeometricAverage * log(TimeSeries[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = (pow(TimeSeries[i], lambda) - 1) / (lambda * pow(GeometricAverage, lambda - 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsTransformation;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Transformation::invNormalizedBoxCox(){
|
||||||
|
|
||||||
|
vector <double> tsTransformation(tsSizeValue);
|
||||||
|
|
||||||
|
if (lambda == 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = exp(TimeSeries[i] / GeometricAverage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsTransformation[i] = pow(TimeSeries[i] * lambda * pow(GeometricAverage, lambda - 1) + 1, 1 / lambda);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsTransformation;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vector<double> Transformation::Deseasonalization(int seasonalPeriod){
|
||||||
|
|
||||||
|
vector <double> tsDeseasonalization(tsSizeValue);
|
||||||
|
SeasonalIndex.resize(seasonalPeriod - 1);
|
||||||
|
|
||||||
|
int tsShift = 0;
|
||||||
|
int amtSeasonalPeriod = tsSizeValue / seasonalPeriod;
|
||||||
|
|
||||||
|
if (tsSizeValue % seasonalPeriod != 0)
|
||||||
|
{
|
||||||
|
tsShift = tsSizeValue - amtSeasonalPeriod * seasonalPeriod;
|
||||||
|
}
|
||||||
|
|
||||||
|
// считаем средние сезоанальные индексы
|
||||||
|
Median *est = new Median();
|
||||||
|
SeasonalIndex = est->getValue(TimeSeries, seasonalPeriod);
|
||||||
|
|
||||||
|
// получаем итог
|
||||||
|
for (int i = 0; i < amtSeasonalPeriod; i++)
|
||||||
|
{
|
||||||
|
int begin = tsShift + i * seasonalPeriod;
|
||||||
|
int end = begin + seasonalPeriod;
|
||||||
|
|
||||||
|
for (int ii = begin; ii < end; ii++)
|
||||||
|
{
|
||||||
|
tsDeseasonalization[ii] = TimeSeries[ii] / SeasonalIndex[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsDeseasonalization;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Transformation::invDeseasonalization(){
|
||||||
|
|
||||||
|
vector <double> tsDeseasonalization(tsSizeValue);
|
||||||
|
|
||||||
|
int tsShift = 0;
|
||||||
|
int amtSeasonalPeriod = tsSizeValue / seasonalPeriod;
|
||||||
|
|
||||||
|
if (tsSizeValue % seasonalPeriod != 0)
|
||||||
|
{
|
||||||
|
tsShift = tsSizeValue - amtSeasonalPeriod * seasonalPeriod - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < amtSeasonalPeriod; i++)
|
||||||
|
{
|
||||||
|
int begin = tsShift + i * seasonalPeriod;
|
||||||
|
int end = begin + seasonalPeriod;
|
||||||
|
|
||||||
|
for (int ii = begin; ii < end; ii++)
|
||||||
|
{
|
||||||
|
tsDeseasonalization[ii] = TimeSeries[ii] * SeasonalIndex[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsDeseasonalization;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Transformation::getSeasonalIndex(){
|
||||||
|
|
||||||
|
return SeasonalIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vector <double> Transformation::Aggregation(int seasonalPeriod){
|
||||||
|
|
||||||
|
int tsShift = 0;
|
||||||
|
int amtSeasonalPeriod = tsSizeValue / seasonalPeriod;
|
||||||
|
|
||||||
|
vector <double> tsAggregation(amtSeasonalPeriod);
|
||||||
|
|
||||||
|
if (tsSizeValue % seasonalPeriod != 0)
|
||||||
|
{
|
||||||
|
tsShift = tsSizeValue - amtSeasonalPeriod * seasonalPeriod;
|
||||||
|
}
|
||||||
|
|
||||||
|
// получаем итог
|
||||||
|
for (int i = 0; i < amtSeasonalPeriod; i++)
|
||||||
|
{
|
||||||
|
int begin = tsShift + i * seasonalPeriod;
|
||||||
|
int end = begin + seasonalPeriod;
|
||||||
|
|
||||||
|
for (int ii = begin; ii < end; ii++)
|
||||||
|
{
|
||||||
|
tsAggregation[i] += TimeSeries[ii];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsAggregation;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
vector <double> Transformation::invAggregation(){
|
||||||
|
|
||||||
|
int sumSeasonalPeriod = tsSizeValue * seasonalPeriod;
|
||||||
|
|
||||||
|
vector <double> tsDeaggregation(sumSeasonalPeriod);
|
||||||
|
|
||||||
|
// получаем итог
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
int begin = i * seasonalPeriod;
|
||||||
|
int end = begin + seasonalPeriod;
|
||||||
|
|
||||||
|
for (int ii = begin; ii < end; ii++)
|
||||||
|
{
|
||||||
|
tsDeaggregation[ii] = TimeSeries[i] / seasonalPeriod;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsDeaggregation;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vector<double> Transformation::Normalization(){
|
||||||
|
|
||||||
|
vector <double> tsNormalization(tsSizeValue);
|
||||||
|
|
||||||
|
valueSd = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
valueSd += pow(TimeSeries[i] - valueMean, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
valueSd = sqrt(valueSd / (tsSizeValue - 1));
|
||||||
|
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsNormalization[i] = (TimeSeries[i] - valueMean) / valueSd;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsNormalization;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
vector <double> Transformation::invNormalization()
|
||||||
|
{
|
||||||
|
|
||||||
|
vector <double> tsNormalization(tsSizeValue);
|
||||||
|
|
||||||
|
for (int i = 0; i < tsSizeValue; i++)
|
||||||
|
{
|
||||||
|
tsNormalization[i] = TimeSeries[i] * valueSd + valueMean;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tsNormalization;
|
||||||
|
|
||||||
|
}
|
96
project_template/Transformation.h
Normal file
96
project_template/Transformation.h
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
#ifndef TRANSFORMATION_H
|
||||||
|
#define TRANSFORMATION_H
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class Transformation
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
vector <double> SeasonalIndex;
|
||||||
|
double GeometricAverage;
|
||||||
|
double valueMean;
|
||||||
|
double valueSd;
|
||||||
|
int tsSizeValue;
|
||||||
|
|
||||||
|
public:
|
||||||
|
vector <double> TimeSeries;
|
||||||
|
double INFINITY;
|
||||||
|
Transformation(vector<double>);
|
||||||
|
~Transformation();
|
||||||
|
|
||||||
|
// период сезонности для использования в Deseasonalization
|
||||||
|
int seasonalPeriod;
|
||||||
|
|
||||||
|
// параметр трансформации
|
||||||
|
double lambda;
|
||||||
|
// параметр сдвига значений вектора при наличии в нем отрицательных значений
|
||||||
|
double tsShiftValue;
|
||||||
|
|
||||||
|
// обрабатываемый временной ряд
|
||||||
|
void setTimeSeries(vector<double>);
|
||||||
|
|
||||||
|
int sign(double);
|
||||||
|
// auto lambda estimation
|
||||||
|
void lambdaEstimation();
|
||||||
|
|
||||||
|
//Guerrero(1993)
|
||||||
|
//Time-series analysis supported by Power Transformations
|
||||||
|
double lambdaEstimationGuerrero(double);
|
||||||
|
|
||||||
|
//Box-Cox(1964)
|
||||||
|
vector<double> BoxCox();
|
||||||
|
vector<double> invBoxCox();
|
||||||
|
|
||||||
|
//Manly(1976)
|
||||||
|
// -- Negative y’s could be allowed
|
||||||
|
// -- The transformation was reported to be successful in transform
|
||||||
|
// unimodal skewed distribution into normal distribution, but is
|
||||||
|
// not quite useful for bimodal or U - shaped distribution
|
||||||
|
vector<double> ExponentialTransformation();
|
||||||
|
vector<double> invExponentialTransformation();
|
||||||
|
|
||||||
|
//John and Draper(1980)
|
||||||
|
// -- Negative y’s could be allowed.
|
||||||
|
// -- It works best at those distribution that is somewhat symmetric.
|
||||||
|
// A power transformation on a symmetric distribution is likel
|
||||||
|
// y going to introduce some degree of skewness.
|
||||||
|
vector<double> ModulusTransformation();
|
||||||
|
vector<double> invModulusTransformation();
|
||||||
|
|
||||||
|
//Bickel and Doksum(1981)
|
||||||
|
// --Negative y’s could be allowed.
|
||||||
|
vector<double> AsymptoticBoxCox();
|
||||||
|
vector<double> invAsymptoticBoxCox();
|
||||||
|
|
||||||
|
//Yeo and Johnson (2000)
|
||||||
|
// --Negative y’s could be allowed.
|
||||||
|
// --When estimating the transformation parameter, found the value of
|
||||||
|
// λ that minimizes the Kullback - Leibler distance between
|
||||||
|
// the normal distribution and the transformed distribution.
|
||||||
|
vector<double> ModifiedBoxCox();
|
||||||
|
vector<double> invModifiedBoxCox();
|
||||||
|
|
||||||
|
// Atkinson(1973)
|
||||||
|
// --Negative y’s could be allowed.
|
||||||
|
vector<double> NormalizedBoxCox();
|
||||||
|
vector<double> invNormalizedBoxCox();
|
||||||
|
|
||||||
|
// очистка вектора TimeSeries от сезонности
|
||||||
|
vector<double> Deseasonalization(int);
|
||||||
|
vector<double> invDeseasonalization();
|
||||||
|
|
||||||
|
// получение средних сезоональных индексов
|
||||||
|
vector<double> getSeasonalIndex();
|
||||||
|
|
||||||
|
// Aggregation time series
|
||||||
|
vector <double> Aggregation(int);
|
||||||
|
vector <double> invAggregation();
|
||||||
|
|
||||||
|
// Normalization time series: mean = 0, Sd (Standard deviation) = 1
|
||||||
|
vector <double> Normalization();
|
||||||
|
vector <double> invNormalization();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
271
project_template/Tsaur.cpp
Normal file
271
project_template/Tsaur.cpp
Normal file
@ -0,0 +1,271 @@
|
|||||||
|
#include "StdAfx.h"
|
||||||
|
#include "Tsaur.h"
|
||||||
|
#include "Param.h"
|
||||||
|
#include "float.h"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
|
Tsaur::Tsaur(vector<double> timeSeries, int countPointForecast){
|
||||||
|
this->countPointForecast = countPointForecast;
|
||||||
|
this->trendType = trendType;
|
||||||
|
this->seasonType = seasonType;
|
||||||
|
this->x = timeSeries;
|
||||||
|
this->partition();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Tsaur::init() {
|
||||||
|
S.clear();
|
||||||
|
T.clear();
|
||||||
|
T.push_back(fuzzyfication(x[1]-x[0]));
|
||||||
|
S.push_back(fuzzyfication(x[0]));
|
||||||
|
fuzzyForecast.push_back(plusSet(S[0], T[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïðåäåëèòü óíèâåðñóì äëÿ âðåìåííîãî ðÿäà
|
||||||
|
// èùåì ìàêñèìóì, ìèíèìóì, ïðîèçâîäèì ðàçáèåíèå íà çàäàííûå èíòåðâàëû
|
||||||
|
void Tsaur::defineUniversum() {
|
||||||
|
this->universumMax = x[0];
|
||||||
|
this->universumMin = x[0];
|
||||||
|
for (int i = 1; i < x.size(); i++) {
|
||||||
|
if (universumMax < x[i]) {
|
||||||
|
universumMax = x[i];
|
||||||
|
}
|
||||||
|
if (universumMin > x[i]) {
|
||||||
|
universumMin = x[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñîçäàåì ôóíêöèè ïðèíàäëåæíîñòè
|
||||||
|
// ïðèíèìàåì ïî óìîë÷àíèþ, ÷òî ñîñåäíèå ïåðåêðûâàþòñÿ íà ïîëîâèíó ìåæäó ñîáîé
|
||||||
|
// ðàç åñòü êîëè÷åñòâî èíòåðâàëîâ, òî âû÷èñëÿåì ðàçìåð îñíîâàíèÿ òðåóãîëüíèêà
|
||||||
|
double baseSize = (universumMax - universumMin) / countFuzzyParts;
|
||||||
|
a.resize(countFuzzyParts + 1);
|
||||||
|
for (int i=0; i < countFuzzyParts + 1;i++){
|
||||||
|
a[i] = (A(universumMin + (i-1) * baseSize, universumMin + (i+1)*baseSize));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïåðàöèÿ âû÷èòàíèÿ ìíîæåñòâ
|
||||||
|
A Tsaur::minusSet(A a, A b) {
|
||||||
|
//if ((a.getLeft()- b.getLeft()) < (a.getRight() - b.getRight())) {
|
||||||
|
return A(a.getLeft()- b.getLeft(), a.getRight() - b.getRight());
|
||||||
|
//} else {
|
||||||
|
// return A(a.getRight() - b.getRight(), a.getLeft()- b.getLeft());
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïåðàöèÿ âû÷èòàíèÿ ìíîæåñòâ
|
||||||
|
A Tsaur::numMinusSet(double num, A a) {
|
||||||
|
//if ((num - a.getLeft()) < (num - a.getRight())) {
|
||||||
|
return A(num - a.getLeft(), num - a.getRight());
|
||||||
|
//} else {
|
||||||
|
// return A(num - a.getRight(), num - a.getLeft());
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïåðàöèÿ äåëåíèÿ ìíîæåñòâ
|
||||||
|
A Tsaur::divSet(A a, A b) {
|
||||||
|
return A(a.getLeft()/b.getLeft(), a.getRight()/b.getRight());
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïåðàöèÿ äåëåíèÿ ìíîæåñòâ
|
||||||
|
A Tsaur::divSet(A a, double b) {
|
||||||
|
return A(a.getLeft()/b, a.getRight()/b);
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïåðàöèÿ óìíîæåíèå ìíîæåñòâà íà ÷èñëî
|
||||||
|
A Tsaur::multSetNum(double num, A a) {
|
||||||
|
//if ((a.getLeft() * num) < (a.getRight() * num)) {
|
||||||
|
return A(a.getLeft() * num, a.getRight() * num);
|
||||||
|
//} else {
|
||||||
|
// return A(a.getRight() * num, a.getLeft() * num);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïåðàöèÿ ñëîæåíèÿ ìíîæåñòâ
|
||||||
|
A Tsaur::plusSet(A a, A b) {
|
||||||
|
return A(a.getLeft()+ b.getLeft(), a.getRight() + b.getRight());
|
||||||
|
}
|
||||||
|
|
||||||
|
// îïåðàöèÿ óìíîæåíèÿ ìíîæåñòâ
|
||||||
|
A Tsaur::multSet(A a, A b) {
|
||||||
|
//if ((a.getLeft()* b.getLeft()) < (a.getRight() * b.getRight())) {
|
||||||
|
return A(a.getLeft()* b.getLeft(), a.getRight() * b.getRight());
|
||||||
|
//} else {
|
||||||
|
// return A(a.getLeft()* b.getLeft(), a.getRight() * b.getRight());
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ôàççèôèöèðîâàòü òîëüêî îäíó òî÷êó
|
||||||
|
// âîçâðàùàåò èíäåêñ ôóíêöèè ïðèíàäëåæíîñòè ñ ìàêñèìàëüíûì çíà÷åíèåì
|
||||||
|
A Tsaur::fuzzyfication(double value) {
|
||||||
|
// ïåðåáèðàåì âñå ôóíêöèè ïðèíàäëåæíîñòè,
|
||||||
|
// åñëè íàøëè íàèáîëüøóþ ñòåïåíü ïðèíàäëåæíîñòè, òî ôèêñèðóåì èíäåêñ ôóíêöèè
|
||||||
|
A aMax = a[0];
|
||||||
|
for (int j = 0; j < a.size(); j++) {
|
||||||
|
if (a[j].getValue(value) > aMax.getValue(value)) {
|
||||||
|
aMax = a[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return aMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Tsaur::createModelForEstimation() {
|
||||||
|
defineUniversum();
|
||||||
|
A fuzzyBetta0 = fuzzyfication(xLearning[1]- xLearning[0]);
|
||||||
|
A fuzzyBetta1 = A(lb1,rb1);
|
||||||
|
A fuzzyBetta2 = A(lb2,rb2);
|
||||||
|
A fuzzyAlpha = A(0, 1);
|
||||||
|
|
||||||
|
fuzzyTs.clear();
|
||||||
|
fuzzyForecast.clear();
|
||||||
|
// ôàççèôèêàöèÿ
|
||||||
|
fuzzyTs.resize(xLearning.size());
|
||||||
|
|
||||||
|
init();
|
||||||
|
A e;
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < xLearning.size()-1+this->countPointForecast; t++) {
|
||||||
|
if (t < xLearning.size()) {
|
||||||
|
e = minusSet(fuzzyfication(xLearning[t]), fuzzyForecast[t]);
|
||||||
|
} else {
|
||||||
|
e = A(0,0);
|
||||||
|
}
|
||||||
|
S.push_back(plusSet(S[t], multSet(e, fuzzyAlpha)));
|
||||||
|
T.push_back(plusSet(plusSet(fuzzyBetta0, multSetNum(t, fuzzyBetta1)), multSetNum(t*t, fuzzyBetta2)));
|
||||||
|
fuzzyForecast.push_back(plusSet(multSetNum(alpha, S[t+1]), multSetNum((1-alpha), T[t+1])));
|
||||||
|
//fuzzyForecast.push_back(S[t+1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
forecast.clear();
|
||||||
|
forecast.resize(fuzzyForecast.size());
|
||||||
|
for (unsigned int i = 0; i < fuzzyForecast.size(); i++) {
|
||||||
|
if (_finite(defuzzyfication(fuzzyForecast[i])) == 0){
|
||||||
|
forecast[i] = (x[x.size()-1]);
|
||||||
|
} else {
|
||||||
|
forecast[i] = (defuzzyfication(fuzzyForecast[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Tsaur::createModel() {
|
||||||
|
defineUniversum();
|
||||||
|
A fuzzyBetta0 = fuzzyfication(x[1]- x[0]);
|
||||||
|
A fuzzyBetta1 = A(lb1,rb1);
|
||||||
|
A fuzzyBetta2 = A(lb2,rb2);
|
||||||
|
A fuzzyAlpha = A(0, 1);
|
||||||
|
|
||||||
|
fuzzyTs.clear();
|
||||||
|
fuzzyForecast.clear();
|
||||||
|
// ôàççèôèêàöèÿ
|
||||||
|
fuzzyTs.resize(x.size());
|
||||||
|
|
||||||
|
init();
|
||||||
|
A e;
|
||||||
|
//âûïîëíÿåòñÿ ïðîõîä ìîäåëè ïî ñãëàæèâàíèþ è ïðîãíîçèðîâàíèþ countPointForecast òî÷åê
|
||||||
|
for (unsigned int t = 0; t < x.size()-1+this->countPointForecast; t++) {
|
||||||
|
if (t < x.size()) {
|
||||||
|
e = minusSet(fuzzyfication(x[t]), fuzzyForecast[t]);
|
||||||
|
} else {
|
||||||
|
e = A(0,0);
|
||||||
|
}
|
||||||
|
S.push_back(plusSet(S[t], multSet(e, fuzzyAlpha)));
|
||||||
|
T.push_back(plusSet(plusSet(fuzzyBetta0, multSetNum(t, fuzzyBetta1)), multSetNum(t*t, fuzzyBetta2)));
|
||||||
|
fuzzyForecast.push_back(plusSet(multSetNum(alpha, S[t+1]), multSetNum((1-alpha), T[t+1])));
|
||||||
|
//fuzzyForecast.push_back(S[t+1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
forecast.clear();
|
||||||
|
forecast.resize(fuzzyForecast.size());
|
||||||
|
for (unsigned int i = 0; i < fuzzyForecast.size(); i++) {
|
||||||
|
if (_finite(defuzzyfication(fuzzyForecast[i])) == 0){
|
||||||
|
forecast[i] = (x[x.size()-1]);
|
||||||
|
} else {
|
||||||
|
forecast[i] = (defuzzyfication(fuzzyForecast[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îöåíêè ìîäåëè
|
||||||
|
double Tsaur::calcEstimation(Aic *aic) {
|
||||||
|
return aic->getValue(3, this->xEstimation, this->forecast);
|
||||||
|
}
|
||||||
|
Tsaur::~Tsaur(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
double Tsaur::defuzzyfication(A a) {
|
||||||
|
return a.getValueAtTop();
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Tsaur::defuzzyfication(vector<A> fuz) {
|
||||||
|
vector<double> result;
|
||||||
|
for (int i =0; i < fuz.size(); i++) {
|
||||||
|
result.push_back(defuzzyfication(fuz[i]));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<double> Tsaur::getForecast() {
|
||||||
|
vector<double> result;
|
||||||
|
for (unsigned int i = forecast.size() - countPointForecast; i < forecast.size(); i++) {
|
||||||
|
result.push_back(forecast[i]);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Tsaur::setParam(string paramName, double value) {
|
||||||
|
if (paramName.compare("countFuzzyParts") == 0) {
|
||||||
|
this->countFuzzyParts = value;
|
||||||
|
} else if (paramName.compare("alpha") == 0) {
|
||||||
|
this->alpha = value;
|
||||||
|
} else if (paramName.compare("lb1") == 0) {
|
||||||
|
this->lb1 = value;
|
||||||
|
} else if (paramName.compare("rb1") == 0) {
|
||||||
|
this->rb1 = value;
|
||||||
|
} else if (paramName.compare("lb2") == 0) {
|
||||||
|
this->lb2 = value;
|
||||||
|
} else if (paramName.compare("rb2") == 0) {
|
||||||
|
this->rb2 = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ìåòîä ïîëó÷åíèÿ îïòèìèçèðîâàííîãî çíà÷åíèÿ îäíîãî ïàðàìåòðà
|
||||||
|
// TODO: ðåàëèçîâàòü
|
||||||
|
Param* Tsaur::optimize(Estimation *est) {
|
||||||
|
Param *optimal = new Param();
|
||||||
|
double minSmape = 99999;
|
||||||
|
for (double a = 0; a < 1; a+= 0.1) {
|
||||||
|
cout << "TSAUR " << a << " èç 1" <<"\n";;
|
||||||
|
for (double _lb1 = -10; _lb1 < 1; _lb1 += 0.2) {
|
||||||
|
for (double _rb1 = _lb1; _rb1 < 1; _rb1 += 0.2) {
|
||||||
|
for (double _lb2 = -1; _lb2 < 1; _lb2 += 0.2) {
|
||||||
|
for (double _rb2 = _lb2; _rb2 < 1; _rb2 += 0.2) {
|
||||||
|
|
||||||
|
for (double cfp = 2; cfp < 20;cfp+= 1) {
|
||||||
|
this->setParam("countFuzzyParts", cfp);
|
||||||
|
this->setParam("alpha", a);
|
||||||
|
this->setParam("lb1", _lb1);
|
||||||
|
this->setParam("rb1", _rb1);
|
||||||
|
this->setParam("lb2", _lb2);
|
||||||
|
this->setParam("rb2", _rb2);
|
||||||
|
this->createModelForEstimation();
|
||||||
|
double smapeValue = est->getValue(getXEstimation(), getForecast());
|
||||||
|
if (minSmape > smapeValue) {
|
||||||
|
minSmape = smapeValue;
|
||||||
|
optimal->countFuzzyParts = cfp;
|
||||||
|
optimal->alpha = a;
|
||||||
|
optimal->lb1 = _lb1;
|
||||||
|
optimal->lb2 = _lb2;
|
||||||
|
optimal->rb1 = _rb1;
|
||||||
|
optimal->rb2 = _rb2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return optimal;
|
||||||
|
}
|
59
project_template/Tsaur.h
Normal file
59
project_template/Tsaur.h
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#ifndef TSAUR_H
|
||||||
|
#define TSAUR_H
|
||||||
|
#include <vector>
|
||||||
|
#include "Method.h"
|
||||||
|
#include "A.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class Tsaur : public Method{
|
||||||
|
private:
|
||||||
|
vector<A> a; // íàáîð ôóíêöèé ïðèíàäëåæíîñòè
|
||||||
|
int countFuzzyParts;// êîëè÷åñòâî èíòåðâàëîâ óíèâåðñóìà
|
||||||
|
double universumMin;
|
||||||
|
double universumMax;
|
||||||
|
vector<A> fuzzyTs; // íå÷åòêèé âðåìåííîé ðÿä
|
||||||
|
vector<A> fuzzyForecast; // íå÷åòêèé âðåìåííîé ðÿä
|
||||||
|
double w;
|
||||||
|
string trendType;
|
||||||
|
string seasonType;
|
||||||
|
double alpha; // ïàðàìåòð ñãëàæèâàíèÿ
|
||||||
|
double gamma; // ïàðàìåòð ñãëàæèâàíèÿ òðåíäà
|
||||||
|
double delta; // ïàðàìåòð ñãëàæèâàíèÿ ñåçîííîé êîìïîíåíòû
|
||||||
|
int p; // ïåðèîä ñåçîííîñòè
|
||||||
|
double phi; // ïàðàìåòð äåìïèíãà
|
||||||
|
vector<A> S; // ñãëàæåííûé äàííûì ìåòîäîì ðÿä
|
||||||
|
vector<A> I;
|
||||||
|
vector<A> T;
|
||||||
|
double lb1;
|
||||||
|
double rb1;
|
||||||
|
double lb2;
|
||||||
|
double rb2;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void defineUniversum(); // îïðåäåëèòü óíèåðñóì äëÿ ïàðàìåòðîâ
|
||||||
|
A fuzzyfication(double);
|
||||||
|
double defuzzyfication(A);
|
||||||
|
vector<double> defuzzyfication(vector<A>);
|
||||||
|
A minusSet(A, A);
|
||||||
|
A numMinusSet(double, A);
|
||||||
|
A plusSet(A, A);
|
||||||
|
A divSet(A, A);
|
||||||
|
A divSet(A, double);
|
||||||
|
A multSet(A, A);
|
||||||
|
A multSetNum(double, A);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Tsaur(vector<double>, int);
|
||||||
|
~Tsaur(void);
|
||||||
|
vector<double> getForecast();
|
||||||
|
void init();
|
||||||
|
void createModel();
|
||||||
|
void createModelForEstimation();
|
||||||
|
void setParam(string, double);
|
||||||
|
double calcEstimation(Aic *);
|
||||||
|
Param* optimize(Estimation *); // ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
216
project_template/Vovk.cpp
Normal file
216
project_template/Vovk.cpp
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
#include "StdAfx.h"
|
||||||
|
#include "Vovk.h"
|
||||||
|
#include "Dsa.h"
|
||||||
|
#include "Fuzzy.h"
|
||||||
|
#include "FuzzyWithSets.h"
|
||||||
|
#include "NoTrendNoSeasonality.h"
|
||||||
|
#include "NoTrendNoSeasonality.h"
|
||||||
|
#include "NoTrendAddSeasonality.h"
|
||||||
|
#include "NoTrendMultSeasonality.h"
|
||||||
|
#include "AddTrendNoSeasonality.h"
|
||||||
|
#include "AddTrendAddSeasonality.h"
|
||||||
|
#include "AddTrendMultSeasonality.h"
|
||||||
|
#include "MultTrendNoSeasonality.h"
|
||||||
|
#include "MultTrendAddSeasonality.h"
|
||||||
|
#include "MultTrendMultSeasonality.h"
|
||||||
|
#include "DATrendNoSeasonality.h"
|
||||||
|
#include "DATrendAddSeasonality.h"
|
||||||
|
#include "DATrendMultSeasonality.h"
|
||||||
|
#include "DMTrendNoSeasonality.h"
|
||||||
|
#include "DMTrendAddSeasonality.h"
|
||||||
|
#include "DMTrendMultSeasonality.h"
|
||||||
|
#include "TrackingControlSignal.h"
|
||||||
|
#include <iostream>
|
||||||
|
//Set ts at constructor, get first forecast
|
||||||
|
//add value(update) ts
|
||||||
|
//recalculate weights
|
||||||
|
Vovk::Vovk(vector<double> _timeSeria, int _forecastHorizont, Method **m) {
|
||||||
|
prep = new Preparator(true, true);
|
||||||
|
useSingleTrashhold = false;
|
||||||
|
forecastHorizont = 1;
|
||||||
|
singleTrashhold = 0.35;
|
||||||
|
useModelTrashhold = false;
|
||||||
|
modelTrashhold = 0;
|
||||||
|
activeExpertsCount = 0;
|
||||||
|
beta = 0.5;
|
||||||
|
step = 0;
|
||||||
|
forecast = 0;
|
||||||
|
addWeightFromSleepEx = 0.0;
|
||||||
|
timeSeria = _timeSeria;
|
||||||
|
calculateTimeSeriaDiff(_timeSeria);
|
||||||
|
int n = 29; // êîëè÷åñòâî ìåòîäîâ, ÷òîá ëèøíåãî ïàìÿòè íå æðàòü
|
||||||
|
expertsCount = n;
|
||||||
|
forecastHorizont = _forecastHorizont;
|
||||||
|
/*int p = 1;
|
||||||
|
double alpha = 0.4;
|
||||||
|
double delta = 0.9;
|
||||||
|
double gamma = 0.4;
|
||||||
|
double phi = 0.1;*/
|
||||||
|
int countRulesIn = 1;
|
||||||
|
int countFuzzyParts = 40;
|
||||||
|
models = m;
|
||||||
|
//models[0] = new NoTrendNoSeasonality(_timeSeria, _forecastHorizont);
|
||||||
|
//models[1] = new NoTrendAddSeasonality(_timeSeria, _forecastHorizont);
|
||||||
|
//models[2] = new NoTrendMultSeasonality(_timeSeria, _forecastHorizont);
|
||||||
|
|
||||||
|
//models[3] = new AddTrendNoSeasonality(_timeSeria, _forecastHorizont);
|
||||||
|
//models[4] = new MultTrendNoSeasonality(_timeSeria, _forecastHorizont);
|
||||||
|
//models[5] = new DATrendNoSeasonality(_timeSeria, _forecastHorizont);
|
||||||
|
//models[6] = new DMTrendNoSeasonality(_timeSeria, _forecastHorizont);
|
||||||
|
|
||||||
|
//models[7] = new AddTrendAddSeasonality(_timeSeria, _forecastHorizont);
|
||||||
|
//models[8] = new MultTrendAddSeasonality(_timeSeria, _forecastHorizont);
|
||||||
|
//models[9] = new DATrendAddSeasonality(_timeSeria, _forecastHorizont);
|
||||||
|
//models[10] = new DMTrendAddSeasonality(_timeSeria, _forecastHorizont);
|
||||||
|
|
||||||
|
//models[11] = new AddTrendMultSeasonality(_timeSeria, _forecastHorizont);
|
||||||
|
//models[12] = new MultTrendMultSeasonality(_timeSeria, _forecastHorizont);
|
||||||
|
//models[13] = new DATrendMultSeasonality(_timeSeria, _forecastHorizont);
|
||||||
|
//models[14] = new DMTrendMultSeasonality(_timeSeria, _forecastHorizont);
|
||||||
|
//models[15] = new Dsa(_timeSeria, _forecastHorizont);
|
||||||
|
//models[16] = new Fuzzy("None", "None", _timeSeria, _forecastHorizont);
|
||||||
|
//models[17] = new Fuzzy("Add", "None", _timeSeria, _forecastHorizont);
|
||||||
|
//models[18] = new Fuzzy("None", "Add", _timeSeria, _forecastHorizont);
|
||||||
|
//models[19] = new Fuzzy("Add", "Add", _timeSeria, _forecastHorizont);
|
||||||
|
//models[20] = new FuzzyWithSets("None", "None", _timeSeria, _forecastHorizont);
|
||||||
|
//models[21] = new FuzzyWithSets("None", "Add", _timeSeria, _forecastHorizont);
|
||||||
|
//models[22] = new FuzzyWithSets("None", "Mult", _timeSeria, _forecastHorizont);
|
||||||
|
//models[23] = new FuzzyWithSets("Add", "None", _timeSeria, _forecastHorizont);
|
||||||
|
//models[24] = new FuzzyWithSets("Add", "Add", _timeSeria, _forecastHorizont);
|
||||||
|
//models[25] = new FuzzyWithSets("Add", "Mult", _timeSeria, _forecastHorizont);
|
||||||
|
//models[26] = new FuzzyWithSets("Mult", "None", _timeSeria, _forecastHorizont);
|
||||||
|
//models[27] = new FuzzyWithSets("Mult", "Add", _timeSeria, _forecastHorizont);
|
||||||
|
//models[28] = new FuzzyWithSets("Mult", "Mult", _timeSeria, _forecastHorizont);
|
||||||
|
|
||||||
|
////add models
|
||||||
|
//for (int i = 0; i < 29; i++) {
|
||||||
|
|
||||||
|
// // ñîçäàåì ìîäåëü äëÿ òåñòèðîâàíèÿ ïðè ïîìîùè âûáðàííîãî ìåòîäà
|
||||||
|
// // çàäàåì ïàðàìåòðû
|
||||||
|
// models[i]->setParam("alpha", alpha);
|
||||||
|
// models[i]->setParam("gamma", gamma);
|
||||||
|
// models[i]->setParam("delta", delta);
|
||||||
|
// models[i]->setParam("p", p);
|
||||||
|
// models[i]->setParam("phi", phi);
|
||||||
|
|
||||||
|
// models[i]->setParam("countRulesIn", countRulesIn);
|
||||||
|
// models[i]->setParam("countFuzzyParts", countFuzzyParts);
|
||||||
|
// models[i]->setParam("w", 0.5);
|
||||||
|
// // ñ íóæíî îïðåäåëÿòü êàê îòíîñèòåëüíóþ âåëè÷èíó, áåç ïðèâÿçêè ê çíà÷åíèÿì ðÿäà
|
||||||
|
// // ëèøü ïîòîì ìàñøòàáèðîâàòü
|
||||||
|
// // íàïðèìåð ìîæíî ðàññ÷èòàòü òàê: ïðè êîëè÷åñòâå èíòåðâàëîâ ðàçáèåíèÿ = 20, åñëè çàäàòü c = 20
|
||||||
|
// // òî òðåóãîëüíèêè áóäóò ïåðåêðûâàòü äðóã äðóãà ðîâíî íà ïîëîâèíó
|
||||||
|
// models[i]->setParam("c", 20);
|
||||||
|
// // ñîçäàåì ìîäåëü
|
||||||
|
// models[i]->createModelForEstimation();
|
||||||
|
//}
|
||||||
|
//push models to Vovks object
|
||||||
|
double check = 0;
|
||||||
|
|
||||||
|
//set weights at first time
|
||||||
|
for (int i = 0; i < expertsCount; i++)
|
||||||
|
{
|
||||||
|
models[i]->weight = (1.0 / expertsCount);
|
||||||
|
check += models[i]->weight;
|
||||||
|
models[i]->value = models[i]->getForecast()[step];
|
||||||
|
//cout << models[i]->value << " " << models[i]->weight << " " << forecast << endl;
|
||||||
|
}
|
||||||
|
//check experts representation
|
||||||
|
checkExperts();
|
||||||
|
//calculate first forecast
|
||||||
|
for (int i = 0; i < expertsCount; i++)
|
||||||
|
{
|
||||||
|
if (models[i]->isActive)
|
||||||
|
forecast += models[i]->value * (models[i]->weight + addWeightFromSleepEx/activeExpertsCount);
|
||||||
|
}
|
||||||
|
getNewExpertsValues();
|
||||||
|
//step++;
|
||||||
|
}
|
||||||
|
void Vovk::setBeta(double _beta){
|
||||||
|
beta = _beta;
|
||||||
|
}
|
||||||
|
Vovk::~Vovk() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Vovk::calculateTimeSeriaDiff(vector<double> timeSeria){
|
||||||
|
double diff = 0.0;
|
||||||
|
for (int i = 0; i < timeSeria.size() - 1; i++){
|
||||||
|
diff += fabs(timeSeria[i] - timeSeria[i + 1]);
|
||||||
|
}
|
||||||
|
timeSeriaDiff = (diff / (timeSeria.size() - 1)) * (1 + singleTrashhold);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Vovk::checkExperts(){
|
||||||
|
TrackingControlSignal *tcs = new TrackingControlSignal();
|
||||||
|
activeExpertsCount = expertsCount;
|
||||||
|
addWeightFromSleepEx = 0.0;
|
||||||
|
vector<bool> expertsActivity = tcs->HistoricalExpertControl(models, timeSeriaDiff, expertsCount);
|
||||||
|
for (int i = 0; i < expertsCount; i++)
|
||||||
|
{
|
||||||
|
models[i]->isActive = expertsActivity[i];
|
||||||
|
if (!expertsActivity[i]){
|
||||||
|
addWeightFromSleepEx += models[i]->weight;
|
||||||
|
activeExpertsCount--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Vovk::getNewExpertsValues(){
|
||||||
|
for (int i = 0; i < expertsCount; i++){
|
||||||
|
//for 1 scale forecast
|
||||||
|
models[i]->value = models[i]->getForecast()[step];
|
||||||
|
}
|
||||||
|
step++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//ret gt(x)
|
||||||
|
double Vovk::recalculateWeights(double nextRealValue){
|
||||||
|
double weightsSum = 0;
|
||||||
|
for (int i = 0; i < expertsCount; i++){
|
||||||
|
models[i]->weight = models[i]->weight * pow(beta, fabs(models[i]->value - nextRealValue));
|
||||||
|
weightsSum += models[i]->weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
//normalize weights
|
||||||
|
double check = 0.0;
|
||||||
|
for (int i = 0; i < expertsCount; i++){
|
||||||
|
models[i]->weight = models[i]->weight / weightsSum;
|
||||||
|
check += models[i]->weight;
|
||||||
|
}
|
||||||
|
return log(weightsSum) / log(beta);//beta, weightsSum);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Vovk::updateTS(double nextRealValue){
|
||||||
|
//change models weights with new real value
|
||||||
|
double gtx = recalculateWeights(nextRealValue);
|
||||||
|
forecast = 0.0;
|
||||||
|
//create new forecast from experts
|
||||||
|
getNewExpertsValues();
|
||||||
|
checkExperts();
|
||||||
|
//create aggregated forecast
|
||||||
|
double check = 0.0;
|
||||||
|
for (int i = 0; i < expertsCount; i++)
|
||||||
|
{
|
||||||
|
/*cout << i << ") ";
|
||||||
|
if (models[i]->isActive){
|
||||||
|
cout << "true ";
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
cout << "false ";
|
||||||
|
}
|
||||||
|
cout << " " << models[i]->value << " " << models[i]->weight << endl;*/
|
||||||
|
if (models[i]->isActive){
|
||||||
|
check += models[i]->weight;
|
||||||
|
forecast += models[i]->value * (models[i]->weight + addWeightFromSleepEx / activeExpertsCount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double Vovk::getForecast(){
|
||||||
|
return forecast;
|
||||||
|
}
|
||||||
|
|
||||||
|
//void Vovk::addMethod(AggModel model){
|
||||||
|
// models.push_back(model);
|
||||||
|
//}
|
53
project_template/Vovk.h
Normal file
53
project_template/Vovk.h
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#ifndef VOVK_H
|
||||||
|
#define VOVK_H
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Preparator.h"
|
||||||
|
struct AggModel {
|
||||||
|
|
||||||
|
char * name;
|
||||||
|
double weight;
|
||||||
|
double value;
|
||||||
|
Method* expert;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
class Vovk {
|
||||||
|
|
||||||
|
private:
|
||||||
|
/*int expertsCount = 0;
|
||||||
|
int activeExpertsCount = 0;
|
||||||
|
double beta = 0.5;
|
||||||
|
int step = 0;
|
||||||
|
double forecast = 0;
|
||||||
|
double addWeightFromSleepEx = 0.0;*/
|
||||||
|
int expertsCount;
|
||||||
|
int activeExpertsCount;
|
||||||
|
double beta;
|
||||||
|
int step;
|
||||||
|
double forecast;
|
||||||
|
double addWeightFromSleepEx;
|
||||||
|
vector<double> timeSeria;
|
||||||
|
Method** models;
|
||||||
|
void getNewExpertsValues();
|
||||||
|
void checkExperts();
|
||||||
|
//ret - log(beta, sum(1..n) weight * pow(beta, L))
|
||||||
|
double recalculateWeights(double nextRealValue);
|
||||||
|
//double timeSeriaDiff = 0;
|
||||||
|
double timeSeriaDiff;
|
||||||
|
Preparator *prep;
|
||||||
|
void calculateTimeSeriaDiff(vector<double> timeSeria);
|
||||||
|
public:
|
||||||
|
void setBeta(double beta);
|
||||||
|
bool useSingleTrashhold ;
|
||||||
|
double forecastHorizont;
|
||||||
|
double singleTrashhold;
|
||||||
|
bool useModelTrashhold;
|
||||||
|
double modelTrashhold;
|
||||||
|
Vovk(vector<double>, int, Method**);
|
||||||
|
~Vovk();
|
||||||
|
double getForecast();
|
||||||
|
void updateTS(double nextRealValue);
|
||||||
|
void addMethod(AggModel);
|
||||||
|
};
|
||||||
|
#endif
|
BIN
project_template/libnlopt-0.dll
Normal file
BIN
project_template/libnlopt-0.dll
Normal file
Binary file not shown.
BIN
project_template/libnlopt-0.lib
Normal file
BIN
project_template/libnlopt-0.lib
Normal file
Binary file not shown.
381
project_template/nlopt.h
Normal file
381
project_template/nlopt.h
Normal file
@ -0,0 +1,381 @@
|
|||||||
|
/* Copyright (c) 2007-2014 Massachusetts Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NLOPT_H
|
||||||
|
#define NLOPT_H
|
||||||
|
|
||||||
|
#include <stddef.h> /* for ptrdiff_t and size_t */
|
||||||
|
|
||||||
|
/* Change 0 to 1 to use stdcall convention under Win32 */
|
||||||
|
#if 0 && (defined(_WIN32) || defined(__WIN32__))
|
||||||
|
# if defined(__GNUC__)
|
||||||
|
# define NLOPT_STDCALL __attribute__((stdcall))
|
||||||
|
# elif defined(_MSC_VER) || defined(_ICC) || defined(_STDCALL_SUPPORTED)
|
||||||
|
# define NLOPT_STDCALL __stdcall
|
||||||
|
# else
|
||||||
|
# define NLOPT_STDCALL
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define NLOPT_STDCALL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* for Windows compilers, you should add a line
|
||||||
|
*/
|
||||||
|
#define NLOPT_DLL
|
||||||
|
/*
|
||||||
|
when using NLopt from a DLL, in order to do the proper
|
||||||
|
Windows importing nonsense. */
|
||||||
|
#if defined(NLOPT_DLL) && (defined(_WIN32) || defined(__WIN32__)) && !defined(__LCC__)
|
||||||
|
/* annoying Windows syntax for calling functions in a DLL */
|
||||||
|
# if defined(NLOPT_DLL_EXPORT)
|
||||||
|
# define NLOPT_EXTERN(T) extern __declspec(dllexport) T NLOPT_STDCALL
|
||||||
|
# else
|
||||||
|
# define NLOPT_EXTERN(T) extern __declspec(dllimport) T NLOPT_STDCALL
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define NLOPT_EXTERN(T) extern T NLOPT_STDCALL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
typedef double (*nlopt_func)(unsigned n, const double *x,
|
||||||
|
double *gradient, /* NULL if not needed */
|
||||||
|
void *func_data);
|
||||||
|
|
||||||
|
typedef void (*nlopt_mfunc)(unsigned m, double *result,
|
||||||
|
unsigned n, const double *x,
|
||||||
|
double *gradient, /* NULL if not needed */
|
||||||
|
void *func_data);
|
||||||
|
|
||||||
|
/* A preconditioner, which preconditions v at x to return vpre.
|
||||||
|
(The meaning of "preconditioning" is algorithm-dependent.) */
|
||||||
|
typedef void (*nlopt_precond)(unsigned n, const double *x, const double *v,
|
||||||
|
double *vpre, void *data);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
/* Naming conventions:
|
||||||
|
|
||||||
|
NLOPT_{G/L}{D/N}_*
|
||||||
|
= global/local derivative/no-derivative optimization,
|
||||||
|
respectively
|
||||||
|
|
||||||
|
*_RAND algorithms involve some randomization.
|
||||||
|
|
||||||
|
*_NOSCAL algorithms are *not* scaled to a unit hypercube
|
||||||
|
(i.e. they are sensitive to the units of x)
|
||||||
|
*/
|
||||||
|
|
||||||
|
NLOPT_GN_DIRECT = 0,
|
||||||
|
NLOPT_GN_DIRECT_L,
|
||||||
|
NLOPT_GN_DIRECT_L_RAND,
|
||||||
|
NLOPT_GN_DIRECT_NOSCAL,
|
||||||
|
NLOPT_GN_DIRECT_L_NOSCAL,
|
||||||
|
NLOPT_GN_DIRECT_L_RAND_NOSCAL,
|
||||||
|
|
||||||
|
NLOPT_GN_ORIG_DIRECT,
|
||||||
|
NLOPT_GN_ORIG_DIRECT_L,
|
||||||
|
|
||||||
|
NLOPT_GD_STOGO,
|
||||||
|
NLOPT_GD_STOGO_RAND,
|
||||||
|
|
||||||
|
NLOPT_LD_LBFGS_NOCEDAL,
|
||||||
|
|
||||||
|
NLOPT_LD_LBFGS,
|
||||||
|
|
||||||
|
NLOPT_LN_PRAXIS,
|
||||||
|
|
||||||
|
NLOPT_LD_VAR1,
|
||||||
|
NLOPT_LD_VAR2,
|
||||||
|
|
||||||
|
NLOPT_LD_TNEWTON,
|
||||||
|
NLOPT_LD_TNEWTON_RESTART,
|
||||||
|
NLOPT_LD_TNEWTON_PRECOND,
|
||||||
|
NLOPT_LD_TNEWTON_PRECOND_RESTART,
|
||||||
|
|
||||||
|
NLOPT_GN_CRS2_LM,
|
||||||
|
|
||||||
|
NLOPT_GN_MLSL,
|
||||||
|
NLOPT_GD_MLSL,
|
||||||
|
NLOPT_GN_MLSL_LDS,
|
||||||
|
NLOPT_GD_MLSL_LDS,
|
||||||
|
|
||||||
|
NLOPT_LD_MMA,
|
||||||
|
|
||||||
|
NLOPT_LN_COBYLA,
|
||||||
|
|
||||||
|
NLOPT_LN_NEWUOA,
|
||||||
|
NLOPT_LN_NEWUOA_BOUND,
|
||||||
|
|
||||||
|
NLOPT_LN_NELDERMEAD,
|
||||||
|
NLOPT_LN_SBPLX,
|
||||||
|
|
||||||
|
NLOPT_LN_AUGLAG,
|
||||||
|
NLOPT_LD_AUGLAG,
|
||||||
|
NLOPT_LN_AUGLAG_EQ,
|
||||||
|
NLOPT_LD_AUGLAG_EQ,
|
||||||
|
|
||||||
|
NLOPT_LN_BOBYQA,
|
||||||
|
|
||||||
|
NLOPT_GN_ISRES,
|
||||||
|
|
||||||
|
/* new variants that require local_optimizer to be set,
|
||||||
|
not with older constants for backwards compatibility */
|
||||||
|
NLOPT_AUGLAG,
|
||||||
|
NLOPT_AUGLAG_EQ,
|
||||||
|
NLOPT_G_MLSL,
|
||||||
|
NLOPT_G_MLSL_LDS,
|
||||||
|
|
||||||
|
NLOPT_LD_SLSQP,
|
||||||
|
|
||||||
|
NLOPT_LD_CCSAQ,
|
||||||
|
|
||||||
|
NLOPT_GN_ESCH,
|
||||||
|
|
||||||
|
NLOPT_NUM_ALGORITHMS /* not an algorithm, just the number of them */
|
||||||
|
} nlopt_algorithm;
|
||||||
|
|
||||||
|
NLOPT_EXTERN(const char *) nlopt_algorithm_name(nlopt_algorithm a);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NLOPT_FAILURE = -1, /* generic failure code */
|
||||||
|
NLOPT_INVALID_ARGS = -2,
|
||||||
|
NLOPT_OUT_OF_MEMORY = -3,
|
||||||
|
NLOPT_ROUNDOFF_LIMITED = -4,
|
||||||
|
NLOPT_FORCED_STOP = -5,
|
||||||
|
NLOPT_SUCCESS = 1, /* generic success code */
|
||||||
|
NLOPT_STOPVAL_REACHED = 2,
|
||||||
|
NLOPT_FTOL_REACHED = 3,
|
||||||
|
NLOPT_XTOL_REACHED = 4,
|
||||||
|
NLOPT_MAXEVAL_REACHED = 5,
|
||||||
|
NLOPT_MAXTIME_REACHED = 6
|
||||||
|
} nlopt_result;
|
||||||
|
|
||||||
|
#define NLOPT_MINF_MAX_REACHED NLOPT_STOPVAL_REACHED
|
||||||
|
|
||||||
|
NLOPT_EXTERN(void) nlopt_srand(unsigned long seed);
|
||||||
|
NLOPT_EXTERN(void) nlopt_srand_time(void);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(void) nlopt_version(int *major, int *minor, int *bugfix);
|
||||||
|
|
||||||
|
/*************************** OBJECT-ORIENTED API **************************/
|
||||||
|
/* The style here is that we create an nlopt_opt "object" (an opaque pointer),
|
||||||
|
then set various optimization parameters, and then execute the
|
||||||
|
algorithm. In this way, we can add more and more optimization parameters
|
||||||
|
(including algorithm-specific ones) without breaking backwards
|
||||||
|
compatibility, having functions with zillions of parameters, or
|
||||||
|
relying non-reentrantly on global variables.*/
|
||||||
|
|
||||||
|
struct nlopt_opt_s; /* opaque structure, defined internally */
|
||||||
|
typedef struct nlopt_opt_s *nlopt_opt;
|
||||||
|
|
||||||
|
/* the only immutable parameters of an optimization are the algorithm and
|
||||||
|
the dimension n of the problem, since changing either of these could
|
||||||
|
have side-effects on lots of other parameters */
|
||||||
|
NLOPT_EXTERN(nlopt_opt) nlopt_create(nlopt_algorithm algorithm, unsigned n);
|
||||||
|
NLOPT_EXTERN(void) nlopt_destroy(nlopt_opt opt);
|
||||||
|
NLOPT_EXTERN(nlopt_opt) nlopt_copy(const nlopt_opt opt);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_optimize(nlopt_opt opt, double *x,
|
||||||
|
double *opt_f);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_min_objective(nlopt_opt opt, nlopt_func f,
|
||||||
|
void *f_data);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_max_objective(nlopt_opt opt, nlopt_func f,
|
||||||
|
void *f_data);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_precond_min_objective(nlopt_opt opt, nlopt_func f, nlopt_precond pre, void *f_data);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_precond_max_objective(nlopt_opt opt, nlopt_func f, nlopt_precond pre, void *f_data);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_algorithm) nlopt_get_algorithm(const nlopt_opt opt);
|
||||||
|
NLOPT_EXTERN(unsigned) nlopt_get_dimension(const nlopt_opt opt);
|
||||||
|
|
||||||
|
/* constraints: */
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_lower_bounds(nlopt_opt opt,
|
||||||
|
const double *lb);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_lower_bounds1(nlopt_opt opt, double lb);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_get_lower_bounds(const nlopt_opt opt,
|
||||||
|
double *lb);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_upper_bounds(nlopt_opt opt,
|
||||||
|
const double *ub);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_upper_bounds1(nlopt_opt opt, double ub);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_get_upper_bounds(const nlopt_opt opt,
|
||||||
|
double *ub);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_remove_inequality_constraints(nlopt_opt opt);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_add_inequality_constraint(nlopt_opt opt,
|
||||||
|
nlopt_func fc,
|
||||||
|
void *fc_data,
|
||||||
|
double tol);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_add_precond_inequality_constraint(
|
||||||
|
nlopt_opt opt, nlopt_func fc, nlopt_precond pre, void *fc_data,
|
||||||
|
double tol);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_add_inequality_mconstraint(nlopt_opt opt,
|
||||||
|
unsigned m,
|
||||||
|
nlopt_mfunc fc,
|
||||||
|
void *fc_data,
|
||||||
|
const double *tol);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_remove_equality_constraints(nlopt_opt opt);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_add_equality_constraint(nlopt_opt opt,
|
||||||
|
nlopt_func h,
|
||||||
|
void *h_data,
|
||||||
|
double tol);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_add_precond_equality_constraint(
|
||||||
|
nlopt_opt opt, nlopt_func h, nlopt_precond pre, void *h_data,
|
||||||
|
double tol);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_add_equality_mconstraint(nlopt_opt opt,
|
||||||
|
unsigned m,
|
||||||
|
nlopt_mfunc h,
|
||||||
|
void *h_data,
|
||||||
|
const double *tol);
|
||||||
|
|
||||||
|
/* stopping criteria: */
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_stopval(nlopt_opt opt, double stopval);
|
||||||
|
NLOPT_EXTERN(double) nlopt_get_stopval(const nlopt_opt opt);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_ftol_rel(nlopt_opt opt, double tol);
|
||||||
|
NLOPT_EXTERN(double) nlopt_get_ftol_rel(const nlopt_opt opt);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_ftol_abs(nlopt_opt opt, double tol);
|
||||||
|
NLOPT_EXTERN(double) nlopt_get_ftol_abs(const nlopt_opt opt);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_xtol_rel(nlopt_opt opt, double tol);
|
||||||
|
NLOPT_EXTERN(double) nlopt_get_xtol_rel(const nlopt_opt opt);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_xtol_abs1(nlopt_opt opt, double tol);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_xtol_abs(nlopt_opt opt, const double *tol);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_get_xtol_abs(const nlopt_opt opt,
|
||||||
|
double *tol);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_maxeval(nlopt_opt opt, int maxeval);
|
||||||
|
NLOPT_EXTERN(int) nlopt_get_maxeval(const nlopt_opt opt);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_maxtime(nlopt_opt opt, double maxtime);
|
||||||
|
NLOPT_EXTERN(double) nlopt_get_maxtime(const nlopt_opt opt);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_force_stop(nlopt_opt opt);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_force_stop(nlopt_opt opt, int val);
|
||||||
|
NLOPT_EXTERN(int) nlopt_get_force_stop(const nlopt_opt opt);
|
||||||
|
|
||||||
|
/* more algorithm-specific parameters */
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_local_optimizer(nlopt_opt opt,
|
||||||
|
const nlopt_opt local_opt);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_population(nlopt_opt opt, unsigned pop);
|
||||||
|
NLOPT_EXTERN(unsigned) nlopt_get_population(const nlopt_opt opt);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_vector_storage(nlopt_opt opt, unsigned dim);
|
||||||
|
NLOPT_EXTERN(unsigned) nlopt_get_vector_storage(const nlopt_opt opt);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_default_initial_step(nlopt_opt opt,
|
||||||
|
const double *x);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_initial_step(nlopt_opt opt,
|
||||||
|
const double *dx);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_set_initial_step1(nlopt_opt opt, double dx);
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_get_initial_step(const nlopt_opt opt,
|
||||||
|
const double *x, double *dx);
|
||||||
|
|
||||||
|
/* the following are functions mainly designed to be used internally
|
||||||
|
by the Fortran and SWIG wrappers, allow us to tel nlopt_destroy and
|
||||||
|
nlopt_copy to do something to the f_data pointers (e.g. free or
|
||||||
|
duplicate them, respectively) */
|
||||||
|
typedef void* (*nlopt_munge)(void *p);
|
||||||
|
NLOPT_EXTERN(void) nlopt_set_munge(nlopt_opt opt,
|
||||||
|
nlopt_munge munge_on_destroy,
|
||||||
|
nlopt_munge munge_on_copy);
|
||||||
|
typedef void* (*nlopt_munge2)(void *p, void *data);
|
||||||
|
NLOPT_EXTERN(void) nlopt_munge_data(nlopt_opt opt,
|
||||||
|
nlopt_munge2 munge, void *data);
|
||||||
|
|
||||||
|
/*************************** DEPRECATED API **************************/
|
||||||
|
/* The new "object-oriented" API is preferred, since it allows us to
|
||||||
|
gracefully add new features and algorithm-specific options in a
|
||||||
|
re-entrant way, and we can automatically assume reasonable defaults
|
||||||
|
for unspecified parameters. */
|
||||||
|
|
||||||
|
/* Where possible (e.g. for gcc >= 3.1), enable a compiler warning
|
||||||
|
for code that uses a deprecated function */
|
||||||
|
#if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__==3 && __GNUC_MINOR__ > 0))
|
||||||
|
# define NLOPT_DEPRECATED __attribute__((deprecated))
|
||||||
|
#else
|
||||||
|
# define NLOPT_DEPRECATED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef double (*nlopt_func_old)(int n, const double *x,
|
||||||
|
double *gradient, /* NULL if not needed */
|
||||||
|
void *func_data);
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_minimize(
|
||||||
|
nlopt_algorithm algorithm,
|
||||||
|
int n, nlopt_func_old f, void *f_data,
|
||||||
|
const double *lb, const double *ub, /* bounds */
|
||||||
|
double *x, /* in: initial guess, out: minimizer */
|
||||||
|
double *minf, /* out: minimum */
|
||||||
|
double minf_max, double ftol_rel, double ftol_abs,
|
||||||
|
double xtol_rel, const double *xtol_abs,
|
||||||
|
int maxeval, double maxtime) NLOPT_DEPRECATED;
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_minimize_constrained(
|
||||||
|
nlopt_algorithm algorithm,
|
||||||
|
int n, nlopt_func_old f, void *f_data,
|
||||||
|
int m, nlopt_func_old fc, void *fc_data, ptrdiff_t fc_datum_size,
|
||||||
|
const double *lb, const double *ub, /* bounds */
|
||||||
|
double *x, /* in: initial guess, out: minimizer */
|
||||||
|
double *minf, /* out: minimum */
|
||||||
|
double minf_max, double ftol_rel, double ftol_abs,
|
||||||
|
double xtol_rel, const double *xtol_abs,
|
||||||
|
int maxeval, double maxtime) NLOPT_DEPRECATED;
|
||||||
|
|
||||||
|
NLOPT_EXTERN(nlopt_result) nlopt_minimize_econstrained(
|
||||||
|
nlopt_algorithm algorithm,
|
||||||
|
int n, nlopt_func_old f, void *f_data,
|
||||||
|
int m, nlopt_func_old fc, void *fc_data, ptrdiff_t fc_datum_size,
|
||||||
|
int p, nlopt_func_old h, void *h_data, ptrdiff_t h_datum_size,
|
||||||
|
const double *lb, const double *ub, /* bounds */
|
||||||
|
double *x, /* in: initial guess, out: minimizer */
|
||||||
|
double *minf, /* out: minimum */
|
||||||
|
double minf_max, double ftol_rel, double ftol_abs,
|
||||||
|
double xtol_rel, const double *xtol_abs,
|
||||||
|
double htol_rel, double htol_abs,
|
||||||
|
int maxeval, double maxtime) NLOPT_DEPRECATED;
|
||||||
|
|
||||||
|
NLOPT_EXTERN(void) nlopt_get_local_search_algorithm(nlopt_algorithm *deriv,
|
||||||
|
nlopt_algorithm *nonderiv,
|
||||||
|
int *maxeval) NLOPT_DEPRECATED;
|
||||||
|
NLOPT_EXTERN(void) nlopt_set_local_search_algorithm(nlopt_algorithm deriv,
|
||||||
|
nlopt_algorithm nonderiv,
|
||||||
|
int maxeval) NLOPT_DEPRECATED;
|
||||||
|
|
||||||
|
NLOPT_EXTERN(int) nlopt_get_stochastic_population(void) NLOPT_DEPRECATED;
|
||||||
|
NLOPT_EXTERN(void) nlopt_set_stochastic_population(int pop) NLOPT_DEPRECATED;
|
||||||
|
|
||||||
|
/*********************************************************************/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif
|
596
project_template/nlopt.hpp
Normal file
596
project_template/nlopt.hpp
Normal file
@ -0,0 +1,596 @@
|
|||||||
|
/* Copyright (c) 2007-2011 Massachusetts Institute of Technology
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
* a copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// C++ style wrapper around NLopt API
|
||||||
|
// nlopt.hpp is AUTOMATICALLY GENERATED from nlopt-in.hpp - edit the latter!
|
||||||
|
|
||||||
|
#ifndef NLOPT_HPP
|
||||||
|
#define NLOPT_HPP
|
||||||
|
|
||||||
|
#include "nlopt.h"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <new>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
// convenience overloading for below (not in nlopt:: since has nlopt_ prefix)
|
||||||
|
inline nlopt_result nlopt_get_initial_step(const nlopt_opt opt, double *dx) {
|
||||||
|
return nlopt_get_initial_step(opt, (const double *) NULL, dx);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace nlopt {
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
// nlopt::* namespace versions of the C enumerated types
|
||||||
|
// AUTOMATICALLY GENERATED, DO NOT EDIT
|
||||||
|
// GEN_ENUMS_HERE
|
||||||
|
enum algorithm {
|
||||||
|
GN_DIRECT = 0,
|
||||||
|
GN_DIRECT_L,
|
||||||
|
GN_DIRECT_L_RAND,
|
||||||
|
GN_DIRECT_NOSCAL,
|
||||||
|
GN_DIRECT_L_NOSCAL,
|
||||||
|
GN_DIRECT_L_RAND_NOSCAL,
|
||||||
|
GN_ORIG_DIRECT,
|
||||||
|
GN_ORIG_DIRECT_L,
|
||||||
|
GD_STOGO,
|
||||||
|
GD_STOGO_RAND,
|
||||||
|
LD_LBFGS_NOCEDAL,
|
||||||
|
LD_LBFGS,
|
||||||
|
LN_PRAXIS,
|
||||||
|
LD_VAR1,
|
||||||
|
LD_VAR2,
|
||||||
|
LD_TNEWTON,
|
||||||
|
LD_TNEWTON_RESTART,
|
||||||
|
LD_TNEWTON_PRECOND,
|
||||||
|
LD_TNEWTON_PRECOND_RESTART,
|
||||||
|
GN_CRS2_LM,
|
||||||
|
GN_MLSL,
|
||||||
|
GD_MLSL,
|
||||||
|
GN_MLSL_LDS,
|
||||||
|
GD_MLSL_LDS,
|
||||||
|
LD_MMA,
|
||||||
|
LN_COBYLA,
|
||||||
|
LN_NEWUOA,
|
||||||
|
LN_NEWUOA_BOUND,
|
||||||
|
LN_NELDERMEAD,
|
||||||
|
LN_SBPLX,
|
||||||
|
LN_AUGLAG,
|
||||||
|
LD_AUGLAG,
|
||||||
|
LN_AUGLAG_EQ,
|
||||||
|
LD_AUGLAG_EQ,
|
||||||
|
LN_BOBYQA,
|
||||||
|
GN_ISRES,
|
||||||
|
AUGLAG,
|
||||||
|
AUGLAG_EQ,
|
||||||
|
G_MLSL,
|
||||||
|
G_MLSL_LDS,
|
||||||
|
LD_SLSQP,
|
||||||
|
LD_CCSAQ,
|
||||||
|
GN_ESCH,
|
||||||
|
NUM_ALGORITHMS /* not an algorithm, just the number of them */
|
||||||
|
};
|
||||||
|
enum result {
|
||||||
|
FAILURE = -1, /* generic failure code */
|
||||||
|
INVALID_ARGS = -2,
|
||||||
|
OUT_OF_MEMORY = -3,
|
||||||
|
ROUNDOFF_LIMITED = -4,
|
||||||
|
FORCED_STOP = -5,
|
||||||
|
SUCCESS = 1, /* generic success code */
|
||||||
|
STOPVAL_REACHED = 2,
|
||||||
|
FTOL_REACHED = 3,
|
||||||
|
XTOL_REACHED = 4,
|
||||||
|
MAXEVAL_REACHED = 5,
|
||||||
|
MAXTIME_REACHED = 6
|
||||||
|
};
|
||||||
|
// GEN_ENUMS_HERE
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
typedef nlopt_func func; // nlopt::func synoynm
|
||||||
|
typedef nlopt_mfunc mfunc; // nlopt::mfunc synoynm
|
||||||
|
|
||||||
|
// alternative to nlopt_func that takes std::vector<double>
|
||||||
|
// ... unfortunately requires a data copy
|
||||||
|
typedef double (*vfunc)(const std::vector<double> &x,
|
||||||
|
std::vector<double> &grad, void *data);
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// NLopt-specific exceptions (corresponding to error codes):
|
||||||
|
class roundoff_limited : public std::runtime_error {
|
||||||
|
public:
|
||||||
|
roundoff_limited() : std::runtime_error("nlopt roundoff-limited") {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class forced_stop : public std::runtime_error {
|
||||||
|
public:
|
||||||
|
forced_stop() : std::runtime_error("nlopt forced stop") {}
|
||||||
|
};
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class opt {
|
||||||
|
private:
|
||||||
|
nlopt_opt o;
|
||||||
|
|
||||||
|
void mythrow(nlopt_result ret) const {
|
||||||
|
switch (ret) {
|
||||||
|
case NLOPT_FAILURE: throw std::runtime_error("nlopt failure");
|
||||||
|
case NLOPT_OUT_OF_MEMORY: throw std::bad_alloc();
|
||||||
|
case NLOPT_INVALID_ARGS: throw std::invalid_argument("nlopt invalid argument");
|
||||||
|
case NLOPT_ROUNDOFF_LIMITED: throw roundoff_limited();
|
||||||
|
case NLOPT_FORCED_STOP: throw forced_stop();
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
opt *o;
|
||||||
|
mfunc mf; func f; void *f_data;
|
||||||
|
vfunc vf;
|
||||||
|
nlopt_munge munge_destroy, munge_copy; // non-NULL for SWIG wrappers
|
||||||
|
} myfunc_data;
|
||||||
|
|
||||||
|
// free/destroy f_data in nlopt_destroy and nlopt_copy, respectively
|
||||||
|
static void *free_myfunc_data(void *p) {
|
||||||
|
myfunc_data *d = (myfunc_data *) p;
|
||||||
|
if (d) {
|
||||||
|
if (d->f_data && d->munge_destroy) d->munge_destroy(d->f_data);
|
||||||
|
delete d;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
static void *dup_myfunc_data(void *p) {
|
||||||
|
myfunc_data *d = (myfunc_data *) p;
|
||||||
|
if (d) {
|
||||||
|
void *f_data;
|
||||||
|
if (d->f_data && d->munge_copy) {
|
||||||
|
f_data = d->munge_copy(d->f_data);
|
||||||
|
if (!f_data) return NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
f_data = d->f_data;
|
||||||
|
myfunc_data *dnew = new myfunc_data;
|
||||||
|
if (dnew) {
|
||||||
|
*dnew = *d;
|
||||||
|
dnew->f_data = f_data;
|
||||||
|
}
|
||||||
|
return (void*) dnew;
|
||||||
|
}
|
||||||
|
else return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// nlopt_func wrapper that catches exceptions
|
||||||
|
static double myfunc(unsigned n, const double *x, double *grad, void *d_) {
|
||||||
|
myfunc_data *d = reinterpret_cast<myfunc_data*>(d_);
|
||||||
|
try {
|
||||||
|
return d->f(n, x, grad, d->f_data);
|
||||||
|
}
|
||||||
|
catch (std::bad_alloc&)
|
||||||
|
{ d->o->forced_stop_reason = NLOPT_OUT_OF_MEMORY; }
|
||||||
|
catch (std::invalid_argument&)
|
||||||
|
{ d->o->forced_stop_reason = NLOPT_INVALID_ARGS; }
|
||||||
|
catch (roundoff_limited&)
|
||||||
|
{ d->o->forced_stop_reason = NLOPT_ROUNDOFF_LIMITED; }
|
||||||
|
catch (forced_stop&)
|
||||||
|
{ d->o->forced_stop_reason = NLOPT_FORCED_STOP; }
|
||||||
|
catch (...)
|
||||||
|
{ d->o->forced_stop_reason = NLOPT_FAILURE; }
|
||||||
|
d->o->force_stop(); // stop gracefully, opt::optimize will re-throw
|
||||||
|
return HUGE_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// nlopt_mfunc wrapper that catches exceptions
|
||||||
|
static void mymfunc(unsigned m, double *result,
|
||||||
|
unsigned n, const double *x, double *grad, void *d_) {
|
||||||
|
myfunc_data *d = reinterpret_cast<myfunc_data*>(d_);
|
||||||
|
try {
|
||||||
|
d->mf(m, result, n, x, grad, d->f_data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch (std::bad_alloc&)
|
||||||
|
{ d->o->forced_stop_reason = NLOPT_OUT_OF_MEMORY; }
|
||||||
|
catch (std::invalid_argument&)
|
||||||
|
{ d->o->forced_stop_reason = NLOPT_INVALID_ARGS; }
|
||||||
|
catch (roundoff_limited&)
|
||||||
|
{ d->o->forced_stop_reason = NLOPT_ROUNDOFF_LIMITED; }
|
||||||
|
catch (forced_stop&)
|
||||||
|
{ d->o->forced_stop_reason = NLOPT_FORCED_STOP; }
|
||||||
|
catch (...)
|
||||||
|
{ d->o->forced_stop_reason = NLOPT_FAILURE; }
|
||||||
|
d->o->force_stop(); // stop gracefully, opt::optimize will re-throw
|
||||||
|
for (unsigned i = 0; i < m; ++i) result[i] = HUGE_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<double> xtmp, gradtmp, gradtmp0; // scratch for myvfunc
|
||||||
|
|
||||||
|
// nlopt_func wrapper, using std::vector<double>
|
||||||
|
static double myvfunc(unsigned n, const double *x, double *grad, void *d_){
|
||||||
|
myfunc_data *d = reinterpret_cast<myfunc_data*>(d_);
|
||||||
|
try {
|
||||||
|
std::vector<double> &xv = d->o->xtmp;
|
||||||
|
if (n) std::memcpy(&xv[0], x, n * sizeof(double));
|
||||||
|
double val=d->vf(xv, grad ? d->o->gradtmp : d->o->gradtmp0, d->f_data);
|
||||||
|
if (grad && n) {
|
||||||
|
std::vector<double> &gradv = d->o->gradtmp;
|
||||||
|
std::memcpy(grad, &gradv[0], n * sizeof(double));
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
catch (std::bad_alloc&)
|
||||||
|
{ d->o->forced_stop_reason = NLOPT_OUT_OF_MEMORY; }
|
||||||
|
catch (std::invalid_argument&)
|
||||||
|
{ d->o->forced_stop_reason = NLOPT_INVALID_ARGS; }
|
||||||
|
catch (roundoff_limited&)
|
||||||
|
{ d->o->forced_stop_reason = NLOPT_ROUNDOFF_LIMITED; }
|
||||||
|
catch (forced_stop&)
|
||||||
|
{ d->o->forced_stop_reason = NLOPT_FORCED_STOP; }
|
||||||
|
catch (...)
|
||||||
|
{ d->o->forced_stop_reason = NLOPT_FAILURE; }
|
||||||
|
d->o->force_stop(); // stop gracefully, opt::optimize will re-throw
|
||||||
|
return HUGE_VAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void alloc_tmp() {
|
||||||
|
if (xtmp.size() != nlopt_get_dimension(o)) {
|
||||||
|
xtmp = std::vector<double>(nlopt_get_dimension(o));
|
||||||
|
gradtmp = std::vector<double>(nlopt_get_dimension(o));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result last_result;
|
||||||
|
double last_optf;
|
||||||
|
nlopt_result forced_stop_reason;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// Constructors etc.
|
||||||
|
opt() : o(NULL), xtmp(0), gradtmp(0), gradtmp0(0),
|
||||||
|
last_result(nlopt::FAILURE), last_optf(HUGE_VAL),
|
||||||
|
forced_stop_reason(NLOPT_FORCED_STOP) {}
|
||||||
|
~opt() { nlopt_destroy(o); }
|
||||||
|
opt(algorithm a, unsigned n) :
|
||||||
|
o(nlopt_create(nlopt_algorithm(a), n)),
|
||||||
|
xtmp(0), gradtmp(0), gradtmp0(0),
|
||||||
|
last_result(nlopt::FAILURE), last_optf(HUGE_VAL),
|
||||||
|
forced_stop_reason(NLOPT_FORCED_STOP) {
|
||||||
|
if (!o) throw std::bad_alloc();
|
||||||
|
nlopt_set_munge(o, free_myfunc_data, dup_myfunc_data);
|
||||||
|
}
|
||||||
|
opt(const opt& f) : o(nlopt_copy(f.o)),
|
||||||
|
xtmp(f.xtmp), gradtmp(f.gradtmp), gradtmp0(0),
|
||||||
|
last_result(f.last_result), last_optf(f.last_optf),
|
||||||
|
forced_stop_reason(f.forced_stop_reason) {
|
||||||
|
if (f.o && !o) throw std::bad_alloc();
|
||||||
|
}
|
||||||
|
opt& operator=(opt const& f) {
|
||||||
|
if (this == &f) return *this; // self-assignment
|
||||||
|
nlopt_destroy(o);
|
||||||
|
o = nlopt_copy(f.o);
|
||||||
|
if (f.o && !o) throw std::bad_alloc();
|
||||||
|
xtmp = f.xtmp; gradtmp = f.gradtmp;
|
||||||
|
last_result = f.last_result; last_optf = f.last_optf;
|
||||||
|
forced_stop_reason = f.forced_stop_reason;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do the optimization:
|
||||||
|
result optimize(std::vector<double> &x, double &opt_f) {
|
||||||
|
if (o && nlopt_get_dimension(o) != x.size())
|
||||||
|
throw std::invalid_argument("dimension mismatch");
|
||||||
|
forced_stop_reason = NLOPT_FORCED_STOP;
|
||||||
|
nlopt_result ret = nlopt_optimize(o, x.empty() ? NULL : &x[0], &opt_f);
|
||||||
|
last_result = result(ret);
|
||||||
|
last_optf = opt_f;
|
||||||
|
if (ret == NLOPT_FORCED_STOP)
|
||||||
|
mythrow(forced_stop_reason);
|
||||||
|
mythrow(ret);
|
||||||
|
return last_result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// variant mainly useful for SWIG wrappers:
|
||||||
|
std::vector<double> optimize(const std::vector<double> &x0) {
|
||||||
|
std::vector<double> x(x0);
|
||||||
|
last_result = optimize(x, last_optf);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
result last_optimize_result() const { return last_result; }
|
||||||
|
double last_optimum_value() const { return last_optf; }
|
||||||
|
|
||||||
|
// accessors:
|
||||||
|
algorithm get_algorithm() const {
|
||||||
|
if (!o) throw std::runtime_error("uninitialized nlopt::opt");
|
||||||
|
return algorithm(nlopt_get_algorithm(o));
|
||||||
|
}
|
||||||
|
const char *get_algorithm_name() const {
|
||||||
|
if (!o) throw std::runtime_error("uninitialized nlopt::opt");
|
||||||
|
return nlopt_algorithm_name(nlopt_get_algorithm(o));
|
||||||
|
}
|
||||||
|
unsigned get_dimension() const {
|
||||||
|
if (!o) throw std::runtime_error("uninitialized nlopt::opt");
|
||||||
|
return nlopt_get_dimension(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the objective function
|
||||||
|
void set_min_objective(func f, void *f_data) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->f = f; d->f_data = f_data; d->mf = NULL; d->vf = NULL;
|
||||||
|
d->munge_destroy = d->munge_copy = NULL;
|
||||||
|
mythrow(nlopt_set_min_objective(o, myfunc, d)); // d freed via o
|
||||||
|
}
|
||||||
|
void set_min_objective(vfunc vf, void *f_data) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->f = NULL; d->f_data = f_data; d->mf = NULL; d->vf = vf;
|
||||||
|
d->munge_destroy = d->munge_copy = NULL;
|
||||||
|
mythrow(nlopt_set_min_objective(o, myvfunc, d)); // d freed via o
|
||||||
|
alloc_tmp();
|
||||||
|
}
|
||||||
|
void set_max_objective(func f, void *f_data) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->f = f; d->f_data = f_data; d->mf = NULL; d->vf = NULL;
|
||||||
|
d->munge_destroy = d->munge_copy = NULL;
|
||||||
|
mythrow(nlopt_set_max_objective(o, myfunc, d)); // d freed via o
|
||||||
|
}
|
||||||
|
void set_max_objective(vfunc vf, void *f_data) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->f = NULL; d->f_data = f_data; d->mf = NULL; d->vf = vf;
|
||||||
|
d->munge_destroy = d->munge_copy = NULL;
|
||||||
|
mythrow(nlopt_set_max_objective(o, myvfunc, d)); // d freed via o
|
||||||
|
alloc_tmp();
|
||||||
|
}
|
||||||
|
|
||||||
|
// for internal use in SWIG wrappers -- variant that
|
||||||
|
// takes ownership of f_data, with munging for destroy/copy
|
||||||
|
void set_min_objective(func f, void *f_data,
|
||||||
|
nlopt_munge md, nlopt_munge mc) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->f = f; d->f_data = f_data; d->mf = NULL; d->vf = NULL;
|
||||||
|
d->munge_destroy = md; d->munge_copy = mc;
|
||||||
|
mythrow(nlopt_set_min_objective(o, myfunc, d)); // d freed via o
|
||||||
|
}
|
||||||
|
void set_max_objective(func f, void *f_data,
|
||||||
|
nlopt_munge md, nlopt_munge mc) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->f = f; d->f_data = f_data; d->mf = NULL; d->vf = NULL;
|
||||||
|
d->munge_destroy = md; d->munge_copy = mc;
|
||||||
|
mythrow(nlopt_set_max_objective(o, myfunc, d)); // d freed via o
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nonlinear constraints:
|
||||||
|
|
||||||
|
void remove_inequality_constraints() {
|
||||||
|
nlopt_result ret = nlopt_remove_inequality_constraints(o);
|
||||||
|
mythrow(ret);
|
||||||
|
}
|
||||||
|
void add_inequality_constraint(func f, void *f_data, double tol=0) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->f = f; d->f_data = f_data; d->mf = NULL; d->vf = NULL;
|
||||||
|
d->munge_destroy = d->munge_copy = NULL;
|
||||||
|
mythrow(nlopt_add_inequality_constraint(o, myfunc, d, tol));
|
||||||
|
}
|
||||||
|
void add_inequality_constraint(vfunc vf, void *f_data, double tol=0) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->f = NULL; d->f_data = f_data; d->mf = NULL; d->vf = vf;
|
||||||
|
d->munge_destroy = d->munge_copy = NULL;
|
||||||
|
mythrow(nlopt_add_inequality_constraint(o, myvfunc, d, tol));
|
||||||
|
alloc_tmp();
|
||||||
|
}
|
||||||
|
void add_inequality_mconstraint(mfunc mf, void *f_data,
|
||||||
|
const std::vector<double> &tol) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->mf = mf; d->f_data = f_data; d->f = NULL; d->vf = NULL;
|
||||||
|
d->munge_destroy = d->munge_copy = NULL;
|
||||||
|
mythrow(nlopt_add_inequality_mconstraint(o, tol.size(), mymfunc, d,
|
||||||
|
tol.empty() ? NULL : &tol[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
void remove_equality_constraints() {
|
||||||
|
nlopt_result ret = nlopt_remove_equality_constraints(o);
|
||||||
|
mythrow(ret);
|
||||||
|
}
|
||||||
|
void add_equality_constraint(func f, void *f_data, double tol=0) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->f = f; d->f_data = f_data; d->mf = NULL; d->vf = NULL;
|
||||||
|
d->munge_destroy = d->munge_copy = NULL;
|
||||||
|
mythrow(nlopt_add_equality_constraint(o, myfunc, d, tol));
|
||||||
|
}
|
||||||
|
void add_equality_constraint(vfunc vf, void *f_data, double tol=0) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->f = NULL; d->f_data = f_data; d->mf = NULL; d->vf = vf;
|
||||||
|
d->munge_destroy = d->munge_copy = NULL;
|
||||||
|
mythrow(nlopt_add_equality_constraint(o, myvfunc, d, tol));
|
||||||
|
alloc_tmp();
|
||||||
|
}
|
||||||
|
void add_equality_mconstraint(mfunc mf, void *f_data,
|
||||||
|
const std::vector<double> &tol) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->mf = mf; d->f_data = f_data; d->f = NULL; d->vf = NULL;
|
||||||
|
d->munge_destroy = d->munge_copy = NULL;
|
||||||
|
mythrow(nlopt_add_equality_mconstraint(o, tol.size(), mymfunc, d,
|
||||||
|
tol.empty() ? NULL : &tol[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
// For internal use in SWIG wrappers (see also above)
|
||||||
|
void add_inequality_constraint(func f, void *f_data,
|
||||||
|
nlopt_munge md, nlopt_munge mc,
|
||||||
|
double tol=0) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->f = f; d->f_data = f_data; d->mf = NULL; d->vf = NULL;
|
||||||
|
d->munge_destroy = md; d->munge_copy = mc;
|
||||||
|
mythrow(nlopt_add_inequality_constraint(o, myfunc, d, tol));
|
||||||
|
}
|
||||||
|
void add_equality_constraint(func f, void *f_data,
|
||||||
|
nlopt_munge md, nlopt_munge mc,
|
||||||
|
double tol=0) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->f = f; d->f_data = f_data; d->mf = NULL; d->vf = NULL;
|
||||||
|
d->munge_destroy = md; d->munge_copy = mc;
|
||||||
|
mythrow(nlopt_add_equality_constraint(o, myfunc, d, tol));
|
||||||
|
}
|
||||||
|
void add_inequality_mconstraint(mfunc mf, void *f_data,
|
||||||
|
nlopt_munge md, nlopt_munge mc,
|
||||||
|
const std::vector<double> &tol) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->mf = mf; d->f_data = f_data; d->f = NULL; d->vf = NULL;
|
||||||
|
d->munge_destroy = md; d->munge_copy = mc;
|
||||||
|
mythrow(nlopt_add_inequality_mconstraint(o, tol.size(), mymfunc, d,
|
||||||
|
tol.empty() ? NULL : &tol[0]));
|
||||||
|
}
|
||||||
|
void add_equality_mconstraint(mfunc mf, void *f_data,
|
||||||
|
nlopt_munge md, nlopt_munge mc,
|
||||||
|
const std::vector<double> &tol) {
|
||||||
|
myfunc_data *d = new myfunc_data;
|
||||||
|
if (!d) throw std::bad_alloc();
|
||||||
|
d->o = this; d->mf = mf; d->f_data = f_data; d->f = NULL; d->vf = NULL;
|
||||||
|
d->munge_destroy = md; d->munge_copy = mc;
|
||||||
|
mythrow(nlopt_add_equality_mconstraint(o, tol.size(), mymfunc, d,
|
||||||
|
tol.empty() ? NULL : &tol[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
#define NLOPT_GETSET_VEC(name) \
|
||||||
|
void set_##name(double val) { \
|
||||||
|
mythrow(nlopt_set_##name##1(o, val)); \
|
||||||
|
} \
|
||||||
|
void get_##name(std::vector<double> &v) const { \
|
||||||
|
if (o && nlopt_get_dimension(o) != v.size()) \
|
||||||
|
throw std::invalid_argument("dimension mismatch"); \
|
||||||
|
mythrow(nlopt_get_##name(o, v.empty() ? NULL : &v[0])); \
|
||||||
|
} \
|
||||||
|
std::vector<double> get_##name() const { \
|
||||||
|
if (!o) throw std::runtime_error("uninitialized nlopt::opt"); \
|
||||||
|
std::vector<double> v(nlopt_get_dimension(o)); \
|
||||||
|
get_##name(v); \
|
||||||
|
return v; \
|
||||||
|
} \
|
||||||
|
void set_##name(const std::vector<double> &v) { \
|
||||||
|
if (o && nlopt_get_dimension(o) != v.size()) \
|
||||||
|
throw std::invalid_argument("dimension mismatch"); \
|
||||||
|
mythrow(nlopt_set_##name(o, v.empty() ? NULL : &v[0])); \
|
||||||
|
}
|
||||||
|
|
||||||
|
NLOPT_GETSET_VEC(lower_bounds)
|
||||||
|
NLOPT_GETSET_VEC(upper_bounds)
|
||||||
|
|
||||||
|
// stopping criteria:
|
||||||
|
|
||||||
|
#define NLOPT_GETSET(T, name) \
|
||||||
|
T get_##name() const { \
|
||||||
|
if (!o) throw std::runtime_error("uninitialized nlopt::opt"); \
|
||||||
|
return nlopt_get_##name(o); \
|
||||||
|
} \
|
||||||
|
void set_##name(T name) { \
|
||||||
|
mythrow(nlopt_set_##name(o, name)); \
|
||||||
|
}
|
||||||
|
NLOPT_GETSET(double, stopval)
|
||||||
|
NLOPT_GETSET(double, ftol_rel)
|
||||||
|
NLOPT_GETSET(double, ftol_abs)
|
||||||
|
NLOPT_GETSET(double, xtol_rel)
|
||||||
|
NLOPT_GETSET_VEC(xtol_abs)
|
||||||
|
NLOPT_GETSET(int, maxeval)
|
||||||
|
NLOPT_GETSET(double, maxtime)
|
||||||
|
|
||||||
|
NLOPT_GETSET(int, force_stop)
|
||||||
|
void force_stop() { set_force_stop(1); }
|
||||||
|
|
||||||
|
// algorithm-specific parameters:
|
||||||
|
|
||||||
|
void set_local_optimizer(const opt &lo) {
|
||||||
|
nlopt_result ret = nlopt_set_local_optimizer(o, lo.o);
|
||||||
|
mythrow(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
NLOPT_GETSET(unsigned, population)
|
||||||
|
NLOPT_GETSET(unsigned, vector_storage)
|
||||||
|
NLOPT_GETSET_VEC(initial_step)
|
||||||
|
|
||||||
|
void set_default_initial_step(const std::vector<double> &x) {
|
||||||
|
nlopt_result ret
|
||||||
|
= nlopt_set_default_initial_step(o, x.empty() ? NULL : &x[0]);
|
||||||
|
mythrow(ret);
|
||||||
|
}
|
||||||
|
void get_initial_step(const std::vector<double> &x, std::vector<double> &dx) const {
|
||||||
|
if (o && (nlopt_get_dimension(o) != x.size()
|
||||||
|
|| nlopt_get_dimension(o) != dx.size()))
|
||||||
|
throw std::invalid_argument("dimension mismatch");
|
||||||
|
nlopt_result ret = nlopt_get_initial_step(o, x.empty() ? NULL : &x[0],
|
||||||
|
dx.empty() ? NULL : &dx[0]);
|
||||||
|
mythrow(ret);
|
||||||
|
}
|
||||||
|
std::vector<double> get_initial_step_(const std::vector<double> &x) const {
|
||||||
|
if (!o) throw std::runtime_error("uninitialized nlopt::opt");
|
||||||
|
std::vector<double> v(nlopt_get_dimension(o));
|
||||||
|
get_initial_step(x, v);
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#undef NLOPT_GETSET
|
||||||
|
#undef NLOPT_GETSET_VEC
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
inline void srand(unsigned long seed) { nlopt_srand(seed); }
|
||||||
|
inline void srand_time() { nlopt_srand_time(); }
|
||||||
|
inline void version(int &major, int &minor, int &bugfix) {
|
||||||
|
nlopt_version(&major, &minor, &bugfix);
|
||||||
|
}
|
||||||
|
inline int version_major() {
|
||||||
|
int major, minor, bugfix;
|
||||||
|
nlopt_version(&major, &minor, &bugfix);
|
||||||
|
return major;
|
||||||
|
}
|
||||||
|
inline int version_minor() {
|
||||||
|
int major, minor, bugfix;
|
||||||
|
nlopt_version(&major, &minor, &bugfix);
|
||||||
|
return minor;
|
||||||
|
}
|
||||||
|
inline int version_bugfix() {
|
||||||
|
int major, minor, bugfix;
|
||||||
|
nlopt_version(&major, &minor, &bugfix);
|
||||||
|
return bugfix;
|
||||||
|
}
|
||||||
|
inline const char *algorithm_name(algorithm a) {
|
||||||
|
return nlopt_algorithm_name(nlopt_algorithm(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
} // namespace nlopt
|
||||||
|
|
||||||
|
#endif /* NLOPT_HPP */
|
416
project_template/project_template.cpp
Normal file
416
project_template/project_template.cpp
Normal file
@ -0,0 +1,416 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include "Method.h"
|
||||||
|
#include "Dsa.h"
|
||||||
|
#include "Aic.h"
|
||||||
|
#include "AicWeights.h"
|
||||||
|
#include "Normalization.h"
|
||||||
|
#include "Mape.h"
|
||||||
|
#include "SMape.h"
|
||||||
|
#include "Vovk.h"
|
||||||
|
#include "NoTrendNoSeasonality.h"
|
||||||
|
#include "NoTrendAddSeasonality.h"
|
||||||
|
#include "NoTrendMultSeasonality.h"
|
||||||
|
#include "AddTrendNoSeasonality.h"
|
||||||
|
#include "AddTrendAddSeasonality.h"
|
||||||
|
#include "AddTrendMultSeasonality.h"
|
||||||
|
#include "MultTrendNoSeasonality.h"
|
||||||
|
#include "MultTrendAddSeasonality.h"
|
||||||
|
#include "MultTrendMultSeasonality.h"
|
||||||
|
#include "DATrendNoSeasonality.h"
|
||||||
|
#include "DATrendAddSeasonality.h"
|
||||||
|
#include "DATrendMultSeasonality.h"
|
||||||
|
#include "DMTrendNoSeasonality.h"
|
||||||
|
#include "DMTrendAddSeasonality.h"
|
||||||
|
#include "DMTrendMultSeasonality.h"
|
||||||
|
#include "Tsaur.h"
|
||||||
|
#include "A.h"
|
||||||
|
#include "Fuzzy.h"
|
||||||
|
#include "FuzzyWithSets.h"
|
||||||
|
#include "File.h"
|
||||||
|
#include <vector>
|
||||||
|
#include "Param.h"
|
||||||
|
#include <sstream>
|
||||||
|
#include <direct.h>
|
||||||
|
#include <string>
|
||||||
|
#include <limits>
|
||||||
|
#include <math.h>
|
||||||
|
#include "Transformation.h"
|
||||||
|
#include "nlopt.hpp"
|
||||||
|
#include "nlopt.h"
|
||||||
|
#include "BIC.h"
|
||||||
|
|
||||||
|
|
||||||
|
int iMethod; // íîìåð òåêóùåãî ìåòîäà
|
||||||
|
const int n = 29; // êîëè÷åñòâî ìåòîäîâ, ÷òîá ëèøíåãî ïàìÿòè íå æðàòü
|
||||||
|
int numberParam; // ÷èñëî ïàðàìåòðîâ ó ìåòîäà
|
||||||
|
Method** m = new Method*[n];
|
||||||
|
Estimation* est1 = new SMape();
|
||||||
|
int ii; // ñ÷åò÷èê èòåðàöèé
|
||||||
|
|
||||||
|
double round (double value) {
|
||||||
|
return floor(value + 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
double myRound(double num) {
|
||||||
|
double n = ((double)round(num * 1000)) / 1000;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void printTs(vector<double> ts) {
|
||||||
|
for (unsigned int i = 0; i < ts.size(); i++) {
|
||||||
|
cout << ts[i];
|
||||||
|
cout << " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double getEstimation(const std::vector<double> &x, std::vector<double> &grad, void *f_data)
|
||||||
|
{
|
||||||
|
ii++; // ñ÷åò÷èê èòåðàöèé
|
||||||
|
|
||||||
|
int radix = 10; //ñèñòåìà ñ÷èñëåíèÿ
|
||||||
|
char sbuffer[10]; //ðåçóëüòàò
|
||||||
|
|
||||||
|
for (int iiParam = 0; iiParam < numberParam; iiParam++)
|
||||||
|
{
|
||||||
|
|
||||||
|
m[iMethod]->setParam(itoa(iiParam, sbuffer, radix), myRound(x[iiParam]));
|
||||||
|
}
|
||||||
|
|
||||||
|
m[iMethod]->createModelForEstimation();
|
||||||
|
|
||||||
|
double smapeValue = myRound(est1->getValue(m[iMethod]->x, m[iMethod]->getForecast()));
|
||||||
|
return smapeValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
|
||||||
|
Param* bestParams = new Param();
|
||||||
|
double bestSmape = DBL_MAX;
|
||||||
|
double bestAic = DBL_MAX;
|
||||||
|
int bestMethodIndex = 0;
|
||||||
|
|
||||||
|
setlocale(LC_ALL, "Russian");
|
||||||
|
string path;
|
||||||
|
string fileName;
|
||||||
|
string s;
|
||||||
|
if (argc < 1) {
|
||||||
|
cout << "set ts file like 'project_template.exe 1.csv count_forecast period!!!";
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
stringstream ss;
|
||||||
|
ss << argv[1];
|
||||||
|
ss >> s;
|
||||||
|
int found = 0;
|
||||||
|
int offset =0;
|
||||||
|
do {
|
||||||
|
found = s.find("\\", found +1);
|
||||||
|
if (found > 0) {
|
||||||
|
offset = found;
|
||||||
|
cout << found << "\n";
|
||||||
|
}
|
||||||
|
} while (found!=std::string::npos);
|
||||||
|
if (offset ==0) {
|
||||||
|
fileName = s.substr(offset, s.length());
|
||||||
|
} else {
|
||||||
|
fileName = s.substr(offset+1, s.length());
|
||||||
|
}
|
||||||
|
path = s.substr(0, offset);
|
||||||
|
}
|
||||||
|
// îáúåêò äëÿ ðàáîòû ñ ôàéëàìè: çàãðóçèòü è ñîõðàíèòü ÂÐ
|
||||||
|
vector<double> timeSeries = File::readFile(argv[1]);
|
||||||
|
Transformation *transform = new Transformation(timeSeries);
|
||||||
|
transform->seasonalPeriod = atof(argv[3]);
|
||||||
|
// timeSeries = transform->Normalization();
|
||||||
|
//transform->setTimeSeries(tsTransform);
|
||||||
|
transform->lambdaEstimation();
|
||||||
|
timeSeries = transform->ModifiedBoxCox();
|
||||||
|
|
||||||
|
Normalization * norm = new Normalization();
|
||||||
|
//timeSeries = norm->normalizeTimeSeria(timeSeries);
|
||||||
|
|
||||||
|
// ñêîëüêî òî÷åê áóäåì ïðîãíîçèðîâàòü
|
||||||
|
int pointForecast = 18;
|
||||||
|
if (strcmp(argv[2], "") != 0) {
|
||||||
|
pointForecast = atof(argv[2]);
|
||||||
|
}
|
||||||
|
int p = 12;
|
||||||
|
if (strcmp(argv[3], "") != 0) {
|
||||||
|
p = atof(argv[3]);
|
||||||
|
}
|
||||||
|
double alpha = 0.1;
|
||||||
|
double delta = 0.2;
|
||||||
|
double gamma = 0.4;
|
||||||
|
double phi = 0.1;
|
||||||
|
int countRulesIn = 1;
|
||||||
|
int countFuzzyParts = 2;
|
||||||
|
// äàëåå çàäàåì ïàðàìåòðû, ñïåöèôè÷íûå äëÿ ìåòîäîâ
|
||||||
|
//...
|
||||||
|
// òàê êàê èñïîëüçîâàòü áóäåì âñå ìåòîäû (èëè îáúåäèíÿòü â êîëëåêòèâû) íóæíî
|
||||||
|
// âñå èõ ïðîèíèöèàëèçèðîâàòü è çàãíàòü â ìàññèâ
|
||||||
|
|
||||||
|
m[0] = new NoTrendNoSeasonality(timeSeries, pointForecast);
|
||||||
|
m[1] = new NoTrendAddSeasonality(timeSeries, pointForecast);
|
||||||
|
m[2] = new NoTrendMultSeasonality(timeSeries, pointForecast);
|
||||||
|
|
||||||
|
m[3] = new AddTrendNoSeasonality(timeSeries, pointForecast);
|
||||||
|
m[4] = new MultTrendNoSeasonality(timeSeries, pointForecast);
|
||||||
|
m[5] = new DATrendNoSeasonality(timeSeries, pointForecast);
|
||||||
|
m[6] = new DMTrendNoSeasonality(timeSeries, pointForecast);
|
||||||
|
|
||||||
|
m[7] = new AddTrendAddSeasonality(timeSeries, pointForecast);
|
||||||
|
m[8] = new MultTrendAddSeasonality(timeSeries, pointForecast);
|
||||||
|
m[9] = new DATrendAddSeasonality(timeSeries, pointForecast);
|
||||||
|
m[10] = new DMTrendAddSeasonality(timeSeries, pointForecast);
|
||||||
|
|
||||||
|
m[11] = new AddTrendMultSeasonality(timeSeries, pointForecast);
|
||||||
|
m[12] = new MultTrendMultSeasonality(timeSeries, pointForecast);
|
||||||
|
m[13] = new DATrendMultSeasonality(timeSeries, pointForecast);
|
||||||
|
m[14] = new DMTrendMultSeasonality(timeSeries, pointForecast);
|
||||||
|
m[15] = new Dsa(timeSeries, pointForecast);
|
||||||
|
m[16] = new Fuzzy("None", "None", timeSeries, pointForecast);
|
||||||
|
m[17] = new Fuzzy("Add", "None", timeSeries, pointForecast);
|
||||||
|
m[18] = new Fuzzy("None", "Add", timeSeries, pointForecast);
|
||||||
|
m[19] = new Fuzzy("Add", "Add", timeSeries, pointForecast);
|
||||||
|
m[20] = new FuzzyWithSets("None", "None", timeSeries, pointForecast);
|
||||||
|
m[21] = new FuzzyWithSets("None", "Add", timeSeries, pointForecast);
|
||||||
|
m[22] = new FuzzyWithSets("None", "Mult", timeSeries, pointForecast);
|
||||||
|
m[23] = new FuzzyWithSets("Add", "None", timeSeries, pointForecast);
|
||||||
|
m[24] = new FuzzyWithSets("Add", "Add", timeSeries, pointForecast);
|
||||||
|
m[25] = new FuzzyWithSets("Add", "Mult", timeSeries, pointForecast);
|
||||||
|
m[26] = new FuzzyWithSets("Mult", "None", timeSeries, pointForecast);
|
||||||
|
m[27] = new FuzzyWithSets("Mult", "Add", timeSeries, pointForecast);
|
||||||
|
m[28] = new FuzzyWithSets("Mult", "Mult", timeSeries, pointForecast);
|
||||||
|
//m[29] = new Tsaur(timeSeries, pointForecast);
|
||||||
|
|
||||||
|
AicWeights *aicWeights = new AicWeights();
|
||||||
|
vector<double> aicValues;
|
||||||
|
vector<vector<double>> modelsResults;
|
||||||
|
vector<Param*> optimal;
|
||||||
|
string smapeResults = "";
|
||||||
|
|
||||||
|
for (int i = 15; i < n; i++) {
|
||||||
|
iMethod = i;
|
||||||
|
m[i]->setParam("p", p);
|
||||||
|
// âûçîâåì ìåòîä îïòèìèçàöèè îäíîãî ïàðàìåòðà
|
||||||
|
//Estimation *est1 = new SMape();
|
||||||
|
Estimation *est1 = new Bic(algoritm::RMSE, m[i]->getNamberParam());
|
||||||
|
//optimal.push_back(m[i]->optimize(est1));
|
||||||
|
|
||||||
|
numberParam = m[i]->getNamberParam();
|
||||||
|
|
||||||
|
if (numberParam == 1) // äëÿ îäíîãî ïàðàìåòðà ïðîùå ïåðåáîð ïî ñåòêå
|
||||||
|
{
|
||||||
|
optimal.push_back(m[i]->optimize(est1));
|
||||||
|
m[i]->setParam("alpha", optimal[optimal.size()-1]->alpha);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// âåêòîðà äëÿ íà÷àëüíûõ, ìèíèìàëüíûõ è ìàêñèìàëüíûõ çíà÷åíèé ïàðàìåòðîâ
|
||||||
|
std::vector<double> x(numberParam);
|
||||||
|
std::vector<double> lb(numberParam);
|
||||||
|
std::vector<double> ub(numberParam);
|
||||||
|
|
||||||
|
// óñòàíàâëèâàåì ïàðàìåòðû
|
||||||
|
for (int iParam = 0; iParam < numberParam; iParam++)
|
||||||
|
{
|
||||||
|
lb[iParam] = 0.01; // ìèíèìàëüíîå çíà÷åíèå ïàðàìåòðà
|
||||||
|
ub[iParam] = 0.99; // ìàêñèìàëüíîå çíà÷åíèå ïåðåìåòðà
|
||||||
|
x[iParam] = 0.3; // íà÷àëüíîå çíà÷åíèå ïàðàìåòðà
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñîçäàåì îñíîâíîé ìåòîä îïòèìèçàöèè
|
||||||
|
nlopt::opt opt(nlopt::AUGLAG, numberParam);
|
||||||
|
|
||||||
|
// ñîçäàåì âñïîìàãàòåëüíûé ìåòîä îïòèìèçàöèè
|
||||||
|
nlopt::opt subOpt(nlopt::GN_ORIG_DIRECT_L, numberParam);
|
||||||
|
subOpt.set_lower_bounds(lb);
|
||||||
|
subOpt.set_upper_bounds(ub);
|
||||||
|
|
||||||
|
// óñòàíàâëèâàåì ïàðàìåòðû îñíîâíîãî ìåòîäà îïòèìèçàöèè
|
||||||
|
opt.set_lower_bounds(lb);
|
||||||
|
opt.set_upper_bounds(ub);
|
||||||
|
opt.set_local_optimizer(subOpt);
|
||||||
|
|
||||||
|
// â çàâèñèìîñòè îò ÷èñëà ïàðàìåòðîâ, óñòàíàâëèâàåì êîëè÷åñòâî èòåðàöèé îïòèìèçàöèè
|
||||||
|
if (numberParam == 2)
|
||||||
|
{
|
||||||
|
subOpt.set_maxeval(10000);
|
||||||
|
opt.set_maxeval(10000);
|
||||||
|
}
|
||||||
|
else if (numberParam == 3)
|
||||||
|
{
|
||||||
|
subOpt.set_maxeval(50000);
|
||||||
|
opt.set_maxeval(50000);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
subOpt.set_maxeval(100000);
|
||||||
|
opt.set_maxeval(100000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// çàïóñêàåì îïòèìèçàöèþ
|
||||||
|
// getEstimation - ìåòîä â ñàìîì ââåðõó, êîòðûé âîçâðàùàåò îøèáêó íà êàæäîé èòåðàöèè
|
||||||
|
double minf;
|
||||||
|
opt.set_min_objective(getEstimation, NULL);
|
||||||
|
nlopt::result subResult = opt.optimize(x, minf);
|
||||||
|
|
||||||
|
cout << minf << endl;
|
||||||
|
|
||||||
|
// ïîïûòàåìñÿ óëó÷øèòü ïàðàìåòðû
|
||||||
|
nlopt::opt ssubOpt(nlopt::LN_NELDERMEAD, numberParam);
|
||||||
|
ssubOpt.set_lower_bounds(lb);
|
||||||
|
ssubOpt.set_upper_bounds(ub);
|
||||||
|
ssubOpt.set_maxeval(500);
|
||||||
|
|
||||||
|
ssubOpt.set_min_objective(getEstimation, NULL);
|
||||||
|
nlopt::result Result = ssubOpt.optimize(x, minf);
|
||||||
|
|
||||||
|
cout << minf << endl;
|
||||||
|
if (m[i]->getNamberParam() > 1) {
|
||||||
|
optimal.push_back(new Param());
|
||||||
|
}
|
||||||
|
optimal[optimal.size()-1]->countFuzzyParts = x[0] * 100;
|
||||||
|
optimal[optimal.size()-1]->countRulesIn = x[1] * 5;
|
||||||
|
if (i == 15) {
|
||||||
|
optimal[optimal.size()-1]->sizeLabels = x[2] * 100;
|
||||||
|
} else {
|
||||||
|
optimal[optimal.size()-1]->gamma = x[2];
|
||||||
|
}
|
||||||
|
if (m[i]->getNamberParam() > 3) {
|
||||||
|
optimal[optimal.size()-1]->delta = x[3];
|
||||||
|
if (m[i]->getNamberParam() > 4) {
|
||||||
|
optimal[optimal.size()-1]->alpha = x[4];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// â âåêòîðå x íàéäåííûå ïàðàìåòðû, â min - smape
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ñîçäàåì ìîäåëü äëÿ òåñòèðîâàíèÿ ïðè ïîìîùè âûáðàííîãî ìåòîäà
|
||||||
|
// çàäàåì ïàðàìåòðû
|
||||||
|
m[i]->setParam("alpha", optimal[optimal.size()-1]->alpha);
|
||||||
|
m[i]->setParam("gamma", optimal[optimal.size()-1]->gamma);
|
||||||
|
m[i]->setParam("delta", optimal[optimal.size()-1]->delta);
|
||||||
|
m[i]->setParam("phi", optimal[optimal.size()-1]->phi);
|
||||||
|
m[i]->setParam("countRulesIn", optimal[optimal.size()-1]->countRulesIn);
|
||||||
|
m[i]->setParam("countFuzzyParts", optimal[optimal.size()-1]->countFuzzyParts);
|
||||||
|
m[i]->setParam("lb1", optimal[optimal.size()-1]->lb1);
|
||||||
|
m[i]->setParam("rb1", optimal[optimal.size()-1]->rb1);
|
||||||
|
m[i]->setParam("lb2", optimal[optimal.size()-1]->lb2);
|
||||||
|
m[i]->setParam("rb2", optimal[optimal.size()-1]->rb2);
|
||||||
|
m[i]->setParam("sizeLabels", optimal[optimal.size()-1]->sizeLabels);
|
||||||
|
// ñîçäàåì ìîäåëü
|
||||||
|
m[i]->createModelForEstimation();
|
||||||
|
// âû÷èñëÿåì îøèáêó
|
||||||
|
//aicValues.push_back(aic->getValue(4, m[i]->getXEstimation(), m[i]->getForecast()));
|
||||||
|
//aicValues.push_back(aic->getAiccValue(4, m[i]->getXEstimation(), m[i]->getForecast()));
|
||||||
|
//aicValues.push_back(aic->getBicValue(4, m[i]->getXEstimation(), m[i]->getForecast()));
|
||||||
|
//modelsResults.push_back(m[i]->getForecast());
|
||||||
|
SMape* smape = new SMape();
|
||||||
|
stringstream ss1;
|
||||||
|
ss1 << i;
|
||||||
|
string str1 = ss1.str();
|
||||||
|
stringstream ss2;
|
||||||
|
double sm = smape->getValue(m[i]->x, m[i]->getForecast());
|
||||||
|
double ai = optimal[optimal.size()-1]->estim;
|
||||||
|
ss2 << sm;
|
||||||
|
|
||||||
|
// îïðåäåëÿåì, ÿâëÿþòñÿ ëè äàííûå ïàðàìåòðû ëó÷øèìè
|
||||||
|
if (ai < bestAic) {
|
||||||
|
bestAic = ai;
|
||||||
|
bestParams = optimal[optimal.size()-1];
|
||||||
|
bestMethodIndex = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
string str2 = ss2.str();
|
||||||
|
smapeResults = smapeResults + "Smape for " + str1 + " method: " + str2 + " ";
|
||||||
|
smapeResults = smapeResults + optimal[optimal.size()-1]->toString() + "\n";
|
||||||
|
// ñîçäàåì ìîäåëü ïðè ïîìîùè âûáðàííîãî ìåòîäà
|
||||||
|
// ïîëó÷èì è ñîõðàíèì ïðîãíîç
|
||||||
|
string target = path +"\\"+ fileName+"result";
|
||||||
|
_mkdir(target.c_str());
|
||||||
|
string fileNameOut = target + "\\";
|
||||||
|
char suff[3];
|
||||||
|
itoa(i, suff, 10);
|
||||||
|
fileNameOut.append(suff);
|
||||||
|
fileNameOut.append("out");
|
||||||
|
m[i]->createModel();
|
||||||
|
//File::writeFile(fileNameOut, norm->deNormalizeTimeSeria(m[i]->getForecast()));
|
||||||
|
//transform->setTimeSeries(m[i]->getForecast());
|
||||||
|
//transform->setTimeSeries(transform->invModifiedBoxCox());
|
||||||
|
transform->setTimeSeries(m[i]->getForecast());
|
||||||
|
File::writeFile(fileNameOut, transform->invModifiedBoxCox());
|
||||||
|
|
||||||
|
}
|
||||||
|
Method* bestMethod = m[bestMethodIndex];
|
||||||
|
// ïîñëå òîãî, êàê îòðàáîòàëè âñå ìîäåëè
|
||||||
|
// çàäàåì ëó÷øèå ïàðàìåòðû
|
||||||
|
bestMethod->setParam("alpha", bestParams->alpha);
|
||||||
|
bestMethod->setParam("gamma", bestParams->gamma);
|
||||||
|
bestMethod->setParam("delta", bestParams->delta);
|
||||||
|
|
||||||
|
bestMethod->setParam("phi", bestParams->phi);
|
||||||
|
|
||||||
|
bestMethod->setParam("countRulesIn", bestParams->countRulesIn);
|
||||||
|
bestMethod->setParam("countFuzzyParts", bestParams->countFuzzyParts);
|
||||||
|
bestMethod->setParam("lb1", bestParams->lb1);
|
||||||
|
bestMethod->setParam("rb1", bestParams->rb1);
|
||||||
|
bestMethod->setParam("lb2", bestParams->lb2);
|
||||||
|
bestMethod->setParam("rb2", bestParams->rb2);
|
||||||
|
bestMethod->setParam("sizeLabels", bestParams->sizeLabels);
|
||||||
|
bestMethod->createModel();
|
||||||
|
string target = path +"\\"+ fileName+"result";
|
||||||
|
string fileNameOut = target + "\\";
|
||||||
|
fileNameOut.append("best");
|
||||||
|
char _s[3];
|
||||||
|
itoa(bestMethodIndex, _s, 10);
|
||||||
|
fileNameOut.append(_s);
|
||||||
|
//File::writeFile(fileNameOut, norm->deNormalizeTimeSeria(bestMethod->getForecast()));
|
||||||
|
transform->setTimeSeries(bestMethod->getForecast());
|
||||||
|
File::writeFile(fileNameOut, transform->invModifiedBoxCox());
|
||||||
|
|
||||||
|
|
||||||
|
string smapeFileName = path +"\\"+ fileName+"result\\smape";
|
||||||
|
FILE * file = fopen(smapeFileName.c_str(), "w");
|
||||||
|
if (file) // åñëè åñòü äîñòóï ê ôàéëó,
|
||||||
|
{
|
||||||
|
bool result = fputs(smapeResults.c_str(), file); // è çàïèñûâàåì åå â ôàéë
|
||||||
|
if (!result) // åñëè çàïèñü ïðîèçîøëà óñïåøíî
|
||||||
|
cout << "Ñòðîêà â ôàéë óñïåøíî çàïèñàíà!"; // âûâîäèì ñîîáùåíèå
|
||||||
|
fclose(file);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Vovk *vovk = new Vovk(timeSeries, pointForecast, m);
|
||||||
|
vector<double> res;
|
||||||
|
res.push_back(vovk->getForecast());
|
||||||
|
for (int i = 0; i < pointForecast - 1; i++){
|
||||||
|
//cout << i + 1 << " " << vovk->getForecast() << endl;
|
||||||
|
vovk->updateTS(res[res.size() - 1]);
|
||||||
|
res.push_back(vovk->getForecast());
|
||||||
|
}
|
||||||
|
res = norm->deNormalizeTimeSeria(res);
|
||||||
|
for (int i = 0; i < pointForecast - 1; i++){
|
||||||
|
cout << i + 1 << " " << res[i] << endl;
|
||||||
|
}
|
||||||
|
SMape *smape = new SMape();
|
||||||
|
cout << "Smape for Vovk " << " method: " << smape->getValue(norm->deNormalizeTimeSeria(m[0]->getXEstimation()), res) << "\n";
|
||||||
|
vector<double> weights = aicWeights->calculateWeights(aicValues);
|
||||||
|
vector<double> fuzzyAdoptiveWeights = aicWeights->calculateFuzzyAdaptiveWeights(timeSeries, modelsResults);
|
||||||
|
cout << "Smape for etalon forecast " << " method: " << smape->getValue(m[21]->getXEstimation(), m[21]->getXEstimation()) << "\n";
|
||||||
|
|
||||||
|
delete(m);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
551
project_template/project_template.vcproj
Normal file
551
project_template/project_template.vcproj
Normal file
@ -0,0 +1,551 @@
|
|||||||
|
<?xml version="1.0" encoding="windows-1251"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="9,00"
|
||||||
|
Name="project_template"
|
||||||
|
ProjectGUID="{D68B91E2-1169-4096-AC00-5992226D29DF}"
|
||||||
|
RootNamespace="project_template"
|
||||||
|
Keyword="Win32Proj"
|
||||||
|
AssemblyReferenceSearchPaths=""..\project_template";"..\..\project_template""
|
||||||
|
TargetFrameworkVersion="196613"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(ConfigurationName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
CharacterSet="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
FavorSizeOrSpeed="1"
|
||||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
||||||
|
MinimalRebuild="true"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
UsePrecompiledHeader="2"
|
||||||
|
WarningLevel="3"
|
||||||
|
DebugInformationFormat="4"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
LinkIncremental="2"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="1"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="$(ConfigurationName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
CharacterSet="1"
|
||||||
|
WholeProgramOptimization="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
EnableIntrinsicFunctions="true"
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
UsePrecompiledHeader="2"
|
||||||
|
WarningLevel="3"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
LinkIncremental="1"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="1"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\BIC.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\File.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Median.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Method.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Normalization.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Param.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Preparator.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\project_template.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\RMSE.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\stdafx.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
UsePrecompiledHeader="1"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Transformation.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Tsaur.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Vovk.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<Filter
|
||||||
|
Name="Methods"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\AddTrendAddSeasonality.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\AddTrendMultSeasonality.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\AddTrendNoSeasonality.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\DATrendAddSeasonality.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\DATrendMultSeasonality.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\DATrendNoSeasonality.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\DMTrendAddSeasonality.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\DMTrendMultSeasonality.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\DMTrendNoSeasonality.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Dsa.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\MultTrendAddSeasonality.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\MultTrendMultSeasonality.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\MultTrendNoSeasonality.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\NoTrendAddSeasonality.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\NoTrendMultSeasonality.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\NoTrendNoSeasonality.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Estimations"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Aic.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\AicWeights.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Mape.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\SMape.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Fuzzy"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\A.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Fuzzy.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\FuzzyWithSets.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\BIC.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Estimation.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\File.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Median.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Method.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\nlopt.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\nlopt.hpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Normalization.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Param.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Preparator.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\RMSE.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\stdafx.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\targetver.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\TrackingControlSignal.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Transformation.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Tsaur.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Vovk.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<Filter
|
||||||
|
Name="Methods"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\AddTrendAddSeasonality.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\AddTrendMultSeasonality.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\AddTrendNoSeasonality.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\DATrendAddSeasonality.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\DATrendMultSeasonality.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\DATrendNoSeasonality.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\DMTrendAddSeasonality.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\DMTrendMultSeasonality.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\DMTrendNoSeasonality.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Dsa.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\MultTrendAddSeasonality.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\MultTrendMultSeasonality.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\MultTrendNoSeasonality.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\NoTrendAddSeasonality.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\NoTrendMultSeasonality.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\NoTrendNoSeasonality.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Estimations"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Aic.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\AicWeights.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Mape.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\SMape.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Fuzzy"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\A.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\Fuzzy.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\FuzzyWithSets.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Resource Files"
|
||||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
||||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
<File
|
||||||
|
RelativePath=".\ClassDiagram1.cd"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\libnlopt-0.dll"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\libnlopt-0.lib"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\ReadMe.txt"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
@ -0,0 +1,65 @@
|
|||||||
|
<?xml version="1.0" encoding="windows-1251"?>
|
||||||
|
<VisualStudioUserFile
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="9,00"
|
||||||
|
ShowAllFiles="false"
|
||||||
|
>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<DebugSettings
|
||||||
|
Command="$(TargetPath)"
|
||||||
|
WorkingDirectory=""
|
||||||
|
CommandArguments=""
|
||||||
|
Attach="false"
|
||||||
|
DebuggerType="3"
|
||||||
|
Remote="1"
|
||||||
|
RemoteMachine="ADMIN-4A0D49B0D"
|
||||||
|
RemoteCommand=""
|
||||||
|
HttpUrl=""
|
||||||
|
PDBPath=""
|
||||||
|
SQLDebugging=""
|
||||||
|
Environment=""
|
||||||
|
EnvironmentMerge="true"
|
||||||
|
DebuggerFlavor=""
|
||||||
|
MPIRunCommand=""
|
||||||
|
MPIRunArguments=""
|
||||||
|
MPIRunWorkingDirectory=""
|
||||||
|
ApplicationCommand=""
|
||||||
|
ApplicationArguments=""
|
||||||
|
ShimCommand=""
|
||||||
|
MPIAcceptMode=""
|
||||||
|
MPIAcceptFilter=""
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<DebugSettings
|
||||||
|
Command="$(TargetPath)"
|
||||||
|
WorkingDirectory=""
|
||||||
|
CommandArguments=""
|
||||||
|
Attach="false"
|
||||||
|
DebuggerType="3"
|
||||||
|
Remote="1"
|
||||||
|
RemoteMachine="ADMIN-4A0D49B0D"
|
||||||
|
RemoteCommand=""
|
||||||
|
HttpUrl=""
|
||||||
|
PDBPath=""
|
||||||
|
SQLDebugging=""
|
||||||
|
Environment=""
|
||||||
|
EnvironmentMerge="true"
|
||||||
|
DebuggerFlavor=""
|
||||||
|
MPIRunCommand=""
|
||||||
|
MPIRunArguments=""
|
||||||
|
MPIRunWorkingDirectory=""
|
||||||
|
ApplicationCommand=""
|
||||||
|
ApplicationArguments=""
|
||||||
|
ShimCommand=""
|
||||||
|
MPIAcceptMode=""
|
||||||
|
MPIAcceptFilter=""
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
</VisualStudioUserFile>
|
65
project_template/project_template.vcproj.orion-ПК.orion.user
Normal file
65
project_template/project_template.vcproj.orion-ПК.orion.user
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
<?xml version="1.0" encoding="windows-1251"?>
|
||||||
|
<VisualStudioUserFile
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="9,00"
|
||||||
|
ShowAllFiles="true"
|
||||||
|
>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<DebugSettings
|
||||||
|
Command="$(TargetPath)"
|
||||||
|
WorkingDirectory=""
|
||||||
|
CommandArguments="..\\ts\\1 4 1"
|
||||||
|
Attach="false"
|
||||||
|
DebuggerType="3"
|
||||||
|
Remote="1"
|
||||||
|
RemoteMachine="ORION-ÏÊ"
|
||||||
|
RemoteCommand=""
|
||||||
|
HttpUrl=""
|
||||||
|
PDBPath=""
|
||||||
|
SQLDebugging=""
|
||||||
|
Environment=""
|
||||||
|
EnvironmentMerge="true"
|
||||||
|
DebuggerFlavor="0"
|
||||||
|
MPIRunCommand=""
|
||||||
|
MPIRunArguments=""
|
||||||
|
MPIRunWorkingDirectory=""
|
||||||
|
ApplicationCommand=""
|
||||||
|
ApplicationArguments=""
|
||||||
|
ShimCommand=""
|
||||||
|
MPIAcceptMode=""
|
||||||
|
MPIAcceptFilter=""
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<DebugSettings
|
||||||
|
Command="$(TargetPath)"
|
||||||
|
WorkingDirectory=""
|
||||||
|
CommandArguments="..\\ts\1"
|
||||||
|
Attach="false"
|
||||||
|
DebuggerType="3"
|
||||||
|
Remote="1"
|
||||||
|
RemoteMachine="ORION-ÏÊ"
|
||||||
|
RemoteCommand=""
|
||||||
|
HttpUrl=""
|
||||||
|
PDBPath=""
|
||||||
|
SQLDebugging=""
|
||||||
|
Environment=""
|
||||||
|
EnvironmentMerge="true"
|
||||||
|
DebuggerFlavor="0"
|
||||||
|
MPIRunCommand=""
|
||||||
|
MPIRunArguments=""
|
||||||
|
MPIRunWorkingDirectory=""
|
||||||
|
ApplicationCommand=""
|
||||||
|
ApplicationArguments=""
|
||||||
|
ShimCommand=""
|
||||||
|
MPIAcceptMode=""
|
||||||
|
MPIAcceptFilter=""
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
</VisualStudioUserFile>
|
162
project_template/project_template.vcxproj
Normal file
162
project_template/project_template.vcxproj
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{D68B91E2-1169-4096-AC00-5992226D29DF}</ProjectGuid>
|
||||||
|
<RootNamespace>project_template</RootNamespace>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v120</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<PlatformToolset>v120</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<_ProjectFileVersion>12.0.21005.1</_ProjectFileVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(Configuration)\</IntDir>
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<OutDir>$(SolutionDir)$(Configuration)\</OutDir>
|
||||||
|
<IntDir>$(Configuration)\</IntDir>
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="A.cpp" />
|
||||||
|
<ClCompile Include="AddTrendAddSeasonality.cpp" />
|
||||||
|
<ClCompile Include="AddTrendMultSeasonality.cpp" />
|
||||||
|
<ClCompile Include="AddTrendNoSeasonality.cpp" />
|
||||||
|
<ClCompile Include="AicWeights.cpp" />
|
||||||
|
<ClCompile Include="DATrendAddSeasonality.cpp" />
|
||||||
|
<ClCompile Include="DATrendMultSeasonality.cpp" />
|
||||||
|
<ClCompile Include="DATrendNoSeasonality.cpp" />
|
||||||
|
<ClCompile Include="DMTrendAddSeasonality.cpp" />
|
||||||
|
<ClCompile Include="DMTrendMultSeasonality.cpp" />
|
||||||
|
<ClCompile Include="DMTrendNoSeasonality.cpp" />
|
||||||
|
<ClCompile Include="File.cpp" />
|
||||||
|
<ClCompile Include="Fuzzy.cpp" />
|
||||||
|
<ClCompile Include="FuzzyWithSets.cpp" />
|
||||||
|
<ClCompile Include="MAT.cpp" />
|
||||||
|
<ClCompile Include="Method.cpp" />
|
||||||
|
<ClCompile Include="MultTrendAddSeasonality.cpp" />
|
||||||
|
<ClCompile Include="MultTrendMultSeasonality.cpp" />
|
||||||
|
<ClCompile Include="MultTrendNoSeasonality.cpp" />
|
||||||
|
<ClCompile Include="NoTrendAddSeasonality.cpp" />
|
||||||
|
<ClCompile Include="NoTrendMultSeasonality.cpp" />
|
||||||
|
<ClCompile Include="project_template.cpp" />
|
||||||
|
<ClCompile Include="Reporter.cpp" />
|
||||||
|
<ClCompile Include="stdafx.cpp">
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Dsa.cpp" />
|
||||||
|
<ClCompile Include="NoTrendNoSeasonality.cpp" />
|
||||||
|
<ClCompile Include="Aic.cpp" />
|
||||||
|
<ClCompile Include="Mape.cpp" />
|
||||||
|
<ClCompile Include="Vovk.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="A.h" />
|
||||||
|
<ClInclude Include="AddTrendAddSeasonality.h" />
|
||||||
|
<ClInclude Include="AddTrendMultSeasonality.h" />
|
||||||
|
<ClInclude Include="AddTrendNoSeasonality.h" />
|
||||||
|
<ClInclude Include="AicWeights.h" />
|
||||||
|
<ClInclude Include="DATrendAddSeasonality.h" />
|
||||||
|
<ClInclude Include="DATrendMultSeasonality.h" />
|
||||||
|
<ClInclude Include="DATrendNoSeasonality.h" />
|
||||||
|
<ClInclude Include="DMTrendAddSeasonality.h" />
|
||||||
|
<ClInclude Include="DMTrendMultSeasonality.h" />
|
||||||
|
<ClInclude Include="DMTrendNoSeasonality.h" />
|
||||||
|
<ClInclude Include="Estimation.h" />
|
||||||
|
<ClInclude Include="File.h" />
|
||||||
|
<ClInclude Include="Fuzzy.h" />
|
||||||
|
<ClInclude Include="FuzzyWithSets.h" />
|
||||||
|
<ClInclude Include="MAT.h" />
|
||||||
|
<ClInclude Include="Method.h" />
|
||||||
|
<ClInclude Include="MultTrendAddSeasonality.h" />
|
||||||
|
<ClInclude Include="MultTrendMultSeasonality.h" />
|
||||||
|
<ClInclude Include="MultTrendNoSeasonality.h" />
|
||||||
|
<ClInclude Include="NoTrendAddSeasonality.h" />
|
||||||
|
<ClInclude Include="NoTrendMultSeasonality.h" />
|
||||||
|
<ClInclude Include="Reporter.h" />
|
||||||
|
<ClInclude Include="stdafx.h" />
|
||||||
|
<ClInclude Include="targetver.h" />
|
||||||
|
<ClInclude Include="Dsa.h" />
|
||||||
|
<ClInclude Include="NoTrendNoSeasonality.h" />
|
||||||
|
<ClInclude Include="Aic.h" />
|
||||||
|
<ClInclude Include="Mape.h" />
|
||||||
|
<ClInclude Include="TrackingControlSignal.h" />
|
||||||
|
<ClInclude Include="Vovk.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Text Include="ReadMe.txt" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
222
project_template/project_template.vcxproj.filters
Normal file
222
project_template/project_template.vcxproj.filters
Normal file
@ -0,0 +1,222 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Source Files\Methods">
|
||||||
|
<UniqueIdentifier>{5d90801d-4ed6-4356-8b18-d8eb47265efa}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Source Files\Estimations">
|
||||||
|
<UniqueIdentifier>{abb28eca-6911-465e-b9bd-9fa5690d4db4}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files\Methods">
|
||||||
|
<UniqueIdentifier>{07a8211b-11b0-40e4-b1a3-0f4f3999ecee}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files\Estimations">
|
||||||
|
<UniqueIdentifier>{55e5d4a8-6f19-439d-b569-2d0161448794}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Source Files\AggregationMethods">
|
||||||
|
<UniqueIdentifier>{f03145ee-d3fb-41c6-b262-5a21194ffff4}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files\AggregationMethods">
|
||||||
|
<UniqueIdentifier>{c9ac4971-b0dd-420b-b475-de086bf4f99b}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="project_template.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="stdafx.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Dsa.cpp">
|
||||||
|
<Filter>Source Files\Methods</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="NoTrendNoSeasonality.cpp">
|
||||||
|
<Filter>Source Files\Methods</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Aic.cpp">
|
||||||
|
<Filter>Source Files\Estimations</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Mape.cpp">
|
||||||
|
<Filter>Source Files\Estimations</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Method.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="AddTrendAddSeasonality.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="AddTrendMultSeasonality.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="AddTrendNoSeasonality.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="DATrendAddSeasonality.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="DATrendMultSeasonality.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="DATrendNoSeasonality.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="DMTrendAddSeasonality.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="DMTrendMultSeasonality.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="DMTrendNoSeasonality.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="A.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="MultTrendAddSeasonality.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="MultTrendMultSeasonality.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="MultTrendNoSeasonality.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="NoTrendAddSeasonality.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="NoTrendMultSeasonality.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Fuzzy.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="File.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="AicWeights.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="MAT.cpp">
|
||||||
|
<Filter>Source Files\Methods</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Vovk.cpp">
|
||||||
|
<Filter>Source Files\AggregationMethods</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="FuzzyWithSets.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Reporter.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="Estimation.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Method.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="stdafx.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="targetver.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Dsa.h">
|
||||||
|
<Filter>Header Files\Methods</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="NoTrendNoSeasonality.h">
|
||||||
|
<Filter>Header Files\Methods</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Aic.h">
|
||||||
|
<Filter>Header Files\Estimations</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Mape.h">
|
||||||
|
<Filter>Header Files\Estimations</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="AddTrendAddSeasonality.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="AddTrendMultSeasonality.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="AddTrendNoSeasonality.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="DATrendAddSeasonality.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="DATrendMultSeasonality.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="DATrendNoSeasonality.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="DMTrendAddSeasonality.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="DMTrendMultSeasonality.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="DMTrendNoSeasonality.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="A.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="MultTrendAddSeasonality.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="MultTrendMultSeasonality.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="MultTrendNoSeasonality.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="NoTrendAddSeasonality.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="NoTrendMultSeasonality.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Fuzzy.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="File.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="AicWeights.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="MAT.h">
|
||||||
|
<Filter>Header Files\Methods</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Vovk.h">
|
||||||
|
<Filter>Header Files\AggregationMethods</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="TrackingControlSignal.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="FuzzyWithSets.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Reporter.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Text Include="ReadMe.txt" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
6
project_template/project_template.vcxproj.user
Normal file
6
project_template/project_template.vcxproj.user
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<ShowAllFiles>true</ShowAllFiles>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
8
project_template/stdafx.cpp
Normal file
8
project_template/stdafx.cpp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
// stdafx.cpp : source file that includes just the standard includes
|
||||||
|
// project_template.pch will be the pre-compiled header
|
||||||
|
// stdafx.obj will contain the pre-compiled type information
|
||||||
|
|
||||||
|
#include "stdafx.h"
|
||||||
|
|
||||||
|
// TODO: reference any additional headers you need in STDAFX.H
|
||||||
|
// and not in this file
|
15
project_template/stdafx.h
Normal file
15
project_template/stdafx.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// stdafx.h : include file for standard system include files,
|
||||||
|
// or project specific include files that are used frequently, but
|
||||||
|
// are changed infrequently
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "targetver.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <tchar.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// TODO: reference additional headers your program requires here
|
13
project_template/targetver.h
Normal file
13
project_template/targetver.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
// The following macros define the minimum required platform. The minimum required platform
|
||||||
|
// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run
|
||||||
|
// your application. The macros work by enabling all features available on platform versions up to and
|
||||||
|
// including the version specified.
|
||||||
|
|
||||||
|
// Modify the following defines if you have to target a platform prior to the ones specified below.
|
||||||
|
// Refer to MSDN for the latest info on corresponding values for different platforms.
|
||||||
|
#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista.
|
||||||
|
#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows.
|
||||||
|
#endif
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user