Browse Source

1、优化预测出现null

dev
mh 3 months ago
parent
commit
b174d79fe5
  1. 5
      2024数据库脚本.sql
  2. 5
      algorithm/src/main/java/com/mh/algorithm/bpnn/BPNeuralNetworkFactory.java
  3. 14
      algorithm/src/main/java/com/mh/algorithm/utils/MatrixUtil.java
  4. 2
      algorithm/src/test/java/com/mh/algorithm/bpnn/bpnnTest.java
  5. 13
      user-service/src/main/java/com/mh/user/entity/HistoryDataPre.java
  6. 6
      user-service/src/main/java/com/mh/user/mapper/HistoryDataPreMapper.java
  7. 9
      user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java
  8. 15
      user-service/src/main/java/com/mh/user/service/impl/HistoryDataPreServiceImpl.java
  9. 13
      user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java
  10. 2
      user-service/src/test/java/com/mh/user/DealDataTest.java

5
2024数据库脚本.sql

@ -161,3 +161,8 @@ EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'12月用量或比
EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'合计用量', @level0type=N'Schema', @level0name=N'dbo', @level1type=N'Table', @level1name=N'analysis_runtime_year', @level2type=N'Column', @level2name=N'total_value';
EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'楼栋编号', @level0type=N'Schema', @level0name=N'dbo', @level1type=N'Table', @level1name=N'analysis_runtime_year', @level2type=N'Column', @level2name=N'building_id';
EXEC sp_addextendedproperty @name=N'MS_Description', @value=N'楼栋名称', @level0type=N'Schema', @level0name=N'dbo', @level1type=N'Table', @level1name=N'analysis_runtime_year', @level2type=N'Column', @level2name=N'building_name';
-- 2024-06-24 添加楼栋人数
alter table history_data_pre add people_num numeric(24,2) not null default 0;
exec sp_addextendedproperty N'MS_Description', N'每栋楼人数', N'schema', N'dbo',N'table', N'history_data_pre', N'column', N'people_num';

5
algorithm/src/main/java/com/mh/algorithm/bpnn/BPNeuralNetworkFactory.java

