集束算法的理解上相对来说还是比较简单的,该算法不是求解最优解而是尽可能的靠近最优解的算法。当集束层级达到12层以上每个子节点不超过5个时,节点数最高可达到了30W个节点左右,而需要从此得出最优解可能用穷尽法来算尽节点数也未尝是“最优”了。
这边推荐比较好去理解此算法的两篇博客。
下面具体用代码来说明吧!看集束算法上有分别使用图和树的模型来演示算法规则,此处只实现了树形模型,图形的大同小异就不实现了。
第一步,定义集束实体BEAM
import java.io.Serializable;
/**
* 集束算法的实体Bean,每个元素的定义
* 集束bean中包含了 名称 概率值 哪个层级 该层级对应的集合号
*
*/
public class Beam implements Serializable {
/*
* 集束名称
*/
private String beamName;
/*
* 集束值
*/
private Double beamValue;
/*
* 集束层级
*/
private Integer beamLevel;
/*
* 集束同一层级对应的那个集合号 1 2 3 4
*/
private Integer beamNo;
/*
* 当前集束bean的父集束bean
*/
private Beam parentBeam;
public Beam() {
super();
}
public Beam(String beamName, Double beamValue, Integer beamLevel, Integer beamNo) {
super();
this.beamName = beamName;
this.beamValue = beamValue;
this.beamLevel = beamLevel;
this.beamNo = beamNo;
}
public String getBeamName() {
return beamName;
}
public void setBeamName(String beamName) {
this.beamName = beamName;
}
public Double getBeamValue() {
return beamValue;
}
public void setBeamValue(Double beamValue) {
this.beamValue = beamValue;
}
public Integer getBeamLevel() {
return beamLevel;
}
public void setBeamLevel(Integer beamLevel) {
this.beamLevel = beamLevel;
}
public Integer getBeamNo() {
return beamNo;
}
public void setBeamNo(Integer beamNo) {
this.beamNo = beamNo;
}
public Beam getParentBeam() {
return parentBeam;
}
public void setParentBeam(Beam parentBeam) {
this.parentBeam = parentBeam;
}
}
第二步,定义父子集束关系
import java.util.List;
public class TreeBeam {
/*
* 父层-集束号 规则 1-1第一层的第一个集束集合号
*/
private String parentBeamNo;
/*
* 当前层-集束集合号 规则 1-1第一层的第一个集束集合号
*/
private String nowBeamNo;
/*
* 集束beam的集合
*/
private List<Beam> beamList;
public TreeBeam(String parentBeamNo, String nowBeamNo, List<Beam> beamList) {
super();
this.parentBeamNo = parentBeamNo;
this.nowBeamNo = nowBeamNo;
this.beamList = beamList;
}
public String getParentBeamNo() {
return parentBeamNo;
}
public void setParentBeamNo(String parentBeamNo) {
this.parentBeamNo = parentBeamNo;
}
public String getNowBeamNo() {
return nowBeamNo;
}
public void setNowBeamNo(String nowBeamNo) {
this.nowBeamNo = nowBeamNo;
}
public List<Beam> getBeamList() {
return beamList;
}
public void setBeamList(List<Beam> beamLis