SchemePlanManager.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. #include "SchemePlanManager.h"
  2. #include "ProjectManager.h"
  3. #include <QMetaEnum>
  4. #include <QDebug>
  5. QString SchemePlanManager::stringFromDataSource(SchemePlanManager::SchemeDataSource src)
  6. {
  7. switch (src) {
  8. case NoData:
  9. return "无";
  10. case FromExpert:
  11. return "导入专家数据";
  12. case FromMeasurement:
  13. return "添加实测数据";
  14. case FromScheme:
  15. return "专家导入";
  16. }
  17. }
  18. QString SchemePlanManager::nameOfAlgorithm(SchemePlanManager::Algorithm alg)
  19. {
  20. switch (alg) {
  21. case NoAlg:
  22. return "无";
  23. case PrincipalComponents:
  24. return "主成分分析法";
  25. case Entropy:
  26. return "熵值法";
  27. case AHP:
  28. return "层次分析法";
  29. case HWM:
  30. return "层次加权法";
  31. case SPA:
  32. return "集对分析法";
  33. case MEA:
  34. return "物元分析法";
  35. case GCE:
  36. return "灰色聚类评估法";
  37. case WeightedSum:
  38. return "加权求和法";
  39. }
  40. }
  41. QString SchemePlanManager::descriptionOfAlgorithm(SchemePlanManager::Algorithm alg)
  42. {
  43. switch (alg) {
  44. case NoAlg:
  45. return "";
  46. case PrincipalComponents:
  47. return "第一步,原始数据标准化。\n第二步,求指标数据间的相关系数矩阵R。\n第三步,求R阵的特征根、"
  48. "特征向量和贡献率。\n第四步,确定主分量的个数K。\n第五步,用K个主分量排序。";
  49. case Entropy:
  50. return "第一步,空值处理:指标值如果含有空值,则剔除整条数据。\n第二步,异常值处理:对于占比大于1的剔除(对特殊"
  51. "指标占比除外),再分别计算每个指标下数据的均值和标准差,如果数据大于均值+3*标准差或小于均值-3*"
  52. "标准差,则剔除整条数据。\n第三步,数据标准化。由于正向指标和负向指标数值代表的含义不同(正向指标数值越"
  53. "高越好,负向指标数值越低越好),因此,对于高低指标用不同的算法进行数据标准化处理。\n第四步,计算指标值"
  54. "相对强度的熵,根据信息量与熵成反比的关系求出信息量权重。";
  55. case AHP:
  56. return "第一步,产生评价值\n决策人构造评价矩阵A。A矩阵中,若因素i与因素j的比较判断值为a(ij)"
  57. ",则因素i与因素j的比较判断值为a(ji)=1/"
  58. "a(ij)"
  59. "。\n第二步,本征向量法求解\n对于评价矩阵A和单位阵I以及权向量w,如果目标重要性判断矩阵A中的值估计正确,"
  60. "则式(A-nI)"
  61. "w严格等于零,即为n维零向量;如果A的值不够准确,则A中元素的微小摄动意味着本征值的摄动,再结合权重和等于1"
  62. "可得到本征向量即权向量w。\n第三步,一致性"
  63. "检验\n一致性指标CI(consistence "
  64. "index)与与同阶矩阵的随机指标RI(random index)之比称为一致性比率CR(consistence "
  65. "rate),比率CR可用于判定能否接受矩阵A:若CR>0.1,说明A中各元素a(ij)的一致性太差,应重新估计;若CR<0."
  66. "1,说明A中各元素a(ij)"
  67. "的估计基本一致,这时求出的权值可用。\n第四步,方案排序\n若备选方案在各属性下的值已知,可以根据属性值和"
  68. "权重排出方案的优先序。若备选方案在各目标下属性值难以量化时,通过在各目标下不同方案优劣的两两比较,求得"
  69. "每个目标下各方案的优劣性,再计算方案的总体优劣性,根据总体优劣性的大小排出方案的优劣。";
  70. case HWM:
  71. return "在属性集满足独立性条件时,设定各个属性的权值,对每个方案求其各属性的加权和,以此进行综合,按综合值大小"
  72. "进行优劣方案排序。\n在此基础上,利用递推概念,将有限方案的多属性决策问题分解为若干层次,构造第k+"
  73. "1级的某个元素对第k级的某个元素z的优先函数。依此类推,就可推出相对于最上层的单个元素的最底层的元素的优先"
  74. "序。";
  75. case SPA:
  76. return "第一步,将有关联的两个集合构造成一组集对,分析集对中集合的同一性、差异性和对立性。\n第二步,通过计算联"
  77. "系度的大小来确定两集合的相似性。\n第三步,引入同异反向量模型,通过联系度排序得到最优方案。";
  78. case MEA:
  79. return "第一步,物元矩阵、经典域以及节域的确定和划分。\n第二步,计算指标对于各等级的关联函数。\n第三步,确定指"
  80. "标权重、计算关联度。\n第四步,确定评定等级。";
  81. case GCE:
  82. return "第一步,根据定性分析,确定指标体系和各指标在指标体系中的权重。\n第二步,按照评估要求刻画灰类,选取阈值"
  83. "。\n第三步,建立三角白化权函数。\n第四步,整理修改前后各指标的实现值,分别计算其属于各灰类的隶属度。\n"
  84. "第五步,计算综合聚类系数,分析结果,作出合理判断。";
  85. case WeightedSum:
  86. return "第一步,求得各属性的权重与其对应的评价值的乘积。\n第二步,将结果相加得到综合评价值。";
  87. }
  88. }
  89. QString SchemePlanManager::stringFromIndexCostType(SchemePlanManager::IndexCostType t)
  90. {
  91. switch (t) {
  92. case IndexCostTypeCost:
  93. return "成本型";
  94. case IndexCostTypeBenefit:
  95. return "效益型";
  96. }
  97. }
  98. QString SchemePlanManager::processName(const SchemeProcessInfo &process)
  99. {
  100. QList<QString> l1 = { "构建权重分析指标体系", "收集权重分析数据", "指标体系优化", "指标权重计算", "", "",
  101. "分析结果展示", "生成分析评估报告" };
  102. QList<QString> l2 = {
  103. "构建技术措施指标体系", "", "", "", "收集评估数据", "评估计算", "评估结果展示", "生成评估报告"
  104. };
  105. QList<QString> l3 = { "构建方案优选指标体系", "收集方案优选权重分析数据",
  106. "指标体系优化", "指标权重计算",
  107. "评估数据采集", "方案优选计算",
  108. "方案优选结果展示", "生成方案优选报告" };
  109. QList<QString> l4 = { "构建效能评估指标体系", "收集效能评估权重分析数据", "指标体系优化",
  110. "效能评估权重计算", "收集效能评估数据", "效能评估计算",
  111. "效能评估结果展示", "生成效能评估报告" };
  112. QList<QList<QString>> names = { l1, l2, l3, l4 };
  113. /// 获取指标类型枚举值 index
  114. /// 由于枚举值不是连续自然数, 故不能作为下表来索引数组
  115. /// 故须使用 index 替代
  116. int index = 0;
  117. QMetaEnum indexEnum = QMetaEnum::fromType<ProjectManager::IndexType>();
  118. for (int i = 0; i < indexEnum.keyCount(); i++) {
  119. if (indexEnum.value(i) == process.indexType) {
  120. index = i;
  121. break;
  122. }
  123. }
  124. if (index >= 0 && index < names.count() && process.type >= 0 && process.type < names[index].count()) {
  125. return names[index][process.type];
  126. }
  127. return "";
  128. }
  129. QString SchemePlanManager::processDescription(const SchemePlanManager::SchemeProcessInfo &process)
  130. {
  131. switch (process.type) {
  132. case IndexSystem:
  133. return "在指标体系设计页面,录入项目包含的指标,注意指标名称不能重复。";
  134. case ImportWeightData:
  135. case ImportEvalData: {
  136. if (process.dSource == FromExpert) {
  137. return "在评估数据采集页面给项目配置专家和权重。从评估项目管理页面找到对应的项目,导出资源包分发给专家。收"
  138. "集到专家填写的数据后,在评估数据采集页面导入专家数据。";
  139. } else if (process.dSource == FromMeasurement) {
  140. return "在评估数据采集页面添加实测数据。";
  141. } else if (process.dSource == FromScheme) {
  142. return "在评估数据采集页面添加专家方案。";
  143. }
  144. break;
  145. }
  146. case OptimizeIndex:
  147. return "";
  148. case CalculateWeight: {
  149. QString algName = nameOfAlgorithm(process.algorithm);
  150. return QString("使用%1计算各个指标的权重。").arg(algName);
  151. }
  152. case RunEvaluate: {
  153. QString algName = nameOfAlgorithm(process.algorithm);
  154. if (process.indexType == ProjectManager::TechIndex) {
  155. return QString("使用%1进行技术措施重要度评估。").arg(algName);
  156. } else if (process.indexType == ProjectManager::OptimalIndex) {
  157. return QString("使用%1进行方案优选评估。").arg(algName);
  158. } else if (process.indexType == ProjectManager::EfficiencyIndex) {
  159. return QString("使用%1进行综合效能评估。").arg(algName);
  160. }
  161. }
  162. case ShowEvalResult: {
  163. if (process.indexType == ProjectManager::AbilityIndex) {
  164. return "在评估数据处理页面查看权重分析结果";
  165. } else {
  166. return "在评估数据处理页面查看评估结果";
  167. }
  168. case GenerateReport:
  169. return "";
  170. default:
  171. break;
  172. }
  173. }
  174. return "";
  175. }
  176. QList<SchemePlanManager::SchemeDataSource>
  177. SchemePlanManager::processOptionalDataSource(const SchemeProcessInfo &process)
  178. {
  179. if (process.type == ImportEvalData && process.indexType == ProjectManager::EfficiencyIndex) {
  180. return { FromMeasurement };
  181. }
  182. if (process.type == ImportEvalData && process.indexType == ProjectManager::OptimalIndex) {
  183. return { FromScheme };
  184. }
  185. if (process.type == ImportWeightData || process.type == ImportEvalData) {
  186. return { FromExpert, FromMeasurement };
  187. }
  188. return {};
  189. }
  190. /**
  191. * 根据指标体系类型和方案步骤类型, 返回可选算法
  192. * date: 2023-11-03 by chengxr
  193. */
  194. QList<SchemePlanManager::Algorithm> SchemePlanManager::processOptionalAlgorithms(const SchemeProcessInfo &process)
  195. {
  196. switch (process.type) {
  197. case OptimizeIndex:
  198. return { PrincipalComponents };
  199. case CalculateWeight: {
  200. return { AHP, Entropy, PrincipalComponents };
  201. }
  202. case RunEvaluate: {
  203. if (process.indexType == ProjectManager::TechIndex) {
  204. return { WeightedSum };
  205. } else if (process.indexType == ProjectManager::OptimalIndex) {
  206. return { HWM, SPA };
  207. } else if (process.indexType == ProjectManager::EfficiencyIndex) {
  208. return { MEA, GCE };
  209. }
  210. return {};
  211. }
  212. case IndexSystem:
  213. case ImportWeightData:
  214. case ImportEvalData:
  215. case ShowEvalResult:
  216. case GenerateReport:
  217. return {};
  218. }
  219. }
  220. bool SchemePlanManager::processIsOptional(const SchemeProcessInfo &process)
  221. {
  222. return (process.type == GenerateReport);
  223. }
  224. SchemePlanManager::SchemePlanManager(QObject *parent) : QObject(parent) { }