EasyLearn--JAVA实现32个经典算法设计(二):集束算法

本文深入解析集束算法,一种逼近最优解的搜索策略。通过树形模型实例,讲解算法实现步骤,包括实体定义、父子关系建立、初始化集合,以及关键的抓取策略,最后展示如何通过比较路径总值找到最佳解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集束算法的理解上相对来说还是比较简单的,该算法不是求解最优解而是尽可能的靠近最优解的算法。当集束层级达到12层以上每个子节点不超过5个时,节点数最高可达到了30W个节点左右,而需要从此得出最优解可能用穷尽法来算尽节点数也未尝是“最优”了。

这边推荐比较好去理解此算法的两篇博客。

集束搜索1    集束搜索2

下面具体用代码来说明吧!看集束算法上有分别使用图和树的模型来演示算法规则,此处只实现了树形模型,图形的大同小异就不实现了。

第一步,定义集束实体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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值