首页 > 编程语言 >运筹学练习Python精解——动态规划

运筹学练习Python精解——动态规划

时间:2024-06-17 10:34:21浏览次数:25  
标签:Python max 50 60 profit range 精解 investment 运筹学

练习1

设国家拨给60万元投资,供四个工厂扩建使用,每个工厂扩建后的利润与投资额的大小有关,投资后的利润函数如下表所示,试给出收益最大的投资计划。

利润\投资 0 10 20 30 40 50 60
\(g_1(r)\) 0 20 50 65 80 85 85
\(g_2(x)\) 0 20 40 50 55 60 65
\(g_3(x)\) 0 25 60 85 100 110 115
\(g_4(x)\) 0 25 40 50 60 65 70

初始化:初始化一个动态规划表 f 和一个决策表 decisionf 用于存储最大利润,decision 用于记录每个工厂的最佳投资决策。
递归计算
- 对于每个工厂\(i\)从1到4。
- 对于每个可能的投资金额 \(j\) 从0到60。
- 对于每个可能分配给当前工厂\(i\)的投资金额 \(k\)(以10为步长),使用递归关系计算最大利润,并记录最佳决策。
回溯最优解
- 从决策表 decision 中回溯,找到每个工厂的最佳投资方案。

import numpy as np

# 表中的利润函数
g = np.array([
    [0, 20, 50, 65, 80, 85, 85],
    [0, 20, 40, 50, 55, 60, 65],
    [0, 25, 60, 85, 100, 110, 115],
    [0, 25, 40, 50, 60, 65, 70]
])

# 工厂数量和总投资
num_factories = 4
total_investment = 60

# 初始化DP表和决策表
f = np.zeros((num_factories + 1, total_investment + 1))
decision = np.zeros((num_factories + 1, total_investment + 1), dtype=int)

