首页 > 编程语言 >运筹学练习Python精解——运输和指派问题

运筹学练习Python精解——运输和指派问题

时间:2024-06-08 19:56:18浏览次数:13  
标签:10 20 Python sum 销地 ij 精解 eq 运筹学

练习1

如下表的运输问题中总需要量超过总供应量(方框中的数字是单位运费)。假定对销地\(B_1\)、\(B_2\)和\(B_3\)未满足需要量的单位罚款成本是5、3和2,试建立该问题的数学模型,并探讨能否将其转变为产销平衡运输问题。

产地\销地 B1 B2 B3 供 应 量
A1 5 1 7 10
A2 6 4 6 80
A3 3 2 5 15
需求量 75 20 50 145\105

数学模型

设 \(x_{ij}\) 为从产地 \(A_i\) 运输到销地 $B_jBj​ 的货物量。

  • 目标函数

最小化总运输成本和罚款成本: $$\min \sum_{i=1}^{3} \sum_{j=1}^{3} c_{ij} x_{ij} + \sum_{j=1}^{3} p_j y_j$$其中,
\(c_{ij}\)​ 是从 \(A_i\)​ 到 \(B_j\) 的单位运费;\(p_j\)​ 是销地 \(B_j\)​ 的单位罚款成本;\(y_j\)​ 是销地 \(B_j\)​ 的未满足需要量。

  • 约束条件
    供应量约束: \(\sum\_{j=1}^{3} x_{ij} \leq s_i \quad \forall i = 1, 2, 3\)
    需求量约束(包括未满足的部分): \(\sum_{i=1}^{3} x_{ij} + y_j = d_j \quad \forall j = 1, 2, 3\)
    非负性约束: \(x_{ij} \geq 0 \quad \forall i = 1, 2, 3;y_j \geq 0 \quad \forall j = 1, 2, 3\)
  • 参数
    单位运价\(c_{ij}:\)

\[\begin{matrix} & B_1 & B_2 & B_3 \\ A_1 & 5 & 1 & 7 \\ A_2 & 6 & 4 & 6 \\ A_3 & 3 & 2 & 5 \end{matrix} \]

供应量 \(s_i\)​:
$$ s = [10, 80, 15]$$
需求量\(d_j\):

\[d = [75, 20, 50] \]

单位罚款成本\(p_j\)​:
$$p = [5, 3, 2]$$

转化为平衡型运输问题

为将其转化为平衡型运输问题,定义一个虚拟产地 \(A_4\)​,其供应量为未满足的总需求量,即 \(\sum d_j - \sum s_i = 145 - 105 = 40\)。
新增的运费矩阵行对应的是虚拟产地 \(A_4\)​​,其到各个销地 \(B_j\)​ 的运费为对应的罚款成本。

新的运费矩阵为:

\[\begin{matrix} & B_1 & B_2 & B_3 \\ A_1 & 5 & 1 & 7 \\ A_2 & 6 & 4 & 6 \\ A_3 & 3 & 2 & 5 \\ A_4 & 5 & 3 & 2 \\ \end{matrix} \]

新的供应量向量\(s\) 为:

\[s = [10, 80, 15, 40] \]

需求量向量保持不变:

\[d = [75, 20, 50] \]

Python计算程序

import numpy as np
from scipy.optimize import linprog

# 定义参数
c = [5, 1, 7, 6, 4, 6, 3, 2, 5, 5, 3, 2]
s = [10, 80, 15, 40]
d = [75, 20, 50]

# 构建目标函数系数向量
c = np.array(c)

# 构建约束矩阵
A_eq = [
    [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1],
    [1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0],
    [0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0],
    [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]
]

A_eq = np.array(A_eq)
b_eq = np.array(s + d)

# 定义边界
x_bounds = [(0, None) for _ in range(len(c))]

# 求解线性规划问题
result = linprog(c, A_eq=A_eq, b_eq=b_eq, bounds=x_bounds, method='highs')

# 输出结果
if result.success:
    print("Optimal value:", result.fun)
    print("x values:", result.x.reshape(4, 3))
else:
    print("No solution found")
Optimal value: 595.0
x values: 
[[ 0. 10.  0.]
 [60. 10. 10.]
 [15.  0.  0.]
 [ 0.  0. 40.]]

练习2

在下表不平衡运输问题中(方框中的数字是单位运费),若产地 有单位物质未运出,就要发生存储成本。假定在产地 、 和 的单位存储成本是5、4和3,又假定产地 的供应量必须全部运出,试建立该问题的数学模型,并探讨能否将其转变为产销平衡运输问题。

