weightValue.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. package main
  2. import (
  3. "log"
  4. "math/rand"
  5. "sync"
  6. "time"
  7. )
  8. type weightInfo struct {
  9. maxLevel bool
  10. minLevel bool
  11. siteLevel int
  12. qualityScore int
  13. ranking int
  14. data map[string]interface{}
  15. }
  16. //一般数据判重
  17. type weightDataMap struct {
  18. lock sync.Mutex //锁
  19. data map[string]*weightInfo
  20. allids []string
  21. saveids []string
  22. templateid string //模板id
  23. }
  24. func NewWeightData(arr []string,templateid string) *weightDataMap {
  25. //测试-默认第一个
  26. arr = []string{"5638baccaf53745d9a000994","5638baccaf53745d9a000995","5638baccaf53745d9a000998",
  27. "603717b8fc702705550b8df4","603717b8fc702705550b8df5","603717b8fc702705550b8df6"}
  28. weight := &weightDataMap{sync.Mutex{},map[string]*weightInfo{},[]string{},[]string{},templateid}
  29. data := make(map[string]*weightInfo,0)
  30. for _,v:=range arr {
  31. dict := mgo.FindById(coll_name,v)
  32. if dict!=nil && len(dict)>2{
  33. data[v] = analyzeTheSoureData(dict)
  34. }
  35. }
  36. //测试模拟分数
  37. //weight := &weightDataMap{sync.Mutex{},map[string]*weightInfo{},[]string{},[]string{},templateid}
  38. //data := make(map[string]*weightInfo,0)
  39. //max :=[]bool{false,false,false,false,false,false,false,false,false,false}
  40. //min :=[]bool{false,false,false,false,false,false,false,false,false,false}
  41. //site :=[]int{2,1,5,3,4,2,3,5,1,0}
  42. //qua :=[]int{15,11,11,11,22,19,22,44,22,66}
  43. //rank :=[]int{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}
  44. //for k,v:=range arr {
  45. // data[v] = &weightInfo{
  46. // max[k],
  47. // min[k],
  48. // site[k],
  49. // qua[k],
  50. // rank[k],
  51. // }
  52. //}
  53. weight.data = data
  54. return weight
  55. }
  56. //分析源数据数据
  57. func analyzeTheSoureData(tmp map[string]interface{}) *weightInfo {
  58. maxLevel := false
  59. minLevel := false
  60. ranking := -1 //默认 无排名
  61. //分析站点方法
  62. siteLevel := analyzeTheSite(tmp)
  63. //质量评分
  64. qualityScore := analyzeTheElements(tmp)
  65. return &weightInfo{
  66. maxLevel,
  67. minLevel,
  68. siteLevel,
  69. qualityScore,
  70. ranking,
  71. tmp,
  72. }
  73. }
  74. //分析模板数据-打标记构建数据结构
  75. func (weight *weightDataMap) analyzeBuildStandardData() {
  76. //log.Print("分析前",weight.allids,weight.saveids,weight.templateid,len(weight.data))
  77. weight.lock.Lock()
  78. //分析里面的打分,以及是否参与融合来决定
  79. data:=weight.data
  80. //分析不同维度的数据-排列ranking,并调换顺序
  81. //先构建
  82. arrAllIds := make([]string,0)
  83. arrSaveIds := make([]string,0)
  84. arrMaxLevel := make([]bool,0)
  85. arrMinLevel := make([]bool,0)
  86. arrSiteLevel := make([]int,0)
  87. arrQualityScore := make([]int,0)
  88. arrRanking := make([]int,0) //主要排名
  89. //无序
  90. for k,v:=range data{
  91. //log.Println(v)
  92. //涉及前置条件,哪些数据不需要融合
  93. arrAllIds = append(arrAllIds,k)
  94. arrSaveIds = append(arrSaveIds,k)
  95. //
  96. arrMaxLevel = append(arrMaxLevel,v.maxLevel)
  97. arrMinLevel = append(arrMinLevel,v.minLevel)
  98. arrSiteLevel = append(arrSiteLevel,v.siteLevel)
  99. arrQualityScore = append(arrQualityScore,v.qualityScore)
  100. arrRanking = append(arrRanking,v.ranking)
  101. }
  102. log.Println("初始排名:",arrRanking)
  103. log.Println("初始质量:",arrQualityScore)
  104. log.Println("初始站点:",arrSiteLevel)
  105. //第一步,最大权重,重置排名
  106. isMaxIndexArr := make([]int,0) //记录索引
  107. isMaxIndexValueArr := make([]int,0)
  108. for k,v :=range arrMaxLevel {
  109. if v == true {
  110. arrRanking[k]=1
  111. isMaxIndexArr = append(isMaxIndexArr,k)
  112. isMaxIndexValueArr = append(isMaxIndexValueArr,arrQualityScore[k])
  113. }
  114. }
  115. rank_s :=1
  116. if len(isMaxIndexArr)>=1 {
  117. log.Println("进行最大权重...")
  118. rankIndexArr := dealWithGroupScores(isMaxIndexArr,isMaxIndexValueArr,arrSiteLevel)
  119. //log.Println(rankIndexArr)
  120. //重新排名
  121. for _,v:=range rankIndexArr {
  122. arrRanking[v] = rank_s
  123. rank_s++
  124. }
  125. }else {
  126. log.Println("无最大权重-质量-站点排序")
  127. }
  128. log.Println("第一步:经过最高权重比较得出--",arrRanking)
  129. //第二步,最小权重,重置排名
  130. isMinIndexArr := make([]int,0)
  131. isMinIndexValueArr := make([]int,0)
  132. for k,v :=range arrMinLevel {
  133. if v == true && arrMaxLevel[k]!=true {
  134. isMinIndexArr = append(isMinIndexArr,k)
  135. isMinIndexValueArr = append(isMinIndexValueArr,arrQualityScore[k])
  136. }
  137. }
  138. if len(isMinIndexArr)>=1 {
  139. log.Println("进行最小权重...")
  140. rankIndexArr := dealWithGroupScores(isMinIndexArr,isMinIndexValueArr,arrSiteLevel)
  141. //重新排名
  142. lastRank := len(arrSaveIds)
  143. //log.Println("最小排名分",lastRank,rankIndexArr)
  144. for i:=len(rankIndexArr)-1;i>=0;i-- {
  145. index:=rankIndexArr[i]
  146. arrRanking[index] = lastRank
  147. lastRank--
  148. }
  149. }else {
  150. log.Println("无最小权重-质量-站点排序")
  151. }
  152. log.Println("第二步:经过最小权重比较得出--",arrRanking)
  153. //第三步,分析第一步没排名的数据
  154. isQuaIndexArr := make([]int,0)
  155. isQuaIndexValueArr := make([]int,0)
  156. for k,v:=range arrRanking{
  157. if v==-1 {
  158. isQuaIndexArr = append(isQuaIndexArr,k)
  159. isQuaIndexValueArr = append(isQuaIndexValueArr,arrQualityScore[k])
  160. }
  161. }
  162. if len(isQuaIndexArr)>=1 {
  163. log.Println("进行质量-站点组合...")
  164. rankIndexArr := dealWithGroupScores(isQuaIndexArr,isQuaIndexValueArr,arrSiteLevel)
  165. //log.Println(rankIndexArr)
  166. //重新排名
  167. for _,v:=range rankIndexArr {
  168. arrRanking[v] = rank_s
  169. rank_s++
  170. }
  171. }else {
  172. log.Println("不需要进行质量-站点组合...")
  173. }
  174. log.Println("第三步:经过质量-站点权重比较得出--",arrRanking)
  175. template_id:=""
  176. //根据-排名-修改
  177. for k,v:=range arrRanking {
  178. index:=arrSaveIds[k]
  179. data[index].ranking = v
  180. //log.Println("key:",index,"排名:",v)
  181. if v==1 {
  182. template_id = index
  183. }
  184. }
  185. weight.data = data
  186. weight.templateid = template_id
  187. weight.allids = arrAllIds
  188. weight.saveids = arrSaveIds
  189. weight.lock.Unlock()
  190. }
  191. func dealWithGroupScores(indexArr []int, scoreArr []int,siteArr []int) []int {
  192. //log.Println("下标组",indexArr,"质量分组",scoreArr,"整体站点组",siteArr)
  193. //处理分组
  194. sort_scoreArr,sort_indexArr := sortGroupInt(scoreArr,indexArr)
  195. //log.Println("排序质量分:",sort_scoreArr,sort_indexArr)
  196. totalIndexArr:=make([][]int,0)
  197. lastTmp := -1
  198. for k,v :=range sort_scoreArr {
  199. if v<lastTmp || k==0 {
  200. arr_s := make([]int,0)
  201. arr_i := make([]int,0)
  202. for index,value :=range scoreArr {
  203. if v==value {
  204. arr_s = append(arr_s,value)
  205. arr_i = append(arr_i,sort_indexArr[index])
  206. }
  207. }
  208. totalIndexArr = append(totalIndexArr,arr_i)
  209. lastTmp = v
  210. }
  211. }
  212. finallyIndexArr := make([]int,0)
  213. for _,v:=range totalIndexArr{
  214. if len(v)>1 {
  215. //[6 3 4]
  216. arr_s :=make([]int,0)
  217. for _,v1:=range v{
  218. arr_s = append(arr_s,siteArr[v1])
  219. }
  220. _,b:=sortGroupInt(arr_s,v)
  221. for _,v2:=range b {
  222. finallyIndexArr = append(finallyIndexArr,v2)
  223. }
  224. }else {
  225. finallyIndexArr = append(finallyIndexArr,v[0])
  226. }
  227. }
  228. return finallyIndexArr
  229. }
  230. //排序 正常排序 ,站点
  231. func sortNormalInt(arrValue []int) ([]int){
  232. for i := 0; i < len(arrValue); i++ {
  233. for j := i + 1; j < len(arrValue); j++ {
  234. if arrValue[i] < arrValue[j] {
  235. arrValue[i], arrValue[j] = arrValue[j], arrValue[i]
  236. }
  237. }
  238. }
  239. return arrValue
  240. }
  241. //排序 质量,分组
  242. func sortGroupInt(arrValue []int,arrIndex []int) ([]int ,[]int){
  243. for i := 0; i < len(arrValue); i++ {
  244. for j := i + 1; j < len(arrValue); j++ {
  245. if arrValue[i] < arrValue[j] {
  246. arrValue[i], arrValue[j] = arrValue[j], arrValue[i]
  247. arrIndex[i], arrIndex[j] = arrIndex[j], arrIndex[i]
  248. }
  249. }
  250. }
  251. return arrValue,arrIndex
  252. }
  253. //分析站点评分
  254. func analyzeTheSite(tmp map[string]interface{}) int {
  255. /*
  256. 站点评分1-5级
  257. */
  258. //测试随机分
  259. rand.Seed(time.Now().UnixNano()) //以当前系统时间作为种子参数
  260. return rand.Intn(10)
  261. }
  262. //分析要素评分
  263. func analyzeTheElements(tmp map[string]interface{}) int {
  264. /*
  265. 质量评分总分
  266. */
  267. //测试随机分
  268. rand.Seed(time.Now().UnixNano()) //以当前系统时间作为种子参数
  269. return rand.Intn(100)
  270. }