动态规划--设备最优更新策略

题目描述

某公司针对某项目进行为期五年的规划,该项目使用某种设备,该公司有一台已经使用了两年的该型设备。每年年初该公司都有两种选择,一是更新设备,二是继续使用。设备在使用过程中会产生维修费用。设备更新、维修费用由下表给出,求解该公司如何更新设备可以获得最大利润。

image

求解过程

在规划之前,先引入几个符号。

wpsB14F.tmp表示在第i年使用第t年买的设备所得的毛利润;

wpsB160.tmp表示在第i年使用第t年买的设备所需的维修费用;

wpsB161.tmp表示第i年使用第t年买的设备所需的更新费用;

wpsB162.tmp表示第i年使用第t年买的设备所获得的阶段总利润;

wpsB163.tmp表示第i年初的设备是第t年买得话,所做的策略,true表示更新,false表示继续使用。

应用动态规划的方法,我们可以采用逆序求解的方式,从第五年年初设备状态开始求取,并且我们第五年年底,无论设备状态如何,第六年利润都为0。

首先,我们来推导利润的求解。

假设在第i年年初,拥有的设备是第t年买的。这时,我们有两个选择,更新当前设备,或者继续使用当前设备。

因此wpsB164.tmp

对于第五年年初,我们的设备状态可能有五种:第0年的设备,第一年的设备,第二年的设备,第三年的设备,第四年的设备。

根据表格,,我们可以求得wpsB174.tmp

依次可以求得wpsB185.tmp

对于每一种状态,若求得结果时,选择更新的利润大,置wpsB186.tmp为true,否则置为false。

照此方法,对于第一年年初,设备状态只有一种:第0年的设备。

更新的利润为32,继续使用的话是50,因此第一步我们要选择继续使用。

此时,我们再反过来查看每一步的选择。第一步我们选择了继续使用,第二步的状态就是使用第0年的设备,更新利润为36,继续为37,因此选择继续使用;第三步初始状态也为使用第0年设备,更新利润为27,继续使用为21,因此选择更新;第四步初始状态为使用第三年设备,继续使用为18,更新为13,选择继续使用;第五步初始状态为使用第三年设备,继续使用为14,更新为-4,因此为继续使用。

基于此,我们得到了最优的更新策略,第一年第二年不更新,第三年更新,第四年第五年不更新,最大利润为50。

代码

/* 
算法设计与分析作业 
    ---设备最优更新策略 
*/ 
#include<iostream>

void accept(int **a, int years); 
int max(int a, int b) { return  a > b ? a : b; } 
int main() { 
    using std::cin; 
    using std::cout; 
    using std::endl;

    cout << "请输入决策年数(i):" << endl; 
    int temp; 
    while (!(cin >> temp)||temp < 0) { 
        cout << "请输入一个正整数:" << endl; 
        cin.clear(); 
        while (cin.get() != '\n'); 
    } 
    int years = temp + 1; 
    
    //第i年买的设备在第t年能产生的利润 
    int **exProfit = new int*[years];//0-n年买的设备 
    for (int i = 0; i < years; i++) { 
        exProfit[i] = new int[years];//0-n年买的设备在第i年的利润 
    } 
    cout << "请依次输入利润:" << endl; 
    accept(exProfit, years); 
    //第i年买的设备在第t年产生的维修费用 
    int **fix = new int *[years]; 
    for (int i = 0; i < years; i++){ 
        fix[i] = new int[years]; 
    } 
    cout << "请依次输入维修费用:" << endl; 
    accept(fix, years); 
    //第i年买的设备在第t年更新时的费用 
    int **update = new int *[years]; 
    for (int i = 0; i < years; i++){ 
        update[i] = new int[years]; 
    } 
    cout << "请依次输入更新费用:" << endl; 
    accept(update, years); 
    //最优更新策略,true代表更新,false代表继续使用 
    bool **choice = new bool *[years]; 
    for (int i = 0; i < years; i++) { 
        choice[i] = new bool[years]; 
    } 
    for (int i = 0; i < years; i++){ 
        for (int j = 0; j < years; j++) 
            choice[i][j] = false; 
    } 
    //最终利润,决策年数之后的一年利润全部置0 
    int **profit = new int*[years]; 
    for (int i = 0; i < years; i++) { 
        profit[i] = new int[years + 1]; 
    } 
    for (int i = 0; i < years; i++) 
    { 
        for (int j = 0; j < years + 1; j++) 
            profit[i][j] = 0; 
    } 
    //倒序进行计算,第i年,可以使用的设备要么就是之前一直没更新,要么就是第j年买的设备 
    //例如,第三年,设备的状态就有三种选择,一是使用第0年的设备,二是在第一年进行了更新,三是第二年进行了更新 
    //分别对每个状态进行选择更新或者继续使用 
    //第i年,有两种选择,要么更新,要么继续使用 
    //分别计算更新和继续使用的利润,选择两者中比较大的。 
    for (int  i = temp; i >0 ; i--) 
    { 
        for (int j = 0; j < i; j++) 
        { 
            int keep = exProfit[j][i] - fix[j][i] + profit[j][i + 1]; 
            int refresh = exProfit[i][i] - fix[i][i] - update[j][i] + profit[i][i + 1]; 
            profit[j][i] = max(keep, refresh); 
            if (keep < refresh) { 
                choice[i][j] = true; 
            } 
        } 
    } 
    int j = 0; 
    for (int i = 1; i < years; i++) 
    { 
        if (choice[i][j]) { 
            j = i; 
            std::cout <<""<<i<< "年更新"<<std::endl; 
            continue; 
        } 
            std::cout << "" << i << "年继续使用" << std::endl;    
    } 
    cout << "利润最大为:" << profit[0][1]; 
    delete[]profit; 
    for (int i = 0; i < years; i++) { 
        delete[] fix[i]; 
    } 
    delete[]fix; 
    for (int i = 0; i < years; i++) { 
        delete[] exProfit[i]; 
    } 
    delete[]exProfit; 
    for (int i = 0; i < years; i++) { 
        delete[] update[i]; 
    } 
    delete[]update; 
    for (int i = 0; i < years; i++) { 
        delete[] choice[i]; 
    } 
    delete[]choice; 
}

void accept(int **a ,int years) { 
    for (int i = 0; i < years; i++) { 
        std::cout << ""<<i<<"年:"; 
        int j = 0; 
        a[i][j] = 0; 
        j++; 
        while (j < years) 
        { 
            if (j < i) 
                a[i][j] = 0; 
            else { 
                while (!(std::cin >> a[i][j])||a[i][j] < 0) { 
                    if(i == 0) 
                        std::cout << "请从第" <<j<<"个数重新输入"<< std::endl; 
                    else 
                        std::cout << "请从第" << j-i+1 << "个数重新输入" << std::endl; 
                    std::cout << "请输入正整数"; 
                    std::cin.clear(); 
                    while (std::cin.get() != '\n'); 
                } 
            } 
            j++; 
        } 
    } 
}

转载于:https://www.cnblogs.com/aguoshaofang/p/5012751.html

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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的求解引擎找到最佳的设备更换方案,并实现优化的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值