1.问题
设 m 元钱,n 项投资,函数 表示将 x 元投入第 i 项项目所产生的效益,i=1,2,…,n.
问:如何分配这 m 元钱,使得投资的总效益最高?
2.解析
组合优化问题:
假设分配给第 i 个项目的钱数是 xi ,问题描述为:
目标函数:max{f1 (x1 ) f2 (x2 ) … fn (xn)}
约束条件:x1+x2+…+xn = m, xi∈N
实例:
递推公式:
设Fk(x)表示x万元投给前K个项目的最大效益,k=1,2,……,m
递推方程: Fk(x) = max{f k(xk )+Fk-1 (x -xk )}, k =1,2,3,…,n
边界条件: F1(x) = f1(x), Fk(0) = 0, k = 1, 2, …,n
说明:第K步,前后共分配X万元
分配给第K个项目为xk;
x-xk万元, 分配给前K-1个项目。
优化原则: 一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束 状态的最优决策序列。
已知:这个序列 L1 是最优决策序列
那么:这个序列 任何子序列 本身一定是相对于子序列的 初始 和 结束 状态的最优决策序列。
3. 设计
伪代码
xi(x) = k: 新加第 i 项时,总共分配 x 元时,第 i 项分配了 k 元(xk)
建立小f表(已知的),建立x表,建立大F表;
递推方程: Fk(x) = max{f k(xk )+Fk-1 (x -xk )}, k =1,2,3,...,n
For k =1,2,3,...,n // 第 k 个项目
For 𝑥 = 1,2,3,...,𝑚 // k 个项目共分配 x 万元
For xk = 0,1,2,3,...,x // 第 k 个项目分配 xk
实例:
小f的情况是:
例如:f1(1) = 是分配给第一个项目1万元 获得多少收益看上图
-
F1(x),k=1,只有一个项目
x=1: F1(1) = f1(1) = 11 xi(x) = x, x = 1, 2, 3, 4, 5
x=2: F1(2) = f1(2) = 12
x=3: F1(3) = f1(3) = 13
x=4: F1(4) = f1(4) = 14
x=5: F1(5) = f1(5) = 15 -
F2(x),k=2,有两个项目
x=1,总共分配 1 万元
x=1, xk=0: f 2(0)+F1 (1) // 第二个项目投0万元时 + 剩下的钱投一个项目的最大收益(1万元分配给一个项目的最大收益)
x=1, xk=1: f 2(1)+F1 (0)
F2(1) = max{f2(0)+ F1 (1),f2(1) +F1(0)}= max{0+11,0+ 0} = 11
x 2(1) = 0 // 两个项目分配1万元时,利益最优的情况下,投资第二个项目的钱为0; x=2,总共分配 2 万元
x=2, xk=0: f 2(0)+F1 (1) //
x=2, xk=1: f 2(1)+F1 (0)
x=2, xk=2: f2(2) +F1(0)
F2(2) = max{f2(0)+ F1 (2),f2(1) +F1(1),f2(2)+}= max{0 11,0+ 0} = 11
x 2(2) = 0
。。。。。。。
把每个X=*的值的情况写出来。
实验截图:
4. 分析
5. 源代码地址
https://github.com/Lin02993/Algorithm-Analysis-and-Practice-on-the-job