matlab
复制代码
function weights = combinedWeighting(data_matrix)
% 主观权重 - AHP法
subjective_weights = analyticHierarchyProcess();
% 客观权重 - 熵权法
objective_weights = entropyWeightMethod(data_matrix);
% 组合权重
alpha = 0.6; % 主观权重系数
beta = 0.4; % 客观权重系数
weights = alpha * subjective_weights + beta * objective_weights;
weights = weights / sum(weights); % 归一化
end
function weights = analyticHierarchyProcess()
% 构建判断矩阵(示例)
judgment_matrix = [
1, 3, 2, 1, 2;
1/3, 1, 1/2, 1/3, 1/2;
1/2, 2, 1, 1/2, 1;
1, 3, 2, 1, 2;
1/2, 2, 1, 1/2, 1
];
% 特征向量法求权重
[V, D] = eig(judgment_matrix);
[~, idx] = max(diag(D));
weights = V(:, idx) / sum(V(:, idx));
end
function weights = entropyWeightMethod(data_matrix)
[m, n] = size(data_matrix);
% 数据标准化
normalized_data = zeros(m, n);
for j = 1:n
if max(data_matrix(:,j)) ~= min(data_matrix(:,j))
normalized_data(:,j) = (data_matrix(:,j) - min(data_matrix(:,j))) / ...
(max(data_matrix(:,j)) - min(data_matrix(:,j)));
else
normalized_data(:,j) = 0.5;
end
end
% 计算熵值
p = normalized_data ./ sum(normalized_data, 1);
p(p == 0) = 1e-10; % 避免log(0)
e = -sum(p .* log(p), 1) / log(m);
% 计算权重
weights = (1 - e) / sum(1 - e);
end
matlab
复制代码
%% 模拟机协同训练质量评价主程序
classdef SimulatorTrainingQualityEvaluation
properties
EvaluationIndicators % 评价指标体系
CloudMatterElements % 云物元集合
Weights % 组合权重
EvaluationResults % 评价结果
TrainingData % 训练数据
end
methods
function obj = SimulatorTrainingQualityEvaluation()
obj = obj.initializeEvaluationSystem();
end
function obj = initializeEvaluationSystem(obj)
% 初始化评价指标体系
obj.EvaluationIndicators = {
'操作准确性', [0.8, 1.0], [0.6, 1.0];
'反应速度', [0.7, 0.9], [0.5, 1.0];
'程序规范性', [0.9, 1.0], [0.7, 1.0];
'沟通协调', [0.8, 1.0], [0.6, 1.0];
'角色配合', [0.8, 1.0], [0.6, 1.0];
'环境真实感', [0.7, 0.9], [0.5, 1.0];
'系统稳定性', [0.9, 1.0], [0.7, 1.0];
'技能提升度', [0.8, 1.0], [0.6, 1.0]
};
% 创建云物元对象
obj.CloudMatterElements = cell(size(obj.EvaluationIndicators, 1), 1);
for i = 1:length(obj.CloudMatterElements)
name = obj.EvaluationIndicators{i, 1};
classical = obj.EvaluationIndicators{i, 2};
node = obj.EvaluationIndicators{i, 3};
obj.CloudMatterElements{i} = ImprovedCloudMatterElement(name, classical, node);
end
end
function results = evaluateTrainingQuality(obj, training_data)
% 训练质量综合评价
[num_samples, num_indicators] = size(training_data);
% 计算权重
obj.Weights = combinedWeighting(training_data);
% 计算各样本的综合评价结果
comprehensive_scores = zeros(num_samples, 1);
membership_matrix = zeros(num_samples, num_indicators);
quality_levels = cell(num_samples, 1);
for i = 1:num_samples
sample_scores = zeros(num_indicators, 1);
for j = 1:num_indicators
% 计算各指标隶属度
membership = obj.CloudMatterElements{j}.calculateMembership(training_data(i, j));
membership_matrix(i, j) = membership;
sample_scores(j) = membership * obj.Weights(j);
end
% 综合得分
comprehensive_scores(i) = sum(sample_scores);
% 质量等级判定
quality_levels{i} = obj.determineQualityLevel(comprehensive_scores(i));
end
% 存储结果
obj.EvaluationResults.ComprehensiveScores = comprehensive_scores;
obj.EvaluationResults.MembershipMatrix = membership_matrix;
obj.EvaluationResults.QualityLevels = quality_levels;
obj.TrainingData = training_data;
results = obj.EvaluationResults;
end
function level = determineQualityLevel(obj, score)
% 根据得分确定质量等级
if score >= 0.9
level = '优秀';
elseif score >= 0.8
level = '良好';
elseif score >= 0.7
level = '中等';
elseif score >= 0.6
level = '合格';
else
level = '不合格';
end
end
function visualizeResults(obj)
% 结果可视化
figure('Position', [100, 100, 1400, 900]);
% 1. 综合得分分布
subplot(2, 3, 1);
scores = obj.EvaluationResults.ComprehensiveScores;
histogram(scores, 10, 'FaceColor', [0.2 0.6 0.8], 'EdgeColor', 'none');
title('训练质量综合得分分布', 'FontSize', 12, 'FontWeight', 'bold');
xlabel('综合得分');
ylabel('频数');
grid on;
% 2. 各指标权重分布
subplot(2, 3, 2);
pie(obj.Weights, obj.EvaluationIndicators(:,1));
title('评价指标权重分布', 'FontSize', 12, 'FontWeight', 'bold');
% 3. 质量等级分布
subplot(2, 3, 3);
levels = obj.EvaluationResults.QualityLevels;
level_categories = {'优秀', '良好', '中等', '合格', '不合格'};
level_counts = zeros(1, 5);
for i = 1:length(levels)
idx = find(strcmp(level_categories, levels{i}));
level_counts(idx) = level_counts(idx) + 1;
end
bar(level_counts, 'FaceColor', [0.8 0.4 0.2]);
set(gca, 'XTickLabel', level_categories);
title('训练质量等级分布', 'FontSize', 12, 'FontWeight', 'bold');
ylabel('数量');
% 4. 指标隶属度热力图
subplot(2, 3, 4);
imagesc(obj.EvaluationResults.MembershipMatrix);
colorbar;
title('各指标隶属度热力图', 'FontSize', 12, 'FontWeight', 'bold');
xlabel('评价指标');
ylabel('训练样本');
set(gca, 'XTick', 1:length(obj.EvaluationIndicators));
set(gca, 'XTickLabel', obj.EvaluationIndicators(:,1), 'XTickLabelRotation', 45);
% 5. 雷达图 - 平均隶属度
subplot(2, 3, 5);
avg_membership = mean(obj.EvaluationResults.MembershipMatrix, 1);
radar_plot(avg_membership, obj.EvaluationIndicators(:,1));
title('各指标平均隶属度雷达图', 'FontSize', 12, 'FontWeight', 'bold');
% 6. 时间趋势分析(如果有时间序列数据)
subplot(2, 3, 6);
plot(scores, '-o', 'LineWidth', 2, 'MarkerSize', 4, 'Color', [0.2 0.7 0.3]);
title('训练质量时间趋势', 'FontSize', 12, 'FontWeight', 'bold');
xlabel('训练批次');
ylabel('综合得分');
grid on;
sgtitle('模拟机协同训练质量评价综合分析', 'FontSize', 16, 'FontWeight', 'bold');
end
function generateReport(obj)
% 生成评价报告
fprintf('\n=== 模拟机协同训练质量评价报告 ===\n');
fprintf('评价时间: %s\n', datestr(now));
fprintf('评价样本数: %d\n', length(obj.EvaluationResults.ComprehensiveScores));
avg_score = mean(obj.EvaluationResults.ComprehensiveScores);
fprintf('平均综合得分: %.4f\n', avg_score);
levels = obj.EvaluationResults.QualityLevels;
level_dist = tabulate(levels);
fprintf('\n质量等级分布:\n');
for i = 1:size(level_dist, 1)
fprintf(' %s: %.1f%% (%d个)\n', level_dist{i,1}, level_dist{i,3}, level_dist{i,2});
end
% 薄弱环节分析
avg_membership = mean(obj.EvaluationResults.MembershipMatrix, 1);
[min_membership, min_idx] = min(avg_membership);
fprintf('\n薄弱环节分析:\n');
fprintf(' 最薄弱指标: %s (平均隶属度: %.4f)\n', ...
obj.EvaluationIndicators{min_idx,1}, min_membership);
% 改进建议
fprintf('\n改进建议:\n');
if min_membership < 0.7
fprintf(' * 重点加强"%s"方面的训练\n', obj.EvaluationIndicators{min_idx,1});
end
if avg_score < 0.8
fprintf(' * 建议增加协同训练频次\n');
fprintf(' * 优化训练情景设计\n');
end
end
end
end
%% 辅助函数 - 雷达图绘制
function radar_plot(data, labels)
n = length(data);
angles = linspace(0, 2*pi, n+1);
angles = angles(1:end-1);
% 扩展数据以闭合图形
data_radar = [data, data(1)];
angles_radar = [angles, angles(1)];
polarplot(angles_radar, data_radar, 'LineWidth', 2, 'Color', [0.8 0.2 0.2]);
thetaticks(rad2deg(angles));
thetaticklabels(labels);
rlim([0 1]);
end