高级算法特征值,暂降事件范围分析代码提交

This commit is contained in:
2023-08-10 16:30:01 +08:00
parent 336f3b1281
commit 855c8d98d6
73 changed files with 5766 additions and 88 deletions

View File

@@ -4,15 +4,11 @@ import cn.hutool.core.date.TimeInterval;
import com.njcn.advance.pojo.bo.QtIdxArray;
import com.njcn.advance.pojo.bo.QvvrDataStruct;
import com.njcn.advance.pojo.dto.BalanceInfo;
import com.njcn.advance.pojo.dto.QtIdx;
import com.njcn.advance.pojo.dto.relevent.QtIdx;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**

View File

@@ -1,6 +1,8 @@
package com.njcn.advance.utils;
import com.njcn.advance.pojo.bo.QvvrDataStruct;
import com.njcn.advance.pojo.dto.waveAnalysis.CauseStruct;
import com.njcn.advance.pojo.dto.waveAnalysis.Rect;
import com.sun.jna.Library;
import com.sun.jna.Native;
@@ -33,5 +35,23 @@ public class JnaCallBalance extends JnaCallDllOrSo{
// 定义方法--->与C方法相对应
void qvvr_fun_cause(QvvrDataStruct data);
// 定义方法--->与C方法相对应
void qvvr_fun_cause(CauseStruct data);
}
public interface Eventlibrary extends Library {
// 加载Lib库
Eventlibrary INSTANTCE = (Eventlibrary) Native.loadLibrary(JnaCallBalance.strpath, Eventlibrary.class);
// 计算暂降类
void qvvr_fun(Rect data);
}
}

View File