产地\销地 B1 B2 B3 供 应 量
A1 1 2 1 20
A2 0 4 5 40
A3 2 3 3 30
需求量 30 20 20 70\90

练习3

有甲、乙、丙3个城市,每年分别需要煤炭320、250、350万吨,由A、B两个煤矿负责供应。已知煤矿年产量A为400万吨;B为450万吨,从两煤矿至各城市煤炭运价(元/吨)见表3-51。由于需求大于产量,经协商平均,甲城市必要时可少供0~30万吨,乙城市需求量须全部满足,丙城市需求量不少于270万吨。试求将甲、乙两矿煤炭全部分配出去,满足上述条件又使总运费为最低的调运方案。

产地\销地 供 应 量
A 15 18 22
B 21 25 16
需求量 30 20 20 70\90

练习

分配甲、乙、丙、丁4个人去完成A、B、C、D、E 5项任务,每个人完成各项任务的时间见表3-52。由于任务数多于人数,故考虑:
(1) 任务E必须完成,其他4项中可任选3项完成;
(2) 其中有一人完成两项,其他每人完成一项。
试分别确定最优分配方案,使完成任务的总时间为最少。

人员\任务 A B C D E
25 29 31 42 37
39 38 26 20 33
34 27 28 40 32
24 42 36 23 45

标签:10,20,Python,sum,销地,ij,精解,eq,运筹学
From: https://www.cnblogs.com/haohai9309/p/18238801

相关文章

  • Python【cv2:读取图片时报错】
    写在前面:opencv库安装在终端用pipinstall安装opencv-python库建议使用国内清华源的镜像去安装,加参数-ihttps://pypi.tuna.tsinghua.edu.cn/simple代码如下:pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simpleopencv-python报错一我一开始直接用cv2.imread(p......
  • Python学习日记Day1
    目录一、Python的安装二、输出print()1,输出单变量后换行——print(*)2,连续输出多个变量不换行——print(*,*,*,*,*)用英文逗号分离3,使用ASCII码进行输出——借助chr()函数4,使用Unicode码进行输出——借助ord()函数 5,ASCII码与Unicode码的相互转换6,使用print()函数将内......
  • Python基础操作之模块 -- pandas之groupby函数
            groupby函数是pandas库中一个非常强大的功能,它允许你根据一个或多个列的值对DataFrame或Series进行分组,并对每个组执行各种聚合操作。目录示例详解1.导入必要的库和创建DataFrame2.使用groupby函数进行分组3.遍历分组并查看内容4.对分组执行聚合操作......
  • 【python】python电影评论数据抓取分析可视化(源码+数据+课程论文)【独一无二】
    ......
  • 极简 Python:10 段代码,学会基础 python
    前言:本篇共包含10段简单的Python,涉及常用语法和常用库(但毫无疑问删减了很多,比如没有字典)任何不懂的地方可直接留言~注:如果某个地方以 “#”开始意思是:这是注释一、数据类型涉及Python中最常用的基本数据类型及其操作包括数字、字符串和列表#数字操作a=10b......
  • 我的职业生涯转型:金融到Python的跨越
    我是一位专科学历的专业人士,曾在金融行业深耕近十载。如今,我站在了人生的十字路口,面对着家庭、房贷和职业发展的多重压力。我代表了那些在大城市奋斗却难以扎根,同时在职业道路上感到迷茫的一群人。金融行业的变迁与个人觉醒在上海这座大都市,我度过了十年的金融生涯。从银......
  • 【Python】DQN处理CartPole-v1
    DQN是强化学习中的一种方法,是对Q-Learning的扩展。通过引入深度神经网络、经验回放和目标网络等技术,使得Q-Learning算法能够在高维、连续的状态空间中应用,解决了传统Q-Learning方法在这些场景下的局限性。Q-Learning可以见之前的文章。算法的几个关键点:1.深度学习估计状态动......
  • 使用Python进行容器编排【Docker Compose与Kubernetes的比较】
    ......
  • 【Python基础】集合(3997字)
    文章目录@[toc]什么是集合集合的特点元素不重复性示例无序性示例集合操作增加元素add()方法删除元素clear()方法pop()方法remove()方法交集intersection()方法&符号isdisjoint()方法并集union()方法|符号差集difference()方法-符号对称差集symmetric_difference(......
  • python -- series和 DataFrame增删改数据
    学习目标知道df添加新列的操作知道insert函数插入列数据知道drop函数删除df的行或列数据知道drop_duplicates函数对df或series进行数据去重知道unique函数对series进行数据去重知道apply函数的使用方法1DataFrame添加列注意:本文用到的数据集在文章顶部1.1......