动态规划—资源分配

概要

动态规划的决策不是线性的而是全面考虑到各种不同情况分别进行决策,最后通过多阶段决策逐步找出问题最优解。而当前决策也会依赖于上一阶段的决策,此时便会发生状态的转移。动态规划算法可以说是一种“聪明的蛮力法”,因为动态规划是会考虑到每一种可能,而聪明的地方是相对于蛮力法,它去掉了很多没必要的运算。

 

 例1、资源分配问题

现有7万元需要投资到A,B,C三个项目,利润表如下图。求总利润分配最大的资源分配方案

 1234567
A0.110.130.150.210.240.300.35
B0.120.160.210.230.250.240.34
C0.080.120.200.240.260.300.35

 

#include <iostream>
using namespace std;
int main(){
	
	double invest[3][8]={//投资表,记录了A,B,C三个投资的利润率信息,预留多一个位置,invest[i][j]中i表示项目,j表示金额 
						{0,0.11,0.13,0.15,0.21,0.24,0.30,0.36},
						{0,0.12,0.16,0.21,0.23,0.25,0.24,0.34},
						{0,0.08,0.12,0.20,0.24,0.26,0.30,0.35}
						};
	double max[8],temp[8]={0},gain[8]={0};//max记录的是优策略下的投资利润率,gain记录的是当前投资金额可得的最大利润
	//temp记录的是上一次决策中可以获得的最大利润 
	for(int i=0;i<8;i++){//初始化,当只有A投资可选时,最优投资策略便是全部投资A 
		max[i]=invest[0][i];
	}
	
	for(int i=0;i<8;i++){//初始化,当只有A投资可选时,可以得到的最大利润
		gain[i]=invest[0][i]*i;
	}	 
	
	for(int i=1;i<3;i++){//控制投资项目 
		for(int j=1;j<8;j++){//控制投资金额,j即为当前的投资金额
			for(int k=0;k<j;k++){//k表示投资给上一个最优决策的金额, j-k表示把剩余的资金投资给新添加的那个项目 
				temp[j]=max[k]*k+invest[i][j-k]*(j-k); 
				if(gain[j]<temp[j]){
					gain[j]=temp[j];
					max[j]=gain[j]/j;
				}				
			}
		}
	}
	//输出 
	cout<<"最大投资利润率为:"; 
	for(int i=1;i<8;i++){
		cout<<max[i]<<" ";
	} 
	cout<<endl<<"最大利润为:";
	for(int i=1;i<8;i++){
		cout<<gain[i]<<" ";
	} 	
}

 

实验课程:算法分析与设计 实验名称:用动态规划法求解资源分配问题 (验证型实验) 实验目标: (1)掌握用动态规划方法求解实际问题的基本思路。 (2)进一步理解动态规划方法的实质,巩固设计动态规划算法的基本步骤。 实验任务: (1)设计动态规划算法求解资源分配问题,给出算法的非形式描述。 (2) 在Windows环境下用C 语言实现该算法。计算10个实例,每个实例中n=30, m=10, Ci j为随机产生于范围(0,103)内的整数。记录各实例的数据及执行结果(即最优分配方案、最优分配方案的值)、运行时间。 (3)从理论上分析算法的时间和空间复杂度,并由此解释相应的实验结果。 实验设备及环境: PC;C/C++等编程语言。 实验主要步骤: (1) 根据实验目标,明确实验的具体任务; (2) 分析资源分配问题,获得计算其最优值的递推计算公式; (3) 设计求解问题动态规划算法,并编写程序实现算法; (4) 设计实验数据并运行程序、记录运行的结果; (5) 分析算法的时间和空间复杂度,并由此解释释相应的实验结果; 问题分析: 问题描述: 某厂根据计划安排,拟将n台相同的设备分配给m个车间,各车间获得这种设备后,可以为国家提供盈利Ci j(i台设备提供给j号车间将得到的利润,1≤i≤n,1≤j≤m) 。问如何分配,才使国家得到最大的盈利? 算法基本思想: 本问题是一简单资源分配问题,由于具有明显的最优子结构,故可以使用动态规划求解,用状态量f[i][j]表示用i台设备分配给前j个车间的最大获利,那么显然有f[i][j] = max{ f[k][j–1] + c[i-k][j] },0<=k<=i。再用p[i][j]表示获得最优解时第j号车间使用的设备数为i-p[i][j],于是从结果倒推往回求即可得到分配方案。程序实现时使用顺推,先枚举车间数,再枚举设备数,再枚举状态转移时用到的设备数,简单3重for循环语句即可完成。时间复杂度为O(n^2*m),空间复杂度为O(n*m),倘若此题只需求最大获利而不必求方案,则状态量可以减少一维,空间复杂度优化为O(n)。
Lingo是一款用于线性、整数和混合-integer优化的高级编程语言,它结合了高级语言的易用性和数学建模语言的强大功能。在Lingo中,动态规划是一种解决优化问题的有效方法,特别适用于涉及资源分配问题,比如任务调度、库存管理或网络流量控制等。 动态规划在Lingo中的应用涉及到构建递归关系式(也称为状态转移方程),通过将问题分解为子问题,并存储每个子问题的解,避免重复计算,从而达到高效求解全局最优解的目的。 一些Lingo中动态规划资源分配的常见应用场景包括: 1. 最短路径问题:如旅行商问题(TSP)中的路线规划。 2. 资源调度:如何分配有限的资源给多个项目,以最大化效益。 3. 库存管理:确定最优的进货和销售策略,以最小化成本和库存积压。 4. 生产计划:安排生产线的运行,以满足需求并最小化生产成本。 要找到Lingo动态规划资源分配的相关资源,你可以尝试以下几个途径: 1. Lingo官方文档:Lingo用户手册通常会提供关于优化模型和动态规划的示例和教程。 2. Lingo论坛或社区:访问Lingo用户的讨论区,查找关于特定问题的解决方案或代码分享。 3. 教程网站和博客:如Data envelopment analysis (DEA) models, Operations Research Online 或者一些优化技术博客上可能有使用Lingo的案例分析。 4. 书籍和学术论文:《Lingo Modeling and Optimization》等书籍会深入讲解Lingo的使用方法,包括动态规划
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值