Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
142 changes: 41 additions & 101 deletions tempControl.html
Original file line number Diff line number Diff line change
Expand Up @@ -1432,7 +1432,6 @@ <h3>📋 系统日志</h3>
episodeRewards: []
};

this.stepSinceLastDraw = 0;
}

setupCharts() {
Expand Down Expand Up @@ -1524,61 +1523,43 @@ <h3>📋 系统日志</h3>
type: 'line',
data: {
labels: [],
datasets: [
{
label: '目标温度', // 数据集 0
data: [],
borderColor: '#FF9800',
backgroundColor: 'rgba(255,152,0,0.1)',
fill: false,
tension: 0.1,
borderWidth: 2,
yAxisID: 'temp'
},
{
label: '水温轨迹', // 数据集 1
data: [],
borderColor: '#4CAF50',
backgroundColor: 'rgba(76,175,80,0.1)',
fill: false,
tension: 0.1,
borderWidth: 2,
yAxisID: 'temp'
},
{
label: '奖励', // ⭐ 新增数据集 2
data: [],
borderColor: '#2196F3',
backgroundColor: 'rgba(33,150,243,0.05)',
fill: true,
tension: 0.2,
borderWidth: 1,
yAxisID: 'reward'
}
]
datasets: [
{
label: '目标温度', // 数据集 0
data: [],
borderColor: '#FF9800',
backgroundColor: 'rgba(255,152,0,0.1)',
fill: false,
tension: 0.1,
borderWidth: 2,
yAxisID: 'temp'
},
{
label: '水温轨迹', // 数据集 1
data: [],
borderColor: '#4CAF50',
backgroundColor: 'rgba(76,175,80,0.1)',
fill: false,
tension: 0.1,
borderWidth: 2,
yAxisID: 'temp'
}
]
},
options: {
responsive: true,
interaction: { intersect: false, mode: 'index' },
plugins: {
legend: { position: 'top' },
title: { display: true, text: '每轮训练后水温与奖励响应' }
},
scales: {
temp: { // 🌡️ 温度主轴(左)
type: 'linear',
position: 'left',
beginAtZero: false,
title: { display: true, text: '温度 (°C)' }
},
reward: { // 💰 奖励副轴(右)
type: 'linear',
position: 'right',
beginAtZero: true,
grid: { drawOnChartArea: false },
title: { display: true, text: '奖励' }
},
x: {
plugins: {
legend: { position: 'top' },
title: { display: true, text: '每轮训练后水温响应' }
},
scales: {
temp: { // 🌡️ 温度主轴(左)
type: 'linear',
position: 'left',
beginAtZero: false,
title: { display: true, text: '温度 (°C)' }
},
x: {
title: { display: true, text: '时间步' }
}
}
Expand Down Expand Up @@ -1774,9 +1755,8 @@ <h3>📋 系统日志</h3>
let lastWaterTemp = waterTemp;
let dTdt = 0;
let lastPower = 0;
const rewardTrace = [];
const tempTrace = [];
const tempErrors = [];
const tempTrace = [];
const tempErrors = [];
// 目标温度曲线全程用传入的 targetTemp
const setTrace = Array(maxSimSteps).fill(targetTemp);

Expand Down Expand Up @@ -1804,8 +1784,7 @@ <h3>📋 系统日志</h3>
const error = Math.abs(waterTemp - targetTemp);
tempErrors.push(error);

const reward = agent.calculateReward(waterTemp, targetTemp, power, lastWaterTemp, step);
rewardTrace.push(reward);


if (error < 0.1 && step > 200) break;
}
Expand All @@ -1814,17 +1793,8 @@ <h3>📋 系统日志</h3>
this.trainCurveChart.data.labels = tempTrace.map((_, i) => i);
// 目标温度轨迹必须全程用传入的 targetTemp
this.trainCurveChart.data.datasets[0].data = setTrace.slice(0, tempTrace.length);
this.trainCurveChart.data.datasets[1].data = tempTrace;
this.trainCurveChart.data.datasets[2].data = rewardTrace;

const CHART_UPDATE_INTERVAL = 1000; // 每 20 步才 redraw

this.stepSinceLastDraw++;
if (this.stepSinceLastDraw >= CHART_UPDATE_INTERVAL || step === episodeEnd) {
this.stepSinceLastDraw = 0;
this.trainCurveChart.update('none');

}
this.trainCurveChart.data.datasets[1].data = tempTrace;
this.trainCurveChart.update('none');

}

Expand Down Expand Up @@ -1879,9 +1849,7 @@ <h3>📋 系统日志</h3>
deltaT: parseFloat(document.getElementById('deltaT').value)
};

const rewardTrace = [];

this.stepSinceLastDraw = 0;


// 禁止训练期间使用固定 targetTemp
config.targetTemp = null;
Expand Down Expand Up @@ -1977,35 +1945,7 @@ <h3>📋 系统日志</h3>
];

// 改进的奖励函数 - 接收水温和目标温度
const reward = this.ddpgAgent.calculateReward(nextWaterTemp, episodeTarget, heatingPower, lastWaterTemp, step);
rewardTrace.push(reward);
this.log(`📈 [第${episode + 1}轮, 第${step + 1}步] 奖励: ${reward.toFixed(2)}`);

if (this.trainCurveChart.data.datasets.length < 3) {
this.trainCurveChart.data.datasets.push({
label: '每步奖励',
data: rewardTrace,
borderColor: '#E91E63',
backgroundColor: 'rgba(233, 30, 99, 0.1)',
fill: false,
tension: 0.1,
yAxisID: 'reward',
borderWidth: 1,
pointRadius: 0
});
} else {
this.trainCurveChart.data.datasets[2].data = rewardTrace;
}
if (!this.trainCurveChart.options.scales.reward) {
this.trainCurveChart.options.scales.reward = {
type: 'linear',
position: 'right',
title: { display: true, text: '奖励值' },
beginAtZero: false,
grid: { drawOnChartArea: false }
};
}
this.trainCurveChart.update('none');
const reward = this.ddpgAgent.calculateReward(nextWaterTemp, episodeTarget, heatingPower, lastWaterTemp, step);

// 改进的记忆函数,传入更多温度信息
this.ddpgAgent.remember(state, heatingPower, reward, nextState, false, waterTemp, episodeTarget, nextWaterTemp);
Expand Down