动态规划求解设备更新问题

问题引入

**用动态规划求解设备更新问题 **
某人打算购买一辆新的小货车用于运货,货车的售价是22 万元人民币。货车购买后,每年的各种保险费、养护费等费用如下表:
在这里插入图片描述
设计一种购买货车的方案,使5 年内用车的总费用最少。
选作:将其中所有的数据,包括售价、年份、各年份的费用和各年份二手车销售价等的数据改为任意值。

设计思路

利用动态规划的思想,将每年用车的费用记录下来,然后利用递归在权重数组中找最优的。
细节直接见代码,我都写上了注释


代码

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<limits.h>
using namespace std;

//算法思路:动态规划,dp[i]=dp[i-1]+fee[i]
//把n年内用车总费用各自求出来
///
//第一年把车卖了,第二年就还是要继续算法,之前没注意这个问题写的时候总是第一年卖最划算,在买车卖车中反复横跳了~~
double dynamic(int t, double weight[], double dp[], double& cost) {
	if (t == 0) {
		return 0;
	}//第0年售出没有意义
	else if (t == 1) {
		cout << "1年后卖" << endl;
		cost = cost + weight[0];
		return weight[0];
	}//递归出口
	else {
		double value = weight[0];
		int y = 0;
		for (int i = 1; i <= t - 1; i++) {
			if (weight[i] <= value) {
				value = weight[i];
				y = i;
			}
		}//用于遍历所有的方案,找出最低成本的方案并记录年数
		cout << y + 1 << "年后卖" << endl;
		cost += dp[y];
		return dp[y] + dynamic(t - y - 1, weight, dp, cost);
	}
}

bool solve(int upkeep[], int sell[], int newcar, int year) {

	int allinupkeep[5] = { 0 };//allinupkeep用来记录车龄为i的总养护费
	double dp[5];//dp[i]表示i年内用车的费用
	double weight[5];//weight[i]表示第i年出售的每年平均费用
	double cost = 0;//cost用于记录总成本

	//由题,dp[i]=newcar-sell[i] + allinupkeep[i]

	for (int i = 0; i < 5; i++)//i用来记录车龄
	{
		for (int j = 0; j <= i; j++) //j用来遍历i一下的年数
		{
			allinupkeep[i] += upkeep[j];
		}

		dp[i] = newcar - sell[i] + allinupkeep[i];//求出第几年卖出需要多少成本
	}

	for (int i = 0; i < 5; i++) {
		weight[i] = dp[i] / (i + 1);
	}//用于求每年的平均权重
	cout << "5年内的用车方案可为:" << endl;
	dynamic(year, weight, dp, cost);//递归算法求哪一年出售成本最低
	cout << "5年用车成本最低为 " << cost << " 万元 " << endl;
	return true;
}

bool uI() {
	int upkeep[5] = { 3,5,10,16,21 };//upkeep[i]表示车龄为i的养护费
	int sell[5] = { 17,15,7,4,2 };//sell[i]表示车龄为i的出售价
	int newcar = 22;
	int year = 5;
	/*
	for (int i = 0; i < 5; i++) {
		cout << "请输入车龄为"<<i <<"的养护费"<< endl;
		cin >> upkeep[i];
	}
	for (int i = 0; i < 5; i++) {
		cout << "请输入车龄为" << i << "的出售价" << endl;
		cin >> sell[i];
	}
	
	cout << "请输入买一辆新车的价格" << endl;
	cin >> newcar;
	
	cout << "请输入一共使用时长" << endl;
	cin >> year;
	*/
	solve(upkeep, sell, newcar, year);
	return 1;
}

int main() {
	uI();
}