# 填充DP表和决策表
for i in range(1, num_factories + 1):
    for j in range(total_investment + 1):
        max_profit = 0
        best_k = 0
        for k in range(0, min(j, 60) + 1, 10):  # 考虑以10为步长的投资
            current_profit = f[i-1][j-k] + g[i-1][k//10]
            if current_profit > max_profit:
                max_profit = current_profit
                best_k = k
        f[i][j] = max_profit
        decision[i][j] = best_k

# 回溯找到最优解
investment_plan = []
remaining_investment = total_investment
for i in range(num_factories, 0, -1):
    invest_in_current_factory = decision[i][remaining_investment]
    investment_plan.append(invest_in_current_factory)
    remaining_investment -= invest_in_current_factory

investment_plan.reverse()  # 反转投资计划,按工厂顺序输出
max_profit = f[num_factories][total_investment]

print(max_profit, investment_plan)
# 160.0 [20, 0, 30, 10]

练习2

求解下面背包问题的最优解。

\[\max \quad z = 8x_1 + 5x_2 + 12x_3 \\ \begin{aligned} s.t.\quad & 3x_1 + 2x_2 + 5x_3 \leq 5 \\ & x_1, x_2, x_3 \geq 0 \quad 整数 \end{aligned} \]

  

def knapsack(values, weights, capacity):
    n = len(values)
    dp = [[0] * (capacity + 1) for _ in range(n + 1)]

    for i in range(1, n + 1):
        for w in range(capacity + 1):
            if weights[i-1] <= w:
                dp[i][w] = max(dp[i-1][w], dp[i-1][w-weights[i-1]] + values[i-1])
            else:
                dp[i][w] = dp[i-1][w]

    # 回溯找到最优解
    w = capacity
    items_selected = [0] * n
    for i in range(n, 0, -1):
        if dp[i][w] != dp[i-1][w]:
            items_selected[i-1] = 1
            w -= weights[i-1]

    max_value = dp[n][capacity]
    return max_value, items_selected

values = [8, 5, 12]
weights = [3, 2, 5]
capacity = 5

max_value, items_selected = knapsack(values, weights, capacity)

print(f"最大价值: {max_value}")
print(f"选中的物品: {items_selected}")
#最大价值: 13;选中的物品: [1, 1, 0]

练习3

A地到 E 地要铺设一条煤气管道,其中需经过三级中间站,两点之间的连线上的数字表示距离。如图所示,问应该选择什么路线,使总距离最短?




标签:Python,max,50,60,profit,range,精解,investment,运筹学
From: https://www.cnblogs.com/haohai9309/p/18251392

相关文章

  • Python 时区问题
    之前出现一个问题python时区就是定时任务不运行python脚本排查运来是运行了任务但是是UTC时区然后测试脚本在终端运行时间是正常的原因是:终端会使用用户当前的ENV的时区是正常的,但是cron是一个单独用户没有设置时区信息所以是UTC时区方案一设置cron用户环......
  • Python中的常见方法
    Python中有三种比较常见的方法类型,如类方法和静态方法,实例方法,他们是面向对象编程中重要的概念。1.类方法    类方法是通过使用装饰器@classmethod来定义的,他的第一个参数是cls,指向类本身,允许我们在方法中操作类的属性或调用其他类方法。    类方法的使用:类方法......
  • 平滑算法,可以用于信号处理和数据平滑python
    当然,有许多其他平滑算法,可以用于信号处理和数据平滑。高斯滤波(GaussianFilter)是其中一种非常流行的方法,此外还有中值滤波(MedianFilter)等。下面是一些相关算法的介绍和示例代码。1.高斯滤波(GaussianFilter)高斯滤波是一种线性平滑滤波器,使用高斯分布的权重进行加权平均。它能......
  • Python数据分析与建模库-03数据分析处理库Pandas-1.数据读取
    该视频主要讲述了pandas库在数据处理中的重要性。首先介绍了pandas库是基于numpy库封装了一些操作,简化了数据处理过程。然后通过读取CSV文件的例子,演示了如何使用pandas的read_csv函数将数据读入,并展示了数据类型和数据格式。接着介绍了pandas库中的DataFrame格式,它可以看作......
  • 【Python】深入了解聚类:从原理到实践
    听说你为她做的件件是我曾经求而不得我够不着的烟火偏偏降落在别人窗口那晚的风吹到今天都还未凉透才松开手你却已握紧别的温柔                     ......
  • 【四种语言一网打尽(C\C++\Python\Golang)】L1-012 计算指数
    L1-012计算指数真的没骗你,这道才是简单题——对任意给定的不超过10的正整数n,要求你输出2^n。不难吧?输入格式:输入在一行中给出一个不超过10的正整数n。输出格式:在一行中按照格式2^n=计算结果输出2^n的值。输入样例:5输出样例:2^5=32C语言参考......
  • 【四种语言一网打尽(C\C++\Python\Golang)】L1-009 N个数求和
    L1-009N个数求和本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。输入格式:输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1a2/b2…给出N个有理数。题目保证所有分子和分母都在长整型范围......
  • 【Python】深入了解 AdaBoost:自适应提升算法
    我们都找到天使了说好了心事不能偷藏着什么都一起做幸福得没话说把坏脾气变成了好沟通我们都找到天使了约好了负责对方的快乐阳光下的山坡你素描的以后怎么抄袭我脑袋想的                     ......
  • 4.12 Python set集合基本操作
    Pythonset集合基本操作(添加、删除、交集、并集、差集)Pythonset集合最常用的操作是向集合中添加、删除元素,以及集合之间做交集、并集、差集等运算,本节将一一讲解这些操作的具体实现。向set集合中添加元素set集合中添加元素,可以使用set类型提供的add()方法实现,该......
  • Python使用.NET开发的类库来提高你的程序执行效率
    Python由于本身的特性原因,执行程序期间可能效率并不是很理想。在某些需要自己提高一些代码的执行效率的时候,可以考虑使用C#、C++、Rust等语言开发的库来提高python本身的执行效率。接下来,我演示一种使用.NET平台开发的类库,来演示一下Python访问.NET类库的操作实现。类库演示包括.N......