@ -161,6 +161,11 @@ public class BPNeuralNetworkFactory {
double[][] normalizedInput = new double[input.getMatrixRowCount()][input.getMatrixColCount()];
for (int i = 0; i < input.getMatrixRowCount(); i++) {
for (int j = 0; j < input.getMatrixColCount(); j++) {
if ((input.getValOfIdx(i,j) - bpModel.getInputMin().getValOfIdx(0,j)) == 0
|| (bpModel.getInputMax().getValOfIdx(0,j) - bpModel.getInputMin().getValOfIdx(0,j)) == 0) {
normalizedInput[i][j] = bpModel.getBpParameter().getNormalizationMin();
continue;
}
normalizedInput[i][j] = bpModel.getBpParameter().getNormalizationMin()
+ (input.getValOfIdx(i,j) - bpModel.getInputMin().getValOfIdx(0,j))
/ (bpModel.getInputMax().getValOfIdx(0,j) - bpModel.getInputMin().getValOfIdx(0,j))

14
algorithm/src/main/java/com/mh/algorithm/utils/MatrixUtil.java

@ -249,7 +249,15 @@ public class MatrixUtil {
//数据归一化(注:若max与min均为0则不需要归一化)
if (max != 0 || min != 0) {
for (int j = 0; j < a.getMatrixRowCount(); j++) {
res[j][i] = normalizationMin + (a.getValOfIdx(j,i) - min) / (max - min) * (normalizationMax - normalizationMin);
try {
if ((a.getValOfIdx(j,i) - min) == 0 || (max - min) == 0) {
res[j][i] = normalizationMin;
continue;
}
res[j][i] = normalizationMin + (a.getValOfIdx(j,i) - min) / (max - min) * (normalizationMax - normalizationMin);
} catch (IllegalArgumentException e) {
res[j][i] = 0;
}
}
}
maxArr[0][i] = max;
@ -276,6 +284,10 @@ public class MatrixUtil {
//数据反归一化
if (dataMin.getValOfIdx(0,i) != 0 || dataMax.getValOfIdx(0,i) != 0) {
for (int j = 0; j < a.getMatrixRowCount(); j++) {
if ((a.getValOfIdx(j,i) - normalizationMin) == 0 || (normalizationMax - normalizationMin) == 0) {
res[j][i] = dataMin.getValOfIdx(0,i);
continue;
}
res[j][i] = dataMin.getValOfIdx(0,i) + (dataMax.getValOfIdx(0,i) - dataMin.getValOfIdx(0,i)) * (a.getValOfIdx(j,i) - normalizationMin) / (normalizationMax - normalizationMin);
}
}

2
algorithm/src/test/java/com/mh/algorithm/bpnn/bpnnTest.java

@ -22,7 +22,7 @@ public class bpnnTest {
bpParameter.setHiddenLayerNeuronCount(2);
bpParameter.setOutputLayerNeuronCount(2);
bpParameter.setPrecision(0.01);
bpParameter.setMaxTimes(100000);
bpParameter.setMaxTimes(10000);
// 训练BP神经网络
System.out.println(new Date());

13
user-service/src/main/java/com/mh/user/entity/HistoryDataPre.java

@ -31,6 +31,11 @@ public class HistoryDataPre {
private BigDecimal waterLevel;
/**
* 每栋楼人数
*/
private BigDecimal peopleNum;
private BigDecimal waterValuePre;
private BigDecimal electValuePre;
@ -39,6 +44,14 @@ public class HistoryDataPre {
private String remark;
public BigDecimal getPeopleNum() {
return peopleNum;
}
public void setPeopleNum(BigDecimal peopleNum) {
this.peopleNum = peopleNum;
}
public Long getId() {
return id;
}

6
user-service/src/main/java/com/mh/user/mapper/HistoryDataPreMapper.java

@ -25,8 +25,9 @@ public interface HistoryDataPreMapper extends BaseMapper<HistoryDataPre> {
@Result(column = "water_value", property = "waterValue"),
@Result(column = "elect_value", property = "electValue"),
@Result(column = "water_level", property = "waterLevel"),
@Result(column = "people_num", property = "peopleNum")
})
@Select("select env_min_temp, env_max_temp, water_value, elect_value, water_level from history_data_pre where building_id = #{buildingId} order by cur_date ")
@Select("select env_min_temp, env_max_temp, water_value, elect_value, water_level, people_num from history_data_pre where building_id = #{buildingId} order by cur_date ")
List<HistoryDataPre> getTrainData(@Param("buildingId") String buildingId);
@Results(id ="rs_recent_data",value ={
@ -118,8 +119,9 @@ public interface HistoryDataPreMapper extends BaseMapper<HistoryDataPre> {
@Result(column = "cur_date", property = "curDate"),
@Result(column = "env_min_temp", property = "envMinTemp"),
@Result(column = "env_max_temp", property = "envMaxTemp"),
@Result(column = "people_num", property = "peopleNum")
})
@Select("select top 1 id, building_id, cur_date, env_min_temp, env_max_temp from history_data_pre where building_id = #{buildingId} and cur_date = #{curDate} ")
@Select("select top 1 id, building_id, cur_date, env_min_temp, env_max_temp, people_num from history_data_pre where building_id = #{buildingId} and cur_date = #{curDate} ")
HistoryDataPre selectOneData(@Param("buildingId") String buildingId,
@Param("curDate") String curDate);

9
user-service/src/main/java/com/mh/user/service/impl/DeviceInstallServiceImpl.java

@ -10,6 +10,7 @@ import com.mh.user.model.DeviceModel;
import com.mh.user.service.BuildingService;
import com.mh.user.service.DeviceInstallService;
import com.mh.user.utils.CacheUtil;
import com.mh.user.utils.ExchangeStringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -38,6 +39,14 @@ public class DeviceInstallServiceImpl implements DeviceInstallService {
public int saveDevice(DeviceInstallEntity deviceInstallEntity) {
String buildingName = buildingService.selectBuildingNameById(deviceInstallEntity.getBuildingId());
deviceInstallEntity.setBuildingName(buildingName);
if ("电表".equalsIgnoreCase(deviceInstallEntity.getDeviceType())) {
// 000005500773
deviceInstallEntity.setDeviceAddr(ExchangeStringUtil.addZeroForNum(deviceInstallEntity.getDeviceAddr(), 12));
} else if ("水表".equalsIgnoreCase(deviceInstallEntity.getDeviceType())
&& deviceInstallEntity.getBrand().contains("美柯")) {
// 00000086058863
deviceInstallEntity.setDeviceAddr(ExchangeStringUtil.addZeroForNum(deviceInstallEntity.getDeviceAddr(), 14));
}
this.createParamCode(deviceInstallEntity);
return deviceInstallMapper.saveDevice(deviceInstallEntity);
}

15
user-service/src/main/java/com/mh/user/service/impl/HistoryDataPreServiceImpl.java

@ -65,6 +65,7 @@ public class HistoryDataPreServiceImpl implements HistoryDataPreService {
return new String[] {
String.valueOf(dataPre.getEnvMinTemp()),
String.valueOf(dataPre.getEnvMaxTemp()),
String.valueOf(dataPre.getPeopleNum()),
String.valueOf(dataPre.getWaterValue()),
String.valueOf(dataPre.getElectValue()),
String.valueOf(dataPre.getWaterLevel())
@ -91,11 +92,11 @@ public class HistoryDataPreServiceImpl implements HistoryDataPreService {
// 创建BP参数对象
BPParameter bpParameter = new BPParameter();
bpParameter.setInputLayerNeuronCount(2);
bpParameter.setInputLayerNeuronCount(3);
bpParameter.setHiddenLayerNeuronCount(3);
bpParameter.setOutputLayerNeuronCount(3);
bpParameter.setPrecision(0.01);
bpParameter.setMaxTimes(10000);
bpParameter.setMaxTimes(50000);
// 训练BP神经网络
BPModel bpModel = factory.trainBP(bpParameter, trainSet);
@ -123,8 +124,8 @@ public class HistoryDataPreServiceImpl implements HistoryDataPreService {
if (null == jsonObject) {
return;
}
String envMinTemp = "";
String envMaxTemp = "";
String envMinTemp = "16.50";
String envMaxTemp = "26.00";
JSONArray jsonArray = jsonObject.getJSONArray("forecasts").getJSONObject(0).getJSONArray("casts");
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject1 = jsonArray.getJSONObject(i);
@ -145,7 +146,11 @@ public class HistoryDataPreServiceImpl implements HistoryDataPreService {
}
// 开始预测
HistoryDataPre historyDataPre1 = historyDataPreMapper.selectOneData(buildingId, curDate);
String[] preData = new String[]{historyDataPre1.getEnvMinTemp().toString(), historyDataPre1.getEnvMaxTemp().toString()};
String[] preData = new String[]{
historyDataPre1.getEnvMinTemp().toString(),
historyDataPre1.getEnvMaxTemp().toString(),
historyDataPre1.getPeopleNum().toString()
};
CsvInfo csvInfo = new CsvInfo();
ArrayList<String[]> list = new ArrayList<>();

13
user-service/src/main/java/com/mh/user/strategy/HeatPumpStrategy.java

@ -382,6 +382,19 @@ public class HeatPumpStrategy implements DeviceStrategy {
+ ExchangeStringUtil.addZeroForNum(ExchangeStringUtil.hexToDec(checkStr.substring(18, 22)), 2);
sValue = startTime + closetTime;
}
} else if (checkStr.substring(2, 4).equalsIgnoreCase("06")) {
if (registerAddr.equalsIgnoreCase("0001")) { //运行状态
dataType = "runState";
data = checkStr.substring(10, 12);
if (data.equalsIgnoreCase("00")) {
sValue = "不运行"; //关机模式
} else if (data.equalsIgnoreCase("01")) {
sValue = "运行"; //制热模式
}
//计算热泵运行时间,按分钟
nowDataService.proPumpMinutes(buildingId, addr, sValue);
log.info("计算热泵运行时长,楼栋名称:" + buildingName + ",热泵编号:" + addr + ",状态:" + sValue);
}
} else if (checkStr.substring(2, 4).equalsIgnoreCase("10")) {
log.info("时间: " + dateStr + ",热泵ID: " + addr + ",操作成功! ");
return Constant.SUCCESS;

2
user-service/src/test/java/com/mh/user/DealDataTest.java

@ -52,7 +52,7 @@ public class DealDataTest extends UserServiceApplicationTests {
// 训练数据
historyDataPreService.startTrainData("21");
// 预测数据
historyDataPreService.startPredictData("21", "2024-05-15");
historyDataPreService.startPredictData("21", "2024-03-21");
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());

Loading…
Cancel
Save