我写的代码本来是打算参考求解设备更新问题的代码,但是细看他的代码有很多问题。
题目要求每次买的是新车,不是二手车。在网上看代码还是需要带入自己的思考的,这也是学习的过程,在网上找源码也只是减少走弯路而不是做CP完事了~如果有算法改进的地方可以在评论区讨论一下,一起学习。

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
### 回答1: 动态规划设备更新问题是指在有限的设备资源下,对一些任务进行调度,使得任务按照最小化某个指标(如时间、成本等)的方式完成。LINGO可以用来求解此类问题,以下是一种可能的模型: 假设有 $n$ 个任务需要完成,每个任务有一个处理时间 $p_i$ 和一个资源需求 $r_i$,同时有 $m$ 台设备可用,每台设备有一个容量 $C_j$,表示该设备最多能同时处理 $C_j$ 个任务。设 $x_{i,j}$ 表示第 $i$ 个任务是否安排在第 $j$ 台设备上处理,$y_j$ 表示第 $j$ 台设备是否被使用。 则可以将该问题建模为以下的线性规划模型: 最小化 $\sum_{j=1}^m\sum_{i=1}^np_ix_{i,j}$ 满足约束条件: $\sum_{j=1}^mx_{i,j}=1,\ i=1,\cdots,n$ (每个任务必须恰好被分配到一台设备上) $\sum_{i=1}^nr_i x_{i,j}\leq C_j y_j,\ j=1,\cdots,m$ (每台设备的任务总需求不能超过该设备的容量,并且只有被使用的设备才需要满足该条件) $\sum_{j=1}^my_j\leq m$ (最多只能使用 $m$ 台设备) $x_{i,j}\in\{0,1\},\ y_j\in\{0,1\}$ (变量的取值为 0 或 1) 可以使用LINGO软件来求解这个线性规划模型,得到最小化处理时间的设备调度方案。 ### 回答2: 动态规划(Dynamic Programming,简称DP)是一种解决多阶段决策过程最优化问题的方法。而LINGO是一种广泛应用于解决优化问题的软件。 设备更新问题是指在有限的预算下,选择最佳的设备更新策略,以最大化更新后的设备效益。可以使用动态规划来解决该问题。 首先,需要定义问题的状态和决策。状态是指问题中的一个独立变量,决策是从一个状态转移到另一个状态的操作。 在设备更新问题中,可以将状态定义为当前可用的预算和设备更新的剩余期限。决策则是指选择哪种设备更新策略(比如购买设备、维修旧设备等)。 接下来,需要确定问题的最优解和最优子结构。最优解是指在给定的问题状态下,通过做出一系列决策所获得的最大效益。最优子结构是指一个问题的最优解,可以通过子问题的最优解求解。 为了解决设备更新问题,可以使用DP表来存储每个状态下的最优解。首先,初始化DP表。然后,逐步填充DP表的每个单元格,根据相应的状态和决策来计算最优解。 最后,根据DP表的结果,确定最优的设备更新策略。可以通过回溯法找到达到最大效益的决策路径。 总之,LINGO可以作为一个工具来实现设备更新问题动态规划算法。通过定义问题的状态和决策,确定最优解和最优子结构,使用DP表进行计算,最终可以得到最佳的设备更新策略,以最大化更新后的设备效益。 ### 回答3: 动态规划是一种常用的优化问题求解方法,也可以用来解决设备更新问题设备更新是指在一连串工作任务中,为了提高效率和性能,需要选择最佳的设备更换方案。LINGO是一种数理优化工具,可以帮助我们求解这个问题。 在设备更新问题中,我们需要考虑多个因素,如设备成本、设备寿命、工作效率等。我们需要建立一个数学模型,将这些因素考虑进去,并定义目标函数和约束条件。 首先,我们需要确定决策变量。这可以是设备更换的次数或时间点。然后,我们需要定义目标函数,如最小化总成本或最大化工作效率。目标函数的选择取决于具体的问题和需求。 接下来,我们需要定义约束条件。这可能包括设备更换的规则、设备寿命的限制、设备的可用性等。约束条件将限制我们的决策变量,确保我们找到的解是可行且可靠的。 然后,我们可以使用LINGO来求解这个动态规划问题。LINGO提供了一种直观且易于使用的界面,可以帮助我们输入数学模型并进行求解。我们可以指定目标函数和约束条件,并通过LINGO的求解引擎获得最佳的设备更换方案。 最后,我们可以分析求解结果并进行决策。我们可以评估求解结果的可行性和可接受性,根据需求做出相应的调整和决策。 总之,LINGO可以作为一种有效的工具来求解设备更新问题。通过建立合适的数学模型和设定准确的目标函数和约束条件,我们可以利用LINGO的求解引擎找到最佳的设备更换方案,并实现优化的效果。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlbertOS

还会有大爷会打钱?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值