分支限界法的基本思想
分支限界法的基本思想是,在分支结点上,预先分别估算沿着它的各个儿子结点向下搜索的路径中,目标函数可能取得的“界”,然后把这些儿子结点和它们可能所取得的“界”保存在一张结点表中,再根据题目要求选择表中“界”最大或最小的结点向下搜索。(一般用优先队列来处理这张结点表)这样当搜索到一个叶子结点时,如果该结点所估算的目标函数值就是结点表中的最大或者最小值,那么沿叶子结点到根结点的路径所确定的解就是问题的最优解,叶子结点的目标函数值就是问题的最大值或最小值。
参考:《算法分析与设计(第三版)》(郑宗汉、郑晓明编著)
解决背包问题的基本思路
首先要将物品按重量价值比排序。
同样还是一棵二叉树,沿左孩子则选,右孩子则不选。
初始化最大上界bound = 0。对于一个结点,计算其理想状态下可能获得的最大上界bound(理想状态也就是把物体看成可分割),将结点按bound递减顺序存入优先队列中;然后队头出队(也就是bound最大的结点),对于其左孩子和右孩子分别计算bound,重复上述步骤。如果到达叶子结点,且该叶子结点的bound比当前bound大,则更新bound值。如果队列内的一些结点的值小于bound,则无需沿着小于bound的值的结点继续搜索。(随着二叉树搜索深度增加,bound值越来越接近真实值),那么如果当前结点bound值都比另一条分支上的叶子结点bound值小,那继续搜索只会更小)
源程序代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include<Windows.h>
#define N 100
int n;
int M;
typedef struct {
float weight;
float value;
float x;// 价值重量比
int num;//排序前的初始序号
int flag;
}Goods[N];
typedef struct BiTNode

最低0.47元/天 解锁文章
1330

被折叠的 条评论
为什么被折叠?



