这段代码算是我写的认真的代码,跑出来的结果也比较满意。用的算法是神经网络,采用随机数据模拟现实进行训练,得出一个均衡结果。web
import numpy as np import pandas as pd import matplotlib.pyplot as plt import random from sympy import * # 夏天时温度随时间的拟合曲线 summEnviromentTemperature = [26, 26, 25, 25, 24, 25, 26, 27, 29, 30, 31, 31, 31, 32, 32, 32, 32, 31, 30, 29, 29, 28, 28, 27, ] x = np.linspace(0, 23, 1000) plt.plot(x, 5.569913178608847e-04*pow(x, 4)-0.029478827667234*pow(x, 3)+0.467882701034875*pow(x, 2)-1.920380411322440*x+26.720370370370368,label="夏天温度随时间变换") plt.show() # 冬天时温度随时间的拟合曲线 enviromentTemperature = [6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 9, 9, 10, 10, 10, 10, 9, 8, 7, 6, 5, 4, ] x = np.linspace(0, 23, 1000) plt.plot(x, -2.597040640518996e-05*pow(x, 4)-0.002883489296533*pow(x, 3)+0.095365654876524*pow(x, 2)-0.482645715797885*x+6.361324786324780,label="冬天温度随时间变换") plt.show() # 获取当前季节的室外温度 def getSummerCorrentOutsideTemperature(time): # 拟合函数1号 correntOutsideTemp = 5.569913178608847e-04*pow(time%24, 4)-0.029478827667234*pow(time%24, 3)+0.467882701034875*pow(time%24, 2)-1.920380411322440*(time%24)+26.720370370370368 return correntOutsideTemp def getWinterCorrentOutsideTemperature(time): # 拟合函数2号 correntOutsideTemp = -2.597040640518996e-05*pow(time%24, 4)-0.002883489296533*pow(time%24, 3)+0.095365654876524*pow(time%24, 2)-0.482645715797885*(time%24)+6.361324786324780 return correntOutsideTemp # 模拟洗一次澡后加水 # return 加热时间 单位秒 def afterUploadWater(setedTemp, time, season): # setedTemp : 热水器内部温度 # time : 时间mod24 # season : 季节 (1为夏天,2为冬天) if season == 1: correntOutsideTemp = getSummerCorrentOutsideTemperature(time) usedWater = (72.001*abs(37-correntOutsideTemp))/abs(setedTemp - correntOutsideTemp) else: correntOutsideTemp = getWinterCorrentOutsideTemperature(time) usedWater = (72.001*abs(42-correntOutsideTemp))/abs(setedTemp - correntOutsideTemp) unusedWater = 60-usedWater if unusedWater < 0: unusedWater = 0 fixTemp = (unusedWater*setedTemp + correntOutsideTemp*usedWater)/72.00001 x = symbols('x') heatNeededTime = integrate(60*4200*(1/(1500-1.08*0.879*(x-correntOutsideTemp))), (x, fixTemp, setedTemp)) return heatNeededTime # 模拟加热5度 # return 返回时间 单位秒 def keepTemp(setedTemp, time, season): # setedTemp : 热水器内部温度 # time : 时间mod24 # season : 季节 (1为夏天,2为冬天) if season == 1: correntOutsideTemp = getSummerCorrentOutsideTemperature(time) else: correntOutsideTemp = getWinterCorrentOutsideTemperature(time) x = Symbol('x') heatNeededTime = integrate(60*4200*(1/(1500-1.08*0.879*(x-correntOutsideTemp))), (x, setedTemp-5, setedTemp)) return heatNeededTime # 以7天为一周期的主函数,进行100次迭代,并模拟在一我的任意时刻洗澡 def main(season): # season : 季节 (1为夏天,2为冬天) ansDict = {} ansResult = [] if season == 1: start = 40 end = 75 else: start = 50 end = 75 # 开始100次迭代 for i in range(100): for temperature in range(start, end): if season == 1: # 拟合函数3号 startPow = -5.855191256830656e-05*temperature**3 + 0.010656525851198*temperature**2 -0.575437053383782*temperature + 10.713433165195610 else: # 拟合函数4号 startPow = 2.666666666665736e-06*temperature**3 -4.799999999998103e-04*temperature**2 +0.093533333333321*temperature -1.179999999999723 # 表示天天两次以上降温5度,被打断一次 if (startPow >= 2): startPow -= 1 # 模拟每一个温度下一周加热时间 totalTime = 0 randomHourWash = random.choice([i for i in range(0,25)]) randomHourHeat = random.choice([i for i in range(0,25)]) for hour in range(7*24): # 天天模拟一个时间点洗澡,一个时间点加热 if hour/24 != (hour-1)/24: randomHourWash = random.choice([i for i in range(0,25)]) randomHourHeat = random.choice([i for i in range(0,25)]) if (hour%24 == randomHourWash): totalTime += afterUploadWater(temperature, hour, season) if (hour%24 == randomHourHeat): totalTime += startPow*keepTemp(temperature, hour, season) # 下面为了防止数字溢出,作一个等比例减少处理 if temperature in ansDict: ansDict[temperature] += totalTime/100 else: ansDict[temperature] = totalTime/100 totalTime = 0 finalAnwser = 10000000 bestTemp = 0 for item in ansDict: if ansDict[item] < finalAnwser: finalAnwser = ansDict[item] bestTemp = item ansResult.append(bestTemp) print("Iteration "+str(i+1)+" : "+ str(bestTemp)) # 找出100次迭代中出现最多的温度 tempDict = {} for flag in ansResult: if flag not in tempDict: tempDict[flag] = 1 else: tempDict[flag] += 1 showMaxNum = 0 finalNum = 0 for item in tempDict: if tempDict[item] > showMaxNum: showMaxNum = tempDict[item] finalNum = item print("final anwser is " + str(finalNum)) main(2) main(1)