动态规划法-资源分配问题

news2024/9/20 22:31:19

动态规划法 - 资源分配问题

问题描述

把4个份额的资源分配给3个工程,给定利润表如下表所示,写出资源的最优分配方案的求解过程。
在这里插入图片描述
4份资源分配给3个工程的利润表

步骤一:求各个阶段不同分配份额时的最大利润及分配份额

目标

我们的目标是找到在给定资源限制下,如何分配资源给不同的工程以获得最大利润。

步骤

  1. 定义子问题:我们定义 fᵢ(x) 为将 x 份资源分配给前 i 个工程时的最大利润,dᵢ(x) 为在 fᵢ(x) 最大时,分配给第 i 个工程的资源份额。
  2. 初始化:对于只有一个工程的情况,我们可以直接计算出 f₁(x)d₁(x)
  3. 迭代计算:对于更多的工程,我们使用已知的 f₋₁(x)d₋₁(x) 来计算 fᵢ(x)dᵢ(x)

1. 只分配给第1个工程

资源分配表:

x01234
f₁(x)713161719
d₁(x)01234

解释:

  • 我们首先考虑只有一个工程的情况,直接计算每个资源份额下的利润。
  • d₁(x) 表示在给定资源份额下,第1个工程的资源分配。

2. 分配给前2个工程

资源分配表:

x01234
f₂(x)1319252830
d₂(x)00/1112

计算过程:

  1. 当 x = 0 时:

    • 只有第1个工程可以使用资源,利润为 f₂(0) = f₁(0) + G₂(0) = 7 + 6 = 13
    • 资源全部分配给第1个工程,d₂(0) = 0
  2. 当 x = 1 时:

    • 比较不同分配方式的利润,选择最大的利润:
      • G₂(0) + f₁(1) = 6 + 13 = 19
      • G₂(1) + f₁(0) = 12 + 7 = 19
    • 利润相同,可以选择任意一种分配方式,d₂(1) 可以是 0 或 1。
  3. 当 x = 2 时:

    • 比较不同分配方式的利润,选择最大的利润:
      • G₂(0) + f₁(2) = 6 + 16 = 22
      • G₂(1) + f₁(1) = 12 + 13 = 25
      • G₂(2) + f₁(0) = 14 + 7 = 21
    • 选择利润最大的分配方式,d₂(2) = 1
  4. 当 x = 3 时:

    • 比较不同分配方式的利润,选择最大的利润:
      • G₂(0) + f₁(3) = 6 + 17 = 23
      • G₂(1) + f₁(2) = 12 + 16 = 28
      • G₂(2) + f₁(1) = 14 + 13 = 27
      • G₂(3) + f₁(0) = 16 + 7 = 23
    • 选择利润最大的分配方式,d₂(3) = 1
  5. 当 x = 4 时:

    • 比较不同分配方式的利润,选择最大的利润:
      • G₂(0) + f₁(4) = 6 + 19 = 25
      • G₂(1) + f₁(3) = 12 + 17 = 29
      • G₂(2) + f₁(2) = 14 + 16 = 30
      • G₂(3) + f₁(1) = 16 + 13 = 29
      • G₂(4) + f₁(0) = 18 + 7 = 25
    • 选择利润最大的分配方式,d₂(4) = 2

解释为什么这么做:

  • 我们通过比较不同分配方式下的利润,选择能够带来最大利润的分配方案。
  • 这种方法确保了在有限的资源下,我们能够获得最大的经济回报。
  • 动态规划的优势在于它避免了重复计算相同的子问题,提高了计算效率。

通过以上步骤,我们可以得到在不同资源分配下的最大利润以及各个工程的资源分配份额。

3. 分配给前3个工程

步骤

  1. 定义子问题:我们定义 f₃(x) 为将 x 份资源分配给前3个工程时的最大利润,d₃(x) 为在 f₃(x) 最大时,分配给第3个工程的资源份额。

