>>http://www.blogjava.net/willpower88/archive/2010/08/31/330437.html
需求:广告按权重展现
基本算法描述如下:
1、每个广告增加权重
2、将所有匹配广告的权重相加sum,
3、以相加结果为随机数的种子,生成1~sum之间的随机数rd
4、.接着遍历所有广告,访问顺序可以随意.将当前节点的权重值加上前面访问的各节点权重值得curWt,判断curWt >= rd,如果条件成立则返回当前节点,如果不是则继续累加下一节点. 直到符合上面的条件,由于rd<=sum 因此一定存在curWt>=rd。
特别说明:
此算法和广告的顺序无关
测试代码如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class Test {
/**
* @param args
*/
@SuppressWarnings("unchecked")
public static void main(String[] args) {
List<Node> arrNodes = new ArrayList<Node>();
Node n = new Node(10, "测试1");
arrNodes.add(n);
n = new Node(20, "测试2");
arrNodes.add(n);
n = new Node(30, "测试3");
arrNodes.add(n);
n = new Node(40, "测试4");
arrNodes.add(n);
//Collections.sort(arrNodes, new Node());
Map<String, Integer> showMap = null;
int sum = getSum(arrNodes);
int random = 0;
Node kw = null;
for(int k = 0; k < 20; k++) {
showMap = new LinkedHashMap<String, Integer>();
for(int i = 0; i < 100; i++) {
random = getRandom(sum);
kw = getKW(arrNodes, random);
if(showMap.containsKey(kw.kw)) {
showMap.put(kw.kw, showMap.get(kw.kw) + 1);
} else {
showMap.put(kw.kw, 1);
}
//System.out.println(i + " " +random + " " + getKW(arrNodes, random));
}
System.out.print(k + " ");
System.out.println(showMap);
}
}
public static Node getKW(List<Node> nodes, int rd) {
Node ret = null;
int curWt = 0;
for(Node n : nodes){
curWt += n.weight;
if(curWt >= rd) {
ret = n;
break;
}
}
return ret;
}
public static int getSum(List<Node> nodes) {
int sum = 0;
for(Node n : nodes)
sum += n.weight;
return sum;
}
public static int getRandom(int seed) {
return (int)Math.round(Math.random() * seed);
}
}
class Node implements Comparator{
int weight = 0;
String kw = "";
public Node() {}
public Node(int wt, String kw) {
this.weight = wt;
this.kw = kw;
}
public String toString(){
StringBuilder sbBuilder = new StringBuilder();
sbBuilder.append(" weight=").append(weight);
sbBuilder.append(" kw").append(kw);
return sbBuilder.toString();
}
public int compare(Object o1, Object o2) {
Node n1 = (Node)o1;
Node n2 = (Node)o2;
if(n1.weight > n2.weight)
return 1;
else
return 0;
}
}
分享到:
相关推荐
现在我们将深入探讨Nginx权重选择算法的原理以及如何在Java中实现这一算法。 **Nginx权重选择算法** 1. **基本原理**: Nginx的WRR算法主要基于权重值来决定将请求转发到哪个后端服务器。权重值越大,服务器被...
在给定的“带权重的A*算法C++、CMake实现”中,我们可以深入探讨以下几个关键知识点: 1. **A*算法的核心思想**:A*算法的核心在于评估每个节点的f(n)值,该值由g(n)(从起点到当前节点的实际成本)和h(n)(从当前...
本文主要关注的是“粒子群改进蝙蝠算法的自适应权重算法”。这种算法结合了两种著名的全局优化算法——粒子群优化(PSO)和蝙蝠算法(Bat Algorithm),并引入了自适应权重机制,以提升其在搜索过程中的效率和精度。...
在本文中,我们将深入探讨基于MATLAB实现的“惯性权重和学习因子动态调整的改进粒子群算法”(Improved Particle Swarm Optimization, IPSO)。粒子群优化(PSO)是一种受到鸟类群体行为启发的全局优化算法,它通过...
为了实现这个目标,我们使用梯度下降法,通过反向传播不断调整网络的权重和阈值,使网络的误差平方和最小。具体来说,我们可以使用以下公式来计算每层的误差信号: δz = (z - y) \* activation'(y) δy = W2^T \* ...
### 在MATLAB中采用RLS算法实现FIR自适应滤波器 #### 1. 引言 在自适应信号处理领域,FIR(Finite Impulse Response)滤波器因其线性相位特性以及易于设计的特点被广泛使用。在众多自适应滤波器算法中,递归最小...
#### 四、算法实现细节 1. **初始化**:设定粒子的数量N,维度D,以及初始的速度范围[Vmin, Vmax]和位置范围[Xmin, Xmax]。同时,初始化每个粒子的位置和速度。 2. **评估与更新**: - 对于每个粒子i (i = 1, 2, ...
遗传算法(Genetic Algorithm, GA)是一种模拟自然选择和遗传机制的优化算法,广泛应用于解决各种复杂的优化问题,包括权重优化。在这个MATLAB代码实例中,我们主要关注如何利用遗传算法来寻找权重的最佳配置,同时...
用户可以通过编写MATLAB脚本来实现GA训练BP网络的权重算法,结合这两个工具箱的功能,可以高效地解决复杂优化问题。 总结来说,"matlab_GA训练BP网络的权重算法"是利用遗传算法改进反向传播神经网络的权重学习过程...
反距离加权算法js的实现,
在压缩包中的源代码,可能包含了使用MATLAB编写的PSO算法实现,包括初始化粒子群、计算适应度函数、更新粒子的位置和速度等步骤,并且特别关注了惯性权重W的动态调整策略。 在实际应用中,选择合适的惯性权重策略...
Java 实现的权重算法主要应用于广告展示场景,其目的是根据广告的权重来决定广告的展现概率,确保高权重的广告有更高的几率被用户看到。这种算法通常用于优化用户体验和提高广告效益。 首先,我们理解算法的基本...
在给定的Java项目“KrigingCore_java_克里金插值算法实现”中,开发者提供了一个开源的实现,让我们深入探讨一下克里金插值的基本原理和这个Java实现的关键部分。 **1. 克里金插值原理** 克里金插值由南非矿业...
### 基于PSO面向K近邻分类的特征权重学习算法 #### 一、引言 K近邻(K-Nearest Neighbors, KNN)分类作为一种基础且实用的分类方法,在模式识别与数据挖掘领域有着广泛的应用。该算法的核心在于通过测量不同特征空间...
首先,QEM算法的实现始于构建一个权重矩阵,其中的每个元素表示一对边之间的相对重要性。这个矩阵可以通过计算每条边对模型总体能量的影响来生成,能量通常与边的曲率和长度有关。曲率大的边对模型的形状影响较大,...
高斯函数递减惯性权重的粒子群优化算法(GDIWPSO)是一种基于高斯函数的粒子群优化算法,利用高斯函数的分布性、局部性等特点,实现了对惯性权重的非线性调整。在仿真过程中,首先对测试函数优化以确定惯性权重的...
### 优化的动态平均权重算法及其在色谱信号处理中的应用 #### 摘要与背景 液相色谱作为一种重要的分析技术,在生物化学、医药、环境监测等多个领域都有着广泛的应用。在液相色谱检测系统中,朗伯-比尔定律被用来...