@@ -14,7 +14,6 @@ import java.net.URLDecoder;
@Slf4j
public class JnaCallDllOrSo {
private String path = "";
private String pathDll = "";
private String nameDll;
public static String jarPath = "";

View File

@@ -0,0 +1,382 @@
package com.njcn.advance.utils;
import com.njcn.advance.pojo.dto.relevent.*;
public class UtilNormalization {
public static void matrixcata_pro(EntityLogic[] transformer, EntityMtrans entityMtrans, int len) {
int i, j, k, con;
String node1, node2;
int src_node[] = new int[] { 0 };
// 连接方式转化为矩阵形式,行、列表示所有节点
// inf表示两个节点不相连0表示与自身相连其他数值表示变压器连接类型
// 将初始矩阵的元素设为inf,对角线元素设为0
for (i = 0; i < FinalData.NODE_NUM; i++) {
for (j = 0; j < FinalData.NODE_NUM; j++) {
entityMtrans.getMtrans()[i][j] = FinalData.DATA_INF;
}
entityMtrans.getMtrans()[i][i] = 0;
}
// 根据transformer设置元素
for (i = 0; i < len; i++) {
node1 = transformer[i].getNode_h();
node2 = transformer[i].getNode_l();
con = transformer[i].getType();
//TODO
//entityMtrans.getMtrans()[node1 - 1][node2 - 1] = con;
//entityMtrans.getMtrans()[node2 - 1][node1 - 1] = con;
}
StringBuilder str = new StringBuilder();
for (i = 0; i < FinalData.NODE_NUM; i++) {
for (j = 0; j < FinalData.NODE_NUM; j++) {
str.append(entityMtrans.getMtrans()[i][j]).append(" ");
if (j == (FinalData.NODE_NUM - 1)) {
str.append("\r\n");
}
}
}
// 类型匹配矩阵Matrixcata
// Matrixcata模式匹配矩阵列为节点数行为总类别数元素为第一个节点分别是1-6类别情况下其他节点类别情况。
// 元素1,2,34,5,6 分别对应 Dc,Cb,Da,Cc,Db,Ca
// 设置矩阵第一行元素
for (i = 0; i < FinalData.NODE_NUM; i++) {
entityMtrans.getMatrixcata0()[0][i] = 0;
}
for (i = 1; i < FinalData.NODE_NUM; i++) {
// 路径缓存清空
for (j = 0; j < FinalData.MAX_PATH_NUM; j++) {
for (k = 0; k < (FinalData.NODE_NUM + 1); k++) {
entityMtrans.getPossiable_path()[j][k] = 0;
}
}
entityMtrans.setPath_num(0);
// 寻找路径
src_node[0] = 0;
findPath(entityMtrans, src_node, i, 0, 1, FinalData.NODE_NUM);
if (entityMtrans.getPath_num() != 0) {
entityMtrans.getMatrixcata0()[0][i] = entityMtrans.getPossiable_path()[0][FinalData.NODE_NUM]; // 采用第一条路径
} else {
entityMtrans.getMatrixcata0()[0][i] = FinalData.DATA_INF; // 找不到路径填大值表示不通
}
}
// 构造矩阵其他行元素
for (i = 1; i < FinalData.EVT_TYPE_NUM; i++) {
for (j = 0; j < FinalData.NODE_NUM; j++)
// EntityGroupData.Matrixcata0[i][j] =
// EntityGroupData.Matrixcata0[0][j] + i;
{
if (entityMtrans.getMatrixcata0()[0][j] == FinalData.DATA_INF) {
entityMtrans.getMatrixcata0()[i][j] = FinalData.DATA_INF;
} else {
entityMtrans.getMatrixcata0()[i][j] = entityMtrans.getMatrixcata0()[0][j] + i;
}
}
}
// 将数据归类到0-5
for (i = 0; i < FinalData.EVT_TYPE_NUM; i++) {
for (j = 0; j < FinalData.NODE_NUM; j++) {
entityMtrans.getMatrixcata1()[i][j] = entityMtrans.getMatrixcata0()[i][j] % 6;
}
}
// 0换成6将数据归类到1-6
for (i = 0; i < FinalData.EVT_TYPE_NUM; i++) {
for (j = 0; j < FinalData.NODE_NUM; j++) {
if (entityMtrans.getMatrixcata1()[i][j] == 0) {
entityMtrans.getMatrixcata1()[i][j] = 6;
}
}
}
str.delete(0, str.length());
for (i = 0; i < FinalData.EVT_TYPE_NUM; i++) {
for (j = 0; j < FinalData.NODE_NUM; j++) {
str.append(entityMtrans.getMatrixcata1()[i][j]).append(" ");
if (j == (FinalData.NODE_NUM - 1)) {
str.append("\r\n");
}
}
}
}
public static int findPath(EntityMtrans entityMtrans, int[] OriginalNode, int destination, int Weight, int src_num, int node_num) // 深度优先搜索
{
int i, j;
int last_node;
int nextNodes[] = new int[FinalData.NODE_NUM];
int nextNode_num = 0;
int nextNodes0[] = new int[FinalData.NODE_NUM];
int nextNode_num0 = 0;
int tmpPath[] = new int[FinalData.NODE_NUM + 1];
int tmpPath_num;
if (src_num < 1) // 源节点个数不对
{
return 1;
}
last_node = OriginalNode[src_num - 1];
if (last_node > node_num) // 判断最后一个节点号是否在范围内
{
return 1;
}
for (i = 0; i < node_num; i++) {
// if((Mtrans[last_node][i]>0)&&(Mtrans[last_node][i]<DATA_INF))
// //寻找相同的节点
if (entityMtrans.getMtrans()[last_node][i] > 0) // 寻找相同的节点
{
nextNodes[nextNode_num] = i;
nextNode_num++;
}
}
// 如果一条路的最后一个节点就是目标节点说明此路径是所有路径中的一条可以直接return
if (last_node == destination) {
if (entityMtrans.getPath_num() >= FinalData.MAX_PATH_NUM) {
return 1;
}
for (i = 0; i < src_num; i++) {
entityMtrans.getPossiable_path()[entityMtrans.getPath_num()][i] = OriginalNode[i];
}
entityMtrans.getPossiable_path()[entityMtrans.getPath_num()][FinalData.NODE_NUM] = Weight; // 最后一个节点填入变压器连接
entityMtrans.setPath_num(entityMtrans.getPath_num() + 1);
} else {
for (i = 0; i < src_num; i++) {
if (destination == OriginalNode[i]) {
return 1;
}
}
}
// 判断下一个节点有没有目的节点
for (i = 0; i < nextNode_num; i++) {
if (nextNodes[i] == destination) {
// 先清零;
for (j = 0; j < (FinalData.NODE_NUM + 1); j++) {
tmpPath[j] = 0;
}
// 填入源节点
for (j = 0; j < src_num; j++) {
tmpPath[j] = OriginalNode[j];
}
tmpPath[src_num] = destination; // 目的节点加在后面
tmpPath[FinalData.NODE_NUM] = Weight + entityMtrans.getMtrans()[last_node][destination]; // 最后一个点填入变压器累计
tmpPath_num = src_num + 1;
if (entityMtrans.getPath_num() >= FinalData.MAX_PATH_NUM) {
return 1;
}
for (j = 0; j < (FinalData.NODE_NUM + 1); j++) {
entityMtrans.getPossiable_path()[entityMtrans.getPath_num()][j] = tmpPath[j]; // tmpPath为路径的路阻
}
entityMtrans.setPath_num(entityMtrans.getPath_num() + 1);
nextNodes[i] = 0;
if (nextNode_num != 0) // if(nextNode_num)
{
nextNode_num--;
}
} else {
// 判断如果源节点中有下一个节点,不再寻找处理
for (j = 0; j < src_num; j++) {
if (nextNodes[i] == OriginalNode[j]) {
nextNodes[i] = 0;
}
}
}
}
// 不是目的节点的下一节点继续寻找
for (i = 0; i < nextNode_num; i++) {
if (nextNodes[i] != 0) {
nextNodes0[nextNode_num0] = nextNodes[i];
nextNode_num0++;
}
}
for (i = 0; i < nextNode_num0; i++) {
// 填入源节点
for (j = 0; j < src_num; j++) {
tmpPath[j] = OriginalNode[j];
}
tmpPath[src_num] = nextNodes0[i]; // 下一个节点加在后面
tmpPath_num = src_num + 1;
findPath(entityMtrans, tmpPath, destination, (Weight + entityMtrans.getMtrans()[last_node][nextNodes0[i]]), tmpPath_num,
node_num);
}
return 0;
}
public static int sort_Tstart(EntityGroupData buf) {
int res_num, out_num;
int idx = 0;
if ((buf == null) || (buf.getEvt_in_num() == 0)) {
return 0;
}
res_num = buf.getEvt_in_num();
while (res_num > 0) { // while(res_num)
out_num = sort_Tstart_single(buf);
// 输出缓冲填入归集缓冲
// buf.getGrp_buf()[idx] = buf.getOut_buf();
System.arraycopy(buf.getOut_buf(), 0, buf.getGrp_buf()[idx], 0, buf.getOut_buf().length);
buf.getGrp_num()[idx] = out_num;
// 未归集填入输入缓冲
// buf.setIn_buf(buf.getRes_buf());
System.arraycopy(buf.getRes_buf(), 0, buf.getIn_buf(), 0, buf.getRes_buf().length);
buf.setEvt_in_num(buf.getEvt_res_num());
idx++;
if (idx >= FinalData.MAX_GROUP_NUM) // 分组超限
{
break;
}
if (out_num <= res_num) {
res_num = res_num - out_num;
} else {
break; // 分组数目超限
}
}
buf.setGrp_all_num(idx);
return 1;
}
public static int sort_Tstart_single(EntityGroupData buf) {
int i;
int start_time;
int thd_time1, thd_time2;
if ((buf == null) || (buf.getEvt_in_num() == 0)) {
return 0;
}
buf.setEvt_out_num(0);
buf.setEvt_res_num(0);
// 如果只有一个事件直接赋值返回
if (buf.getEvt_in_num() == 1) {
buf.setEvt_out_num(1);
// buf.getOut_buf()[0] = buf.getIn_buf()[0];
// System.arraycopy(buf.getIn_buf()[0], 0, buf.getOut_buf()[0], 0,
// 1);
buf.getOut_buf()[0] = (EntityGroupEvtData) buf.getIn_buf()[0].objClone();
return buf.getEvt_out_num();
}
start_time = buf.getIn_buf()[0].getStart_time();
thd_time1 = start_time - FinalData.TIME_THRESHOLD;
thd_time2 = start_time + FinalData.TIME_THRESHOLD;
// 判断时标阀值门槛归集
for (i = 0; i < buf.getEvt_in_num(); i++) {
start_time = buf.getIn_buf()[i].getStart_time();
// 在阈值范围内
if ((start_time >= thd_time1) && (start_time <= thd_time2)) {
// buf.getOut_buf()[buf.getEvt_out_num()] = buf.getIn_buf()[i];
// System.arraycopy(buf.getIn_buf()[i], 0,
// buf.getOut_buf()[buf.getEvt_out_num()], 0, 1);
buf.getOut_buf()[buf.getEvt_out_num()] = (EntityGroupEvtData) buf.getIn_buf()[i].objClone();
buf.setEvt_out_num(buf.getEvt_out_num() + 1);
} else {
// buf.getRes_buf()[buf.getEvt_res_num()] = buf.getIn_buf()[i];
// System.arraycopy(buf.getIn_buf()[i], 0,
// buf.getRes_buf()[buf.getEvt_res_num()], 0, 1);
buf.getRes_buf()[buf.getEvt_res_num()] = (EntityGroupEvtData) buf.getIn_buf()[i].objClone();
buf.setEvt_res_num(buf.getEvt_res_num() + 1);
}
}
return buf.getEvt_out_num();
}
public static int sort_cata(EntityGroupData buf, int idx) {
int i, j;
int cata, node;
int odrer[] = new int[FinalData.MAX_CATA_NUM + 2];
// 针对类别是1-6的数据进行模式匹配并标注属于哪一个模式
for (i = 0; i < (FinalData.MAX_CATA_NUM + 2); i++) {
odrer[i] = 0;
}
// 暂降类型转换
// 将类型7,8,9转换为6,2,4
// 其中789分别对应BC两相接地,AC两相接地,AB两相接地,1,2,34,56分别对应Dc,Cb,Da,Cc,Db,Ca
/*
* for (i = 0; i < buf.getGrp_num()[idx]; i++) { if
* (buf.getGrp_buf()[idx][i].getCata() == 7)
* buf.getGrp_buf()[idx][i].setCata(6); if
* (buf.getGrp_buf()[idx][i].getCata() == 8)
* buf.getGrp_buf()[idx][i].setCata(2); if
* (buf.getGrp_buf()[idx][i].getCata() == 9)
* buf.getGrp_buf()[idx][i].setCata(4); }
*/
for (i = 0; i < buf.getGrp_num()[idx]; i++) {
/*
* if (buf.getGrp_buf()[idx][i].getCata() == 10) //事件类型未知
* buf.getGrp_buf()[idx][i].setCata(11); if
* (buf.getGrp_buf()[idx][i].getCata() == 9) //三相
* buf.getGrp_buf()[idx][i].setCata(10);
*/
if (buf.getGrp_buf()[idx][i].getCata() == 0) {
buf.getGrp_buf()[idx][i].setCata(6);
}
if (buf.getGrp_buf()[idx][i].getCata() == 6) {
buf.getGrp_buf()[idx][i].setCata(6);
}
if (buf.getGrp_buf()[idx][i].getCata() == 7) {
buf.getGrp_buf()[idx][i].setCata(2);
}
if (buf.getGrp_buf()[idx][i].getCata() == 8) {
buf.getGrp_buf()[idx][i].setCata(4);
}
}
// 将数据进行模式匹配,并标注属于哪一个模式
for (i = 0; i < buf.getGrp_num()[idx]; i++) {
cata = buf.getGrp_buf()[idx][i].getCata();
node = buf.getGrp_buf()[idx][i].getNode();
if ((node > FinalData.NODE_NUM) || (buf.getMatrixcata()[0][node - 1] == FinalData.DATA_INF)) {
buf.getGrp_buf()[idx][i].setCata2(FinalData.QVVR_TYPE_OUTOFRANGE);
// buf.getGrp_cata_buf()[idx][FinalData.MAX_CATA_NUM +
// 1][odrer[FinalData.MAX_CATA_NUM + 1]] =
// buf.getGrp_buf()[idx][i];
// System.arraycopy(buf.getGrp_buf()[idx][i], 0,
// buf.getGrp_cata_buf()[idx][FinalData.MAX_CATA_NUM +
// 1][odrer[FinalData.MAX_CATA_NUM + 1]], 0, 1);
buf.getGrp_cata_buf()[idx][FinalData.MAX_CATA_NUM + 1][odrer[FinalData.MAX_CATA_NUM
+ 1]] = (EntityGroupEvtData) buf.getGrp_buf()[idx][i].objClone();
odrer[FinalData.MAX_CATA_NUM + 1]++;
} else if (cata == FinalData.QVVR_TYPE_UNKNOWN) {
buf.getGrp_buf()[idx][i].setCata2(FinalData.QVVR_TYPE_UNKNOWN);
// buf.getGrp_cata_buf()[idx][FinalData.MAX_CATA_NUM][odrer[FinalData.MAX_CATA_NUM]]
// = buf.getGrp_buf()[idx][i];
// System.arraycopy(buf.getGrp_buf()[idx][i], 0,
// buf.getGrp_cata_buf()[idx][FinalData.MAX_CATA_NUM][odrer[FinalData.MAX_CATA_NUM]],
// 0, 1);
buf.getGrp_cata_buf()[idx][FinalData.MAX_CATA_NUM][odrer[FinalData.MAX_CATA_NUM]] = (EntityGroupEvtData) buf
.getGrp_buf()[idx][i].objClone();
odrer[FinalData.MAX_CATA_NUM]++;
} else if (cata == FinalData.QVVR_TYPE_THREE) // ÈıÏàÔݽµ¹éÀà
{
buf.getGrp_buf()[idx][i].setCata2(FinalData.QVVR_TYPE_THREE);
// buf.getGrp_cata_buf()[idx][FinalData.MAX_CATA_NUM -
// 1][odrer[FinalData.MAX_CATA_NUM - 1]] =
// buf.getGrp_buf()[idx][i];
// System.arraycopy(buf.getGrp_buf()[idx][i], 0,
// buf.getGrp_cata_buf()[idx][FinalData.MAX_CATA_NUM -
// 1][odrer[FinalData.MAX_CATA_NUM - 1]], 0, 1);
buf.getGrp_cata_buf()[idx][FinalData.MAX_CATA_NUM - 1][odrer[FinalData.MAX_CATA_NUM
- 1]] = (EntityGroupEvtData) buf.getGrp_buf()[idx][i].objClone();
odrer[FinalData.MAX_CATA_NUM - 1]++;
} else // 1-6类暂降归类
{
for (j = 0; j < FinalData.MAX_CATA_NUM; j++) {
if (cata == buf.getMatrixcata()[j][node - 1])// 判断数据类别属于第几行
{
buf.getGrp_buf()[idx][i].setCata2(j + 1);
// 进行归类
// buf.getGrp_cata_buf()[idx][j][odrer[j]] =
// buf.getGrp_buf()[idx][i];
// System.arraycopy(buf.getGrp_buf()[idx][i], 0,
// buf.getGrp_cata_buf()[idx][j][odrer[j]], 0, 1);
buf.getGrp_cata_buf()[idx][j][odrer[j]] = (EntityGroupEvtData) buf.getGrp_buf()[idx][i]
.objClone();
odrer[j]++;
}
}
}
}
for (i = 0; i < FinalData.MAX_CATA_NUM + 2; i++) {
buf.getGrp_cata_num()[idx][i] = odrer[i];
}
return 0;
}
}

View File

@@ -0,0 +1,102 @@
package com.njcn.advance.utils;
/**
* @Author: Sunwei 【sunW2016@163.com】
* @Description:
* @Date: Create in 22:28 2018/3/5
* @Modified By:
* @author njcn
*/
import cn.hutool.core.collection.CollectionUtil;
import java.util.ArrayList;
import java.util.List;
/*****************************************************************
* 字符串转基础类型,可能转换不成功,封装该方法
* 第一个参数为需要转换的字符串
* 第二个参数为null时直接抛出异常为数值则传入一个默认值
*****************************************************************/
public class Utils {
public static int getIntValue(String s,Integer integer) {
try {
integer = Integer.parseInt(s);
} catch (Exception e) {
if (null == integer) {
throw e;
}
}
return integer.intValue();
}
/**
* String对象转float
*
* @param f
* @return
*/
public static float getFloatValue(String s,Float f) {
try {
f = Float.parseFloat(s);
} catch (Exception e) {
if (null == f) {
throw e;
}
}
return f.floatValue();
}
/**
* String对象转double
*
* @param d
* @return
*/
public static double getDoubleValue(String s,Double d) {
try {
d = Double.parseDouble(s);
} catch (Exception e) {
if (null == d) {
throw e;
}
}
return d.doubleValue();
}
/**
* int转String对象
*/
public static String int2String(int iValue) {
return Integer.toString(iValue);
}
/**
* float转String
*/
public static String float2String(float fValue) {
return Float.toString(fValue);
}
/**
* 按指定大小分隔集合将集合按规定个数分为n个部分
* @author cdf
* @date 2021/10/26
*/
public static List<List<Integer>> splitList(List<Integer> list, int len){
if(CollectionUtil.isEmpty(list) || len<1){
return null;
}
List<List<Integer>> result = new ArrayList<>();
int size = list.size();
int count = (size+len-1)/1000;
for(int i=0;i<count;i++){
List<Integer> subList= list.subList(i*len,((i+1)*len>size?size:len*(i+1)));
result.add(subList);
}
return result;
}
}