计算过程

  1. 当 x = 0 时:

    • 只有第1和第2个工程可以使用资源,利润为 f₃(0) = f₁(0) + G₂(0) + G₃(0) = 7 + 6 + 5 = 18
    • 资源全部分配给第1和第2个工程,d₃(0) = 0
  2. 当 x = 1 时:

    • 比较不同分配方式的利润,选择最大的利润:
      • G₃(0) + f₂(1) = 5 + 19 = 24
      • G₃(1) + f₂(0) = 18 + 13 = 31
    • 选择利润最大的分配方式,d₃(1) = 1
  3. 当 x = 2 时:

    • 比较不同分配方式的利润,选择最大的利润:
      • G₃(0) + f₂(2) = 5 + 25 = 30
      • G₃(1) + f₂(1) = 18 + 19 = 37
      • G₃(2) + f₂(0) = 19 + 13 = 32
    • 选择利润最大的分配方式,d₃(2) = 1
  4. 当 x = 3 时:

    • 比较不同分配方式的利润,选择最大的利润:
      • G₃(0) + f₂(3) = 5 + 28 = 33
      • G₃(1) + f₂(2) = 18 + 25 = 43
      • G₃(2) + f₂(1) = 19 + 19 = 38
      • G₃(3) + f₂(0) = 20 + 13 = 33
    • 选择利润最大的分配方式,d₃(3) = 1
  5. 当 x = 4 时:

    • 比较不同分配方式的利润,选择最大的利润:
      • G₃(0) + f₂(4) = 5 + 30 = 35
      • G₃(1) + f₂(3) = 18 + 28 = 46
      • G₃(2) + f₂(2) = 19 + 25 = 44
      • G₃(3) + f₂(1) = 20 + 19 = 39
      • G₃(4) + f₂(0) = 22 + 13 = 35
    • 选择利润最大的分配方式,d₃(4) = 1

资源分配表:

xf₃(x)d₃(x)
0180
1311
2371
3431
4461

解释为什么这么做

  • 我们通过比较不同分配方式下的利润,选择能够带来最大利润的分配方案。
  • 这种方法确保了在有限的资源下,我们能够获得最大的经济回报。
  • 动态规划的优势在于它避免了重复计算相同的子问题,提高了计算效率。

步骤二:求各个阶段的最大利润 gᵢ 和分配份额 qᵢ

  • 最大利润

    • g₁ = 19
    • g₂ = 30
    • g₃ = 46
  • 资源分配份额

    • q₁ = 4
    • q₂ = 4
    • q₃ = 4

步骤三:计算全局的最大利润 optg、最大的工程数目 k、总的最优分配份额 optx(k)

  • 全局最大利润optg = 46
  • 最大的工程数目k = 3
  • 总的最优分配份额optx₃ = 4

步骤四: 计算各个工程的最优分配份额 optq(x)

  1. 第3个工程

    • optq₃ = d₃(optx₃) = d₃(4) = 1
    • optx₂ = optx₃ - optq₃ = 4 - 1 = 3
  2. 第2个工程

    • optq₂ = d₂(optx₂) = d₂(3) = 1
    • optx₁ = optx₂ - optq₂ = 3 - 1 = 2
  3. 第1个工程

    • optq₁ = d₁(optx₁) = d₁(2) = 2

最终决策结果

  • 分别分配给第1、2、3工程 2、1、1 份资源,可得最大利润 46。

代码

#define _CRT_NO_SECURE_WARNINGS // 忽略某些安全警告

#include<stdio.h> // 包含标准输入输出库
#include<iostream> // 包含输入输出流库

using namespace std; // 使用标准命名空间

