瀏覽代碼

新汤普森实验V2

gufengshou1 11 月之前
父節點
當前提交
c4c99e80f5

+ 7 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/redis/AlgorithmRedisHelper.java

@@ -1,5 +1,6 @@
 package com.tzld.piaoquan.ad.engine.commons.redis;
 
+import com.google.common.collect.Collections2;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,6 +41,12 @@ public class AlgorithmRedisHelper {
         return Objects.isNull(obj) ? null : obj.toString();
     }
 
+    public List<String> getValues(List<String> keys) {
+        List<String> values = redisTemplate.opsForValue().multiGet(keys);
+        return CollectionUtils.isEmpty(values) ? null : values;
+    }
+
+
     public Long getLong(String key) {
         long longVal = 0L;
         Object obj = redisTemplate.opsForValue().get(key);

+ 1 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/impl/PredictModelServiceImpl.java

@@ -90,6 +90,7 @@ public class PredictModelServiceImpl implements PredictModelService {
 
 
             List<Map<String,Object>> mapList=(List)requestParam.getAbExpInfo().get("ab_test002");
+
             Map<String,List<JSONObject>> configMap=new HashMap<>();
             //该用户所有实验合集
             Set<String> expCodes=new HashSet<>();

+ 103 - 14
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/VideoAdThompsonScorerV2.java

@@ -7,6 +7,7 @@ import com.tzld.piaoquan.ad.engine.service.score.dto.AdPlatformCreativeDTO;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
 import org.apache.commons.math3.distribution.BetaDistribution;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 import java.util.*;
@@ -20,25 +21,39 @@ public class VideoAdThompsonScorerV2 {
     private String redisCreativeStatisticsPrefix="redis:cid_aciton:";
     //redis:vid_cid_aciton:{$vid}_{$cid}
     private String redisVideoCreativeStatisticsPrefix="redis:vid_cid_aciton:";
+
+    private Map<String,Double> exp663Param=new HashMap<>();
+    private Map<String,Double> exp664Param=new HashMap<>();
+    private Map<String,Double> exp665Param=new HashMap<>();
+    private Map<String,Double> exp666Param=new HashMap<>();
     Random random=new Random();
     Gson gson=new Gson();
-    public List<AdRankItem> thompsonScorerByExp1(ScoreParam param, List<AdPlatformCreativeDTO> adIdList){
+    public List<AdRankItem> thompsonScorerByExp663(ScoreParam param, List<AdPlatformCreativeDTO> adIdList){
         List<AdRankItem> result=new LinkedList<>();
         String jsonStr;
         CreativeStatistic statistic;
+        List<String> redisKey=new LinkedList<>();
+        adIdList.forEach(creativeDTO -> {
+            redisKey.add(redisCreativeStatisticsPrefix+creativeDTO.getCreativeId());
+        });
+        List<String> values=redisHelper.getValues(redisKey);
         double score=0d;
+        int i=0;
         for(AdPlatformCreativeDTO dto:adIdList){
             try {
                 AdRankItem item=new AdRankItem();
                 item.setVideoId(param.getVideoId());
                 item.setCpa(dto.getCpa());
                 item.setAdId(dto.getCreativeId());
-                jsonStr=redisHelper.getString(redisCreativeStatisticsPrefix+dto.getCreativeId());
+                jsonStr=values.get(i++);
                 if(jsonStr==null){
-                    score = 0.000001 + (random.nextDouble() * (0.00001 - 0.000001));
+                    score = exp663Param.getOrDefault("randomMin",0.000001)
+                            + (random.nextDouble() *
+                            (exp663Param.getOrDefault("randomMax",0.00001 ) - exp663Param.getOrDefault("randomMin",0.000001 )));
                 }else {
                     statistic =gson.fromJson(jsonStr,CreativeStatistic.class);
-                    score = (1d+Long.parseLong(statistic.getOrder())) / (10000d+Long.parseLong(statistic.getExp())) *dto.getCpa();
+                    score = (exp663Param.getOrDefault("alpha",1d)+Long.parseLong(statistic.getOrder()))
+                            / (exp663Param.getOrDefault("beta",10000d)+Long.parseLong(statistic.getExp())) *dto.getCpa();
                 }
                 item.setScore(score);
                 result.add(item);
@@ -48,10 +63,16 @@ public class VideoAdThompsonScorerV2 {
         Collections.sort(result);
         return result;
     }
-    public List<AdRankItem> thompsonScorerByExp2(ScoreParam param,List<AdPlatformCreativeDTO> adIdList){
+    public List<AdRankItem> thompsonScorerByExp664(ScoreParam param,List<AdPlatformCreativeDTO> adIdList){
         List<AdRankItem> result=new LinkedList<>();
         String jsonStr;
         CreativeStatistic statistic;
+        List<String> redisKey=new LinkedList<>();
+        adIdList.forEach(creativeDTO -> {
+            redisKey.add(redisVideoCreativeStatisticsPrefix+param.getVideoId()+"_"+creativeDTO.getCreativeId());
+        });
+        List<String> values=redisHelper.getValues(redisKey);
+        int i=0;
         double score=0d;
         for(AdPlatformCreativeDTO dto:adIdList){
             try {
@@ -59,12 +80,15 @@ public class VideoAdThompsonScorerV2 {
                 item.setVideoId(param.getVideoId());
                 item.setCpa(dto.getCpa());
                 item.setAdId(dto.getCreativeId());
-                jsonStr=redisHelper.getString(redisVideoCreativeStatisticsPrefix+param.getVideoId()+"_"+dto.getCreativeId());
+                jsonStr=values.get(i++);
                 if(jsonStr==null){
-                    score = 0.000001 + (random.nextDouble() * (0.00001 - 0.000001));
+                    score = exp664Param.getOrDefault("randomMin",0.000001)
+                            + (random.nextDouble() *
+                            (exp664Param.getOrDefault("randomMax",0.00001 ) - exp664Param.getOrDefault("randomMin",0.000001 )));
                 }else {
                     statistic =gson.fromJson(jsonStr,CreativeStatistic.class);
-                    score = (1d+Long.parseLong(statistic.getOrder())) / (10000d+Long.parseLong(statistic.getExp())) *dto.getCpa();
+                    score = (exp664Param.getOrDefault("alpha",1d)+Long.parseLong(statistic.getOrder()))
+                            / (exp664Param.getOrDefault("beta",10000d)+Long.parseLong(statistic.getExp())) *dto.getCpa();
                 }
                 item.setScore(score);
                 result.add(item);
@@ -74,10 +98,16 @@ public class VideoAdThompsonScorerV2 {
         Collections.sort(result);
         return result;
     }
-    public List<AdRankItem> thompsonScorerByExp3(ScoreParam param,List<AdPlatformCreativeDTO> adIdList){
+    public List<AdRankItem> thompsonScorerByExp665(ScoreParam param,List<AdPlatformCreativeDTO> adIdList){
         List<AdRankItem> result=new LinkedList<>();
         String jsonStr;
         CreativeStatistic statistic;
+        List<String> redisKey=new LinkedList<>();
+        adIdList.forEach(creativeDTO -> {
+            redisKey.add(redisCreativeStatisticsPrefix+creativeDTO.getCreativeId());
+        });
+        List<String> values=redisHelper.getValues(redisKey);
+        int i=0;
         double score=0d;
         for(AdPlatformCreativeDTO dto:adIdList){
             try {
@@ -85,12 +115,13 @@ public class VideoAdThompsonScorerV2 {
                 item.setVideoId(param.getVideoId());
                 item.setCpa(dto.getCpa());
                 item.setAdId(dto.getCreativeId());
-                jsonStr=redisHelper.getString(redisCreativeStatisticsPrefix+dto.getCreativeId());
+                jsonStr=values.get(i++);
                 if(jsonStr==null){
-                    score = betaSampler(1d,100000d);
+                    score = betaSampler(exp665Param.getOrDefault("alpha",1d),exp665Param.getOrDefault("beta",100000d));
                 }else {
                     statistic =gson.fromJson(jsonStr,CreativeStatistic.class);
-                    score = betaSampler(1d+Long.parseLong(statistic.getOrder()) , 10000d+Long.parseLong(statistic.getExp())) *dto.getCpa();
+                    score = betaSampler(exp665Param.getOrDefault("alpha",1d)+Long.parseLong(statistic.getOrder()) ,
+                            exp665Param.getOrDefault("beta",100000d)+Long.parseLong(statistic.getExp())) *dto.getCpa();
                 }
                 item.setScore(score);
                 result.add(item);
@@ -100,15 +131,57 @@ public class VideoAdThompsonScorerV2 {
         Collections.sort(result);
         return result;
     }
-    public List<AdRankItem> thompsonScorerByExp4(ScoreParam param,List<AdPlatformCreativeDTO> adIdList){
+    public List<AdRankItem> thompsonScorerByExp666(ScoreParam param,List<AdPlatformCreativeDTO> adIdList){
         List<AdRankItem> result=new LinkedList<>();
+        String jsonStr;
+        CreativeStatistic statistic;
+
+        List<String> redisKey=new LinkedList<>();
+        adIdList.forEach(creativeDTO -> {
+            redisKey.add(redisCreativeStatisticsPrefix+creativeDTO.getCreativeId());
+        });
+        List<String> values=redisHelper.getValues(redisKey);
+        List<String> combineKeys=new LinkedList<>();
+        adIdList.forEach(creativeDTO -> {
+            combineKeys.add(redisVideoCreativeStatisticsPrefix+param.getVideoId()+"_"+creativeDTO.getCreativeId());
+        });
+        List<String> combineValues=redisHelper.getValues(combineKeys);
+        int i=0;
+        double score=0d;
         for(AdPlatformCreativeDTO dto:adIdList){
             try {
-
+                AdRankItem item=new AdRankItem();
+                item.setVideoId(param.getVideoId());
+                item.setCpa(dto.getCpa());
+                item.setAdId(dto.getCreativeId());
+                jsonStr=combineValues.get(i);
+                if(jsonStr==null){
+                    jsonStr=values.get(i);
+                    if(jsonStr==null){
+                        score = betaSampler(exp666Param.getOrDefault("alpha",1d),exp666Param.getOrDefault("beta",100000d));
+                    }else {
+                        statistic =gson.fromJson(jsonStr,CreativeStatistic.class);
+                        score = betaSampler(exp666Param.getOrDefault("alpha",1d)+Long.parseLong(statistic.getOrder()) , exp666Param.getOrDefault("beta",100000d)+Long.parseLong(statistic.getExp())) *dto.getCpa();
+                    }
+                }else {
+                    statistic =gson.fromJson(jsonStr,CreativeStatistic.class);
+                    if(Double.parseDouble(statistic.getExp())>exp666Param.getOrDefault("viewThreshold",500d)){
+                        score = betaSampler(1d+Long.parseLong(statistic.getOrder()) , exp666Param.getOrDefault("beta",100000d)+Long.parseLong(statistic.getExp())) *dto.getCpa();
+                    } else if( values.get(i)!=null) {
+                        statistic =gson.fromJson(values.get(i),CreativeStatistic.class);
+                        score = betaSampler(exp666Param.getOrDefault("alpha",1d)+Long.parseLong(statistic.getOrder()) , exp666Param.getOrDefault("beta",100000d)+Long.parseLong(statistic.getExp())) *dto.getCpa();
+                    }else {
+                        score = betaSampler(exp666Param.getOrDefault("alpha",1d),exp666Param.getOrDefault("beta",100000d));
+                    }
+                }
+                item.setScore(score);
+                result.add(item);
             }catch (Exception e){
 
             }
+
         }
+        Collections.sort(result);
         return result;
     }
     class CreativeStatistic{
@@ -156,4 +229,20 @@ public class VideoAdThompsonScorerV2 {
         BetaDistribution betaSample = new BetaDistribution(alpha, beta);
         return betaSample.sample();
     }
+    @Value("${ad.engine.new.thompson.V2.663:{}}")
+    public void setExp663Param(String str){
+       this.exp663Param=gson.fromJson(str,Map.class);
+    }
+    @Value("${ad.engine.new.thompson.V2.664:{}}")
+    public void setExp664Param(String str){
+        this.exp663Param=gson.fromJson(str,Map.class);
+    }
+    @Value("${ad.engine.new.thompson.V2.665:{}}")
+    public void setExp665Param(String str){
+        this.exp663Param=gson.fromJson(str,Map.class);
+    }
+    @Value("${ad.engine.new.thompson.V2.666:{}}")
+    public void setExp666Param(String str){
+        this.exp663Param=gson.fromJson(str,Map.class);
+    }
 }

+ 17 - 3
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/RankServiceImpl.java

@@ -1,7 +1,6 @@
 package com.tzld.piaoquan.ad.engine.service.score.impl;
 
 import com.alibaba.fastjson.JSONObject;
-import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.score.VideoAdThompsonScorerV2;
 import com.tzld.piaoquan.ad.engine.service.score.container.AdCreativeFeatureContainer;
 import com.tzld.piaoquan.ad.engine.service.score.container.PidLambdaContainer;
@@ -230,11 +229,26 @@ public class RankServiceImpl implements RankService {
 //                e.printStackTrace();
 //            }
 //        }
+        Set<String> expCodes=new HashSet<>();
+        if (request.getAdAbExpArr() != null && request.getAdAbExpArr().size() != 0) {
+            for (Map<String, Object> map : request.getAdAbExpArr() ) {
+                String expCode=map.getOrDefault("abExpCode","").toString();
+                expCodes.add(expCode);
+            }
+        }
 
         // 兜底方案
-        List<AdRankItem> rankResult;
+        List<AdRankItem> rankResult=null;
+        if(expCodes.contains("663")){
+            rankResult = videoAdThompsonScorerV2.thompsonScorerByExp663(param, request.getAdIdList());
+        }else if(expCodes.contains("664")){
+            rankResult = videoAdThompsonScorerV2.thompsonScorerByExp664(param, request.getAdIdList());
+        }else if(expCodes.contains("665")){
+            rankResult = videoAdThompsonScorerV2.thompsonScorerByExp665(param, request.getAdIdList());
+        }else if(expCodes.contains("666")){
+            rankResult = videoAdThompsonScorerV2.thompsonScorerByExp666(param, request.getAdIdList());
+        }
 
-        rankResult = videoAdThompsonScorerV2.thompsonScorerByExp1(param, request.getAdIdList());
 
 
         if (!CollectionUtils.isEmpty(rankResult)) {