// test1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <vector>
#include <cstring>
#include <fstream>
#include <string>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <map>
#include <ctime>
#include <iomanip>
#include <cmath>
using namespace std;
struct serie
{
vector<double> vec;
double label;
double len;
};
double INF = 1e10;
serie series[10000];
double dpA[2000][2000];
double dpB[2000][2000];
int num = 637;
double coe=0.2;
int WIN = 0.2;
double down_ratio;
double DPA(int i, int j, int win)
{
if ((i == 0 && j == win + 1) || (j == 0 && i == win + 1))
{
return dpA[i][j];;
}
if (abs(i - j) <= win)
return dpA[i][j];
return INF;
}
double DPB(int i, int j, int win)
{
if ((i == 0 && j == win + 1) || (j == 0 && i == win + 1))
{
return dpB[i][j];;
}
if (abs(i - j) <= win)
return dpB[i][j];
return INF;
}
double getdis(int one, int two, int i, int j)
{
vector<double>& vec1 = series[one].vec;
vector<double>& vec2 = series[two].vec;
int n = vec1.size();
double ans = (vec1[i * 2] - vec2[j * 2])*(vec1[i * 2] - vec2[j * 2]) + (vec1[i * 2 + 1] - vec2[j * 2 + 1])*(vec1[i * 2 + 1] - vec2[j * 2 + 1]);
return sqrt(ans);
}
double getdistance00(int one, int two)
{
int n = series[two].vec.size() + 1;
dpA[0][0] = 0;
dpB[0][0] = 0;
dpA[1][0] = 0;
dpB[0][1] = 0;
n /= 2;
for (int i = 2; i <= min(n - 1, WIN + 1); i++)
{
dpA[i][0] = dpA[i - 1][0] + getdis(one, one, i - 1, i - 1 - 1);// fabs(series[one].vec[i - 1] - series[one].vec[i - 1 - 1]);
dpB[0][i] = dpB[0][i - 1] + getdis(two, two, i - 1, i - 1 - 1);// fabs(series[two].vec[i - 1] - series[two].vec[i - 1 - 1]);getdis(two, two, i - 1, j - 1-1)
}
int win = WIN;
for (int i = 1; i < n; i++)
for (int j = max(1, i - win); j < min(n, i + win + 1); j++)
{
if (i != 1)
dpA[i][j] = min(DPA(i - 1, j, win) + getdis(one, one, i - 1, i - 1 - 1), DPB(i - 1, j, win) + coe*getdis(one, two, i - 1, j - 1));
else
dpA[i][j] = DPB(i - 1, j, win) +
计算轨迹相似度代码
最新推荐文章于 2023-08-30 15:41:13 发布
