- 1、本文档共30页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
设计郑宗汉郑晓明第5章贪婪法
第5章 贪婪法;例5.1 货币兑付问题: 用最少的货币张数
支付现金A。 ;向量X=(x1,x2,…,xn)称为问题的解向量; 所有向量的全体称为问题的解空间。
满足约束方程的向量称为问题的可行解; 满足约束方程和目标函数的向量称为问题的最优解。 ;5.1 贪婪法引言 ;贪婪法的设计方法可描述如下:
greedy(A, n)
{ solution = ?;
for (i=1; in; i++) {
x = select(A);
if (feasible(solution, x))
solution = union(solution, x); }
return solution;
};适于贪婪法求解的问题具有两个重要性质: 贪婪选择和最优子结构。
贪婪选择指所求问题的全局最优解可通过一系列局部最优的选择来达到。最优子结构指问题的最优解, 包含它的子问题的最优解。
考虑货币兑付问题, 若pi?{100,10,1}, 则满足最优子结构性质; 若pi?{10,7, 1}, 则不满足。如15元: 2张7元;例5.2 货郎担问题: 5个城市, 费用矩阵
如图5.1所示。; 1 ;每一步总是选费用最小的边, 所选路线为1?4?3?5?2?1, 费用为14。
若只选一个城市作为出发点, 则所需时间为O(n2)。若n个城市都可为出发点, 则所需时间为O(n3)。
与穷举法相比, 效率大大提高, 但所得结果不是最优解, 最优路线为1?2?5?4?3?1, 费用为13。TSP问题不满足最优子结构性质。;载重量为M的背包, 重量为wi、价值为pi的物体, 1?i?n, 把物体装满背包, 使背包内的物体价值最大。
有两类背包问题: 物体可分割的背包问题; 物体不可分割的背包问题, 后者称为0/1背包问题。;5.2.1 背包问题贪婪算法的实现
解向量X=(x1, x2,…, xn)
xi: 物体i被装入背包的部分, 0?i?1
xi=0: 物体i没被装入背包
xi=1: 物体i被全部装入背包;数据结构:
typedef struct {
float p; /* n个物体的价值price*/
float w; /* n个物体的重量weight*/
float v; /* n个物体的价值重量比*/
} Object;
Object instance[n];
float x[n]; /*n个物体装入背包的份量*/;算法5.1 贪婪法求解背包问题
输入: M, 存放p及w的数组instance[]
输出: x[], 背包中物体的总价值
1.float knapsack_greedy(float M,
Object inst[], float x[], int n)
2.{ int i; float m, p=0;
3. for (i=0; in; i++) {
inst[i].v = inst[i].p/inst[i].w;
5. x[i] = 0; }
6. merge_sort(inst, n);;7. m = M; /*m:背包剩余载重量*/
8. for (i=0; in; i++) {
9. if (inst[i].w=m) {
10. x[i]=1; m=m-inst[i].w;
11. p=p+inst[i].p; }
12. else { x[i]= m/inst[i].w;
13. p= p+x[i]?inst[i].p;
14. break; } }
15. return p; };5.2.2 背包问题贪婪算法的分析
时间复杂性为?(nlogn)
工作空间为?(n)
当物体的价值重量比按递减顺序排序后, 算法knapsack_greedy可求得背包问题的最优解。 ;有向赋权图G=(V,E), wij非负, 求源点u到其它所有顶点的距离。
5.3.1 Dijkstra算法
V划分为S和T: S中顶点到源点u的距离已定; T中顶点到u的距离未定。
u到T中顶点x的距离du,x: 从u出发, 经S中顶点, 不经T中其它顶点, 直接到达T中顶点x的最短路径的长度; p(x): 从u到x的最短路径中x的前一顶点。 ;Dijkstra算法:
1. 置S={u}, T=V-{u};
2. 对?x?T, 若(u,x)?E, 则du,x=cu,x, p(x)=u,
否则du,x=?, p
文档评论(0)