1. Strategies for NP-Complete Problems
-- Identify computationally tractable special cases.
- knapsack capacity W = polynomial in number of items n
-- Heuristics
- Pretty good greedy heuristic
- Excellent dynamic programming heuristic
-- Exponential time but better than brute-force search
- O(nW)-time dynamic programming vs. O(2^n) brute-force search.
2. Knapsack Revisited
-- Input: n items. Each has a positive value vi and a size wi . Also, knapsack capacity is W.
-- Output: A subset S in {1, 2, ..., n} that maximizes Sum(i in S) {vi} subject to Sum(i in S) {wi} <=W
3. A Greedy Heuristic
-- Motivation: Ideal items have big value, small size.
-- Step 1: Sort and reindex item so that v1/w1 >= v2/w2 >= ... >=vn/wn
-- Step 2: Pack items in this order until one doesn't fit, then halt. (can continue to pack the follow-up items that can fit)
4. A Refined Greedy Heuristic
-- Fact: Greedy solution can be arbitrarily bad relative to an optimal solution.(i.e. v1 = 2, w1 = 1, v2 = 1000, w2 = 1000, W = 1000)
-- Fix: Step 3: Return either the Step 2 solution, or the maximum valuable item, whichever is better.
-- Theorem: Value of the 3-step greedy solution is always at least 50% value of an optimal solution. -- Runnig time: O(n log n)
5. Greedy Fractional Algorithm
-- We were allowed to fill fully the knapsack using a suitable “fraction" (like 70%) of item (k+1)
-- Greedy fractional solution at least as good as every non-fractional feasible solution.
-- Let S = an arbitrary feasible solution
-- Suppose l units of knapsack filled by S with items not packed by the greedy fractional solution
-- Must be at least l units of knapsack filled by greedy fractional solution not packed by S
-- By greedy criterion, items in Greedy Fractional solution have larger bang-per-buck vi/wi than those in S [i.e., more valuable use of space]
-- Total value of greedy fractional solution at least that of S
6. Analysis of Greedy Heuristic
-- Suppose our greedy algorithm picks the 1st k items (sorted by vi/wi ).
-- Value of 3-step greedy algorithm >= total value of 1st k items
Value of 3-step greedy algorithm >= value of (k + 1)th item
2 (value of 3-step greedy) >= total value of 1st (k + 1) items = total value of greedy fractional solution >= optimal knapsack solution
-- Analysis is Tight (i.e. W = 1000 , v1 = 502, v2 = v3 = 500, w1 = 501, w2 = w3 = 500)
7. A Refined Analysis
-- Suppose: Every item i has size wi <= 10% * knapsack capacity W.
-- Consequence: If greedy algorithm fails to pack all items, then the knapsack is >= 90% full.
-- Value of 2-step greedy algorithm >= 90% * value of greedy fractional solution >= 90% * value of an optimal solution.
-- In general, if maxi wi <= m%W, then 2-step greedy value is >= (1 - m%)*optimal
8. Arbitrarily Good Approximation
-- Goal: For a user-specified parameter e > 0 (e.g., e = 0.01), guarantee a (1 - e)-approximation.
-- Catch: Running time will increase as e decreases. (i.e., algorithm exports a running time vs. accuracy trade-off).
-- High-level idea: Exactly solve a slightly incorrect, but easier, knapsack instance.
-- If vi's are integers, can solve knapsack via dynamic programming in O(n^2vmax) time, where vmax = maxi{vi}.
-- Plan: Throw out lower-order bits of the vi's!
9. A Dynamic Programming Heuristic
-- Step 1: Round each vi down to the nearest multiple of m [larger m ==> throw out more info ==> less accuracy ==> m depends on e]
Divide the results by m to get vi' (integers). (i.e., vi' = floor(vi/m) )
-- Step 2: Use dynamic programming to solve the knapsack instance with values v1', ... , vn', sizes w1, ..., wn, capacity W.
Running time = O(n^2 max{vi'})
10. Two Dynamic Programming Algorithms
-- Dynamic programming algorithm #1:
-- Assume sizes wi and capacity W are integers
-- Running time = O(nW)
-- Dynamic programming algorithm #2:
-- Assume values vi are integers
-- Running time = O(n^2vmax), where vmax = max{vi}
11. The Subproblems and Recurrence
-- Subprolems: For i = 0, 1, ... , n and x = 0, 1, ... , n*vmax define
S(i,x) = minimum total size needed to achieve value >= x while using only the first i items. (Or +Infinity if impossible)
-- Recurrence: (i >= 1)
S(i,x) = min { S(i-1,x) [Case 1, item i not used in optimal solution] , wi + S(i-1,x-vi) [Case 2, item i used in optimal solution, interpreted as 0 if vi > x]
12. The Algorithm
-- Let A = 2-D array [indexed by i = 0, 1, ... , n and x = 0, 1, ... , n*vmax]
-- Base case: A[0,x] = 0 if x = 0 , +Infinity otherwise
-- For i = 1, 2, ... , n
For x = 0, 1, ... , n*vmax
A[i,x] = min{A[i-1,x] , wi+ A[i-1,x-vi]}
-- Return the largest x such that A[n,x] <= W
-- Running time: O(n^2vmax)
13. Accuracy Analysis
-- Since we rounded down to the nearest multiple of m, m*vi' in [vi-m , vi] for each item i.
-- If S* = optimal solution to the original problem (with the original vi), and S = our heuristic's solution, then
Sum(i in S){vi'} >= Sum(i in S*){vi'} [Since S is optimal for the vi']
-- Sum(i in S){vi} >= m * Sum(i in S) {vi'} >= m * Sum(i in S*){vi'} >= Sum{i in S*} {vi -m} >= Sum(i in S*} - nm
-- Constraint: Sum(i in S){vi} >= (1-e)*Sum(i in S*){vi}
-- To achieve above constraint: Choose m small enough that mn <= e * Sum(i in S*){vi}
Sum(i in S*){vi} is unknown to algorithm, but definitely >= vmax
Sufficient: Set m so that mn <= e*vmax, i.e., heuristic uses m = e*vmax/n
-- Running time is O(n^2vmax') , vmax' <= vmax/m = vmax / (e*vmax/n) , so running time is O(n^3/e)
相关推荐
贪婪算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。在背包问题中,贪婪算法的应用旨在尽可能地填充背包,同时使得装入物品的总价值最大。...
贪婪算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。在解决背包问题时,贪婪算法的应用非常典型。背包问题是一个经典的组合优化问题,其目标是...
集合覆盖问题可以被定义为:给定一个二进制矩阵\( A \)(大小为\( m \times n \)),其中每一行代表一个集合,每一列代表一个元素。此外,还有一个正权重向量\( c^T \)(长度为\( n \)),以及一个全为1的列向量\( e...
在IT领域,优化问题的解决方法常常涉及到各种算法,其中包括贪心算法。本文将深入探讨“4-7d多处最优服务次序问题”、"4-1会场活动安排"以及"特殊0-1背包问题",这些都与贪婪策略和背包问题紧密相关。...
python 实现 Knapsack 背包... Greedy Knapsack Knapsack Recursive Approach Knapsack Tests Test Greedy Knapsack Test Knapsack 包括实现 贪婪的背包 背包 递归方法背包 测试 测试贪婪背包 测试背包
et al recently introduced a greedy layer wise unsupervised learning algorithm for Deep Belief Networks DBN a generative model with many layers of hidden causal variables In the context of the above ...
### GREEDY FUNCTION APPROXIMATION: A GRADIENT BOOSTING MACHINE #### 1. 引言与背景 本文探讨了一种新的函数逼近方法——贪心函数逼近法(Greedy Function Approximation, GFA),该方法特别关注梯度提升机...
A Fast Greedy Algorithm for Outlier Mining,何增友,,The task of outlier detection is to find small groups of data objects that are exceptional when compared with rest large amount of data....
在IT领域,尤其是在生物信息学中,"A Greedy, Graph-Based Algorithm for the Alignment of Multiple Homologous Gene Lists"是一个重要的研究主题。该算法利用贪婪策略和图论的方法来解决多序列比对的问题,特别是...
在路径规划领域,A*、贪婪(Greedy)、Dijkstra和RRT( Rapidly-exploring Random Trees)算法是四种常见的寻路策略,用于解决如何在有障碍的环境中找到从起点到终点的有效路径。这些算法各有特点,适用于不同的场景...
### 完全自动贪婪式方形拼图求解器的关键知识点 #### 一、研究背景与问题定义 在方形拼图问题中,目标是通过一系列非重叠且无序的方形拼图块重构出完整的图像。该问题不仅是休闲娱乐中的常见挑战,同时也具有重要...
根据提供的文件信息,本文将对“greedy_c源程序”中的关键知识点进行详细的解析与说明。此程序主要涉及了贪心算法(Greedy Algorithm)在C++中的实现,并结合具体的代码示例进行了演示。 ### 一、贪心算法概述 ...
### Greedy算法经典问题解析 #### 一、Greedy算法概览 Greedy算法是一种简单直观的算法设计策略,它在每一步选择中都采取当前看起来最优的选择,以期望达到全局最优解。这种策略并不总是能得到全局最优解,但在很...
本项目“Greedy Snake.zip”是一个基于Windows 32位汇编语言编写的贪吃蛇游戏,展示了汇编语言在实现游戏逻辑方面的强大能力。下面我们将深入探讨该项目涉及的知识点。 一、汇编语言基础 汇编语言是计算机程序设计...
* traveling salesman problem和knapsack problem:Greedy Technique可以提供快速的近似解决方案。 Greedy Technique是一种重要的算法设计技术,能够快速提供解决方案,但需要根据具体问题选择合适的技术。
贪吃蛇小游戏,闲的无聊可以下来玩玩,哈哈。由于java编写,所以需要 jre 环境噢,电脑装了java的都有此环境。纯手打,java开发,学习开发全流程见 ...
本项目"GreedySnake.zip"提供了这样一个简单的Java实现,旨在帮助初学者熟悉Java开发的基本技术和流程。以下是该项目涉及的主要知识点: 1. **Java基础知识**:在Java中编写贪吃蛇游戏,需要对基本语法、类与对象、...
8. **资源管理**:项目中的`index.jpg`、`a.png`、`b.png`可能是用于游戏背景、图标或者食物图像的资源文件,EasyX库提供了加载和显示位图的功能,使得开发者可以将这些图片集成到游戏中。 9. **Readme.txt**:此...
从给定文件内容中,我们可以梳理出一些关键的知识点,具体如下: 1. 梯度提升决策树(Gradient Boosting Decision Tree, GBDT): 该部分内容在文档中被提及,它指的是一种集成学习算法,属于机器学习和数据挖掘领域...