int main() { // 主函数开始
    int m = 0; // 项目数
    int n = 0; // 投资金额
    int num = 0; // 用于记录第三个项目的投资金额
    float q[100][100] = { 0 }; // 一个二维数组,用来存储每个项目不同投资金额下的利润
    float f[100] = { 0 }; // 一个一维数组,用于存储当前最大收益
    float a[100][100] = { 0 }; // 一个二维数组,记录当前投资利益最大时每个项目所分配的投资数
    float temp[100] = { 0 }; // 一个一维数组,临时记录正在计算的最大收益
    float gain[100] = { 0 }; // 一个一维数组,用来存储每个项目的利润(未使用)
    int rest = 0; // 剩余投资金额(未使用)

    cout << "请输入项目数:"; // 输出提示信息
    cin >> m; // 从键盘读取项目数
    cout << "请输入投资金额:"; // 输出提示信息
    cin >> n; // 从键盘读取投资金额
    cout << "请输入原始利润数据:" << endl; // 输出提示信息

    // 循环读取每个项目的利润数据
    for (int i = 1; i <= m; i++) {
        cout << "投资#" << i << " "; // 输出提示信息
        for (int j = 0; j <= n; j++) {
            cin >> q[i][j]; // 从键盘读取利润数据
        }
    }

    // 初始化第一个项目的最大利益
    for (int j = 0; j <= n; j++) { // 从0到n投资
        f[j] = q[1][j]; // 第一个项目的最大利益
        a[1][j] = j; // 分配给第一个项目的投资金额
    }

    // 计算后面项目的最大收益
    for (int k = 2; k < m; k++) { // 从第二个项目开始
        for (int j = 0; j <= n; j++) { // 遍历所有可能的投资金额
            temp[j] = q[k][j]; // 初始化临时数组
            a[k][j] = 0; // 初始化分配数组
        }
        for (int j = 0; j <= n; j++) { // 遍历所有可能的投资金额
            for (int i = 0; i <= j; i++) { // 遍历所有可能的分配方案
                if (f[j - i] + q[k][i] > temp[j]) { // 如果当前方案更好,则更新
                    temp[j] = f[j - i] + q[k][i]; // 更新最大收益
                    a[k][j] = i; // 更新分配给当前项目的投资金额
                }
            }
        }
        for (int j = 0; j <= n; j++) { // 更新当前最大收益数组
            f[j] = temp[j];
        }
    }

    // 计算最后一个项目的最大收益
    for (int i = 0; i <= n; i++) {
        temp[i] = q[m][i] + f[n - i]; // 计算最大收益
    }
    for (int j = 0; j < n; j++) { // 找到最大收益对应的投资金额
        if (temp[j] < temp[j + 1]) {
            num = j + 1; // 记录第三个项目的投资金额
        }
    }

    // 输出第三个项目的所有可能收益
    cout << "第三个项目投资收益:" << endl;
    for (int i = 0; i <= n; i++) {
        cout << temp[i] << "  "; // 输出每个可能的最大收益
    }
    cout << "\n";

    // 输出最优投资方案
    cout << "当进行如下投资是收益最大:" << endl;
    cout << "第一个项目投资:" << n - num - a[2][n - num] << endl; // 输出第一个项目的投资金额
    cout << "第二个项目投资:" << a[2][n - num] << endl; // 输出第二个项目的投资金额
    cout << "第三个项目投资:" << num << endl; // 输出第三个项目的投资金额
    cout << "最大投资效益为:" << temp[num] << endl; // 输出最大收益

    system("pause"); // 暂停程序,等待用户操作
    return 0; // 主函数结束
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2099285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

加速电商物流效率:推荐几款实用的快递批量查询工具

做电商必不可少的快递批量查询平台分享&#xff1a;固乔快递查询助手使用全攻略 在电商行业日益竞争的今天&#xff0c;高效管理物流信息成为了商家们不可或缺的一环。面对每天成百上千的订单和快递单号&#xff0c;如何快速、准确地查询并跟踪物流状态&#xff0c;成为了电商…

SpringBoot的配置文件详解

SpringBoot配置文件概述 1&#xff09;SpringBoot的配置文件的名字必须以application开头&#xff1a; 2&#xff09;SpringBoot配置文件有两种后缀&#xff1a;.properties和.yml&#xff08;表示的意思是一样&#xff0c;只是编写数据的格式不同&#xff09; application.p…

Pixelmator Pro for Mac 专业图像处理软件【媲美PS的修图软件】

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件…

js逆向--断点

js逆向--断点 一、断点的定义及作用1、定义2、断点在js逆向中的作用二、断点方法1、DOM事件断点定位加密三、断点按钮功能1、快速执行到下一个断点的位置2、执行代码,但是不会进入函数内部3、执行代码,会进入函数的内部4、回到调用这个函数的位置5、详细执行每一步一、断点的…

P-Tuning,提升预训练语言模型的自然语言理解能力

人工智能咨询培训老师叶梓 转载标明出处 预训练语言模型在具体任务上的表现往往依赖于精心设计的离散提示&#xff08;prompts&#xff09;&#xff0c;但这些提示有着不稳定性&#xff0c;微小的变化可能导致性能的大幅下降。清华大学和麻省理工学院的研究团队提出了一种名为…

011.Python爬虫系列_bs4解析

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数…

JAVA vs Python:谁更适合后端开发?

在最近的学习中,总有人问我JAVA vs Python&#xff1a;谁更适合后端开发&#xff1f; 而在后端开发中&#xff0c;Java和Python经常被拿来比较&#xff0c;就像在问“你喜欢吃米饭还是面条&#xff1f;”答案并不绝对&#xff0c;而是取决于项目的需求、团队的熟悉度&#xff…

Linux之7z命令压缩和解压(三十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

思科交换机端口安全配置1

#网络安全技术实现# #任务一交换机端口安全配置1# #1配置计算机的IP 地址、子网掩码和网关 #2配置交换机B的主机名称&#xff0c;创建vlan 10和vlan 20&#xff0c;将f0/1、2划入vlan 10&#xff0c;f0/3、4划入vlan 20&#xff0c;将f0/24配置为Trunk Switch(config)#hostna…

深度学习(一)-感知机+神经网络+激活函数

深度学习概述 深度学习的特点 优点 性能更好 不需要特征工程 在大数据样本下有更好的性能 能解决某些传统机器学习无法解决的问题 缺点 小数据样本下性能不如机器学习 模型复杂 可解释性弱 深度学习与传统机器学习相同点 深度学习、机器学习是同一问题不同的解决方法 …

【Next】1. 初识服务端渲染

笔记来源&#xff1a;编程导航 1、什么是客户端和服务端渲染&#xff1f; 网站渲染可以在服务端和客户端两种环境下进行。 在客户端渲染&#xff08;Client-Side Rendering&#xff0c;CSR&#xff09;中&#xff0c;客户端&#xff08;浏览器&#xff09;会先向服务器请求 H…

SpringBoot实现前后端传输加密设计

在Web应用中&#xff0c;确保前后端之间的数据传输安全是非常重要的。这通常涉及到使用HTTPS协议、数据加密、令牌验证等安全措施。本文通过将前后端之间的传输数据进行加密&#xff0c;用于在Spring Boot应用中实现前后端传输加密设计。 一、数据加密方案 即使使用了HTTPS&…

金融企业业务中台应用架构设计

金融企业的业务基于价值链分解为渠道需求、产品需求、营销需求,运营需求、风险需求五大方面。业务中台内部可以划分为产品中台、渠道中台、营销中台和运营中台。 产品中台 负责金融产品研发全生命周期的流程,关注于创意评估、需求分析、方案设计、产品运营等产品研发流程,产…

深度学习(三)-反向传播

反向传播算法 深度学习三巨头发表反向传播论文 https://www.cs.toronto.edu/~hinton/absps/naturebp.pdf 正向传播网络 前一层的输出作为后一层的输入的逻辑结构&#xff0c;每一层神经元仅与下一层的神经元全连接&#xff0c;通过增加神经网络的层数虽然可为其提供更大的灵…

【论文】A Collaborative Transfer Learning Framework for Cross-domain Recommendation

Intro 业界常见的跨域建模方案主要分为两种范式[22][32][5][36][17][14][20]&#xff1a;1) 将源样本和目标样本进行联合和混合&#xff0c;然后执行多任务学习技术&#xff0c;以提高在所有域中的性能&#xff1b;2) 使用混合或数据丰富的源域数据预先训练模型&#xff0c;然…

时序优化的常见

本期求职笔试题目来源大疆硬件逻辑岗&#xff0c;共2道题&#xff0c;涉及知识点包含&#xff1a;时序约束中异步时钟的设置、典型时序优化方法。 33、根据约束关系set_clock_groups -async -group {CLK1CLK3}{CLK2}&#xff0c;下图哪些路径会进行时序检查( )&#xff08;多选…

三、电路知识笔记

三、电路知识 3.1 单位换算 1 英寸2.54 厘米25.4mm 1mil (即毫英寸)1/1000inch0.0254mm 普通杜邦线的间距为2.54mm即0.1英寸&#xff08;inch&#xff09; 3.2 贴片元件焊接 中温焊锡膏使用吹风枪焊接时&#xff0c;参考参数&#xff1a; 300度 风速4 &#xff08;可焊接贴片…

CtfShow中的misc17解法

第一步&#xff1a; 首先拿随波逐流打开看看&#xff0c;没发现啥突破点&#xff0c;很正常 第二步&#xff1a;使用kali中的binwalk命令&#xff0c;解析出一个文件夹&#xff0c;打开压缩包后发现没什么东西 第三步&#xff1a;结合题目给的提示&#xff0c;使用tweakpng打开…

前端【CSDN创作优化3】CSDN自定义模块:解决保存CSDN自定义模块时显示fail

【CSDN创作优化3】CSDN自定义模块&#xff1a;解决保存CSDN自定义模块时显示fail 写在最前面遇到的问题&#xff1a;保存CSDN自定义模块时显示fail1.符号问题&#xff1a;删除所有符号2.超出字符长度限制&#xff1a;压缩保存3.li模块不见了&#xff1a;小窗口正常显示元素 &am…

你以为AI只能写代码?来看看最新的AI工具,一句话让AI直接生成一个应用程序!

AI写代码是目前大家熟知的能力&#xff0c;无论是告诉GPT、kimi、Claude还是通义千问他们都能迅速生成出长串的代码。 但是AI在软件工程领域的能力仅限于此吗&#xff1f; “我想开发一个小游戏&#xff0c;你可以帮我开发出来吗” 想必大家肯定在GPT或者是国内大模型上问过…