运输问题

运输问题(transportation problem)一般是研究把某种商品从若干产地运至若干个销地而使总运费最小的一类问题。一种特殊的线性规划问题,由于其技术系数矩阵具有特殊的结构,可以使用表上作业法高效求解;

  • 产销平衡的运输问题总是存在可行解

  • 产销不平衡:

    • 产大于销:增加虚拟销地,销量为产销之差,并设置单位运价为0

    • 产小于销:增加虚拟产地,产量为销产之差,并设置单位运价为0

表上作业法

  • 表上作业法是单纯形法在求解运输问题时的一种简化方法, 其实质是单纯形法

  • 计算步骤:

    ​ 1)找出初始基可行解(最小元素法、伏格尔法)。即在( m× n) 产销平衡表上给出 m + n - 1 个数字格。

    ​ 2)求各非基变量的检验数, 即在表上计算空格的检验数,判别是否达到最优解(闭回路法、位势法)。如

    已是最优解,则停止计算, 否则转到下一步。

    ​ 3)确定换入变量和换出变量, 找出新的基可行解。在表上用闭回路法调整。

    ​ 4) 重复( 2) , ( 3) 直到得到最优解为止。

python调用scip求解案例

from pyscipopt import *
import numpy as npmodel = Model()# 生成测试数据
product = {'1': 45, '2': 120, '3': 95} # key: 生产地编号 value: 对应的产量
sales = {'1': 80, '2': 78, '3': 47, '4': 55} # key: 销售地编号 value:对应的需求量
# 物流运输成本
cost = np.array([[250, 420, 380, 280],[1280, 990, 1440, 1520],[1550, 1420, 1660, 1730]])
product_num = len(product)
sales_num = len(sales)# 添加变量
# x{i}{j} 代表产地i 到销地j的运输量
x = {}
for i in range(1, product_num + 1):for j in range(1, sales_num + 1):x[str(i) + str(j)] = model.addVar(vtype='I', name='x' + str(i) + str(j))# 添加约束
# 以供销平衡为例,如供销不平衡,则添加虚拟销地或者产地,作为松弛变量
# 3个生产地,运输量等于产量
for i in range(1, product_num + 1):model.addCons(quicksum(x[str(i) + str(j)] for j in range(1, sales_num + 1)) == product[str(i)])# 4个销售地,运输量等于需求量
for j in range(1, sales_num + 1):model.addCons(quicksum(x[str(i) + str(j)] for i in range(1, product_num + 1)) == sales[str(j)])# 添加目标
model.setObjective(quicksum(x[str(i) + str(j)] * cost[[i-1], [j-1]] for i in range(1, product_num + 1) for j in range(1, sales_num + 1)))
model.setMinimize()
model.writeProblem('problem.lp')
model.optimize()print('min cost = ', model.getObjVal())for i in range(1, product_num + 1):for j in range(1, sales_num + 1):print('x' + str(i) + str(j), '=',model.getVal(x[str(i) + str(j)]))
  • 打印结果
  • lp文件

python调用开源求解器scip求解运输问题相关推荐

  1. python调用开源求解器SCIP求解带时间窗车辆路径问题(VRPTW)

    文章目录 1. 问题定义 2. 数学模型 3. python调用SCIP实现代码 4. 结果 参考文献 1. 问题定义 带时间窗车辆路径问题(vehicle routing problem with ...

  2. python调用求解器SCIP求解设施选址覆盖问题

    文章目录 1. 设施选址集合覆盖问题 2. 算法实现 2.1 测试数据集 OR-Library 2.2 python调用SCIP求解设施选址覆盖问题完整代码: 2.3 数据结果 参考文献 1. 设施选 ...

  3. 一站式解决数学规划求解器SCIP的安装与使用

    安装Java的SCIP接口JSCIPOpt系列 https://blog.csdn.net/qq_40275637/article/details/109703216 安装python的SCIP接口P ...

  4. SCIP | 数学规划求解器SCIP超详细的使用教程

    前言 小伙伴们大家好呀!继上次lp_solve规划求解器的推文出来以后,大家都期待着更多求解器的具体介绍和用法.小编哪敢偷懒,这不,赶在考试周之际,又在忙里偷闲中给大家送上一篇SCIP规划求解的推文教 ...

  5. 优化求解器SCIP介绍

    SCIP(Solving Constraint Integer Programs)一款非常成熟的开源混合整数规划(MILP)框架,支持自定义搜索树中的各个模块,当然包括在分支限界(Branch and ...

  6. 线性规划整数规划求解器SCIP的失败使用 与 GLPK的成功使用

    因本人科研需要,需要使用这两个求解器解数学模型. 本人的实现平台为window10,64位,基于C++,且之前已安装Visual Studio 2015. 但是SCIP的使用建议使用Linux,感觉可 ...

  7. python调用默认播放器_python使用Tkinter实现在线音乐播放器

    本文实例使用Tkinter实现在线音乐播放器的具体代码,供大家参考,具体内容如下 1.先使用Tkinter库写界面 2.写点击按钮触发的事件 (1).使用网易音乐的api,返回数据包装成json格式数 ...

  8. python调用默认播放器_用Python批量下载MOOC资源

    简介 这是我编写的一个Python脚本,用来批量下载一门MOOC的资源,包括视频.PDF和课程目录. 你是否也曾上MOOC学习过?有没有和我一样遇到这些情况:在线看MOOC视频消耗流量好多,或者浏览器 ...

  9. Python 调用 SCIP 求解器的选址模型代码示例

    本文介绍 Python 语言调用 SCIP 求解器,求解选址模型的代码示例. 安装 SCIP 和 PySCIPOpt 安装 SCIP 求解器的教程: SCIP | 数学规划求解器SCIP超详细的使用教 ...

最新文章

  1. Python-常用字符串转换实例
  2. CentOS 6.3 运维监控之Cacti 监控主机系统(二)
  3. Jmeter运行过程中如何让Fiddler同时可以抓获到服务器的应答报文
  4. android sh 指令_Java/Android中实现Shell命令
  5. Python 生成requirement 使用requirements.txt
  6. 天梯—计算阶乘和(C语言)
  7. Python命令行参数选择
  8. java网上订餐系统开题报告_网上订餐系统的设计与实现
  9. onvif工具测试网络摄像头视频
  10. Linux 下修改数据库密码
  11. 概率分布 ---- 二项分布
  12. 现代软件工程_团队项目_阿尔法阶段_前端及后端新增功能_v1.0.1_2017.11.29
  13. 触动的话语,为自己而活
  14. iOS开发 设置状态栏字体颜色
  15. 深入JavaWeb技术世界15:通过项目逐步深入了解Mybatis(二)
  16. 【Hive】left semi join(exists、in)和 left join 区别
  17. 服务器的GPU显卡位置,GPU显卡服务器
  18. AI出奇迹!人工智能创造出世界首项体育运动,还充满享受、包容精神
  19. CVE-2018-2628漏洞复现
  20. 水库大坝安全检测平台实例分析+辽阳市水库大坝安全检测平台+志豪未来科技有限公司+陈志豪

热门文章

  1. 三维空间中两次旋转等效为一次旋转的计算方法(四元数)
  2. UE4 学习记录五 使用合体触发器触发过场动画移动其他物体 开门
  3. 优维科技7周年庆|未来可“7”,从心出发
  4. 【机器学习算法】聚类分析-2 聚类算法的分类,层次聚类算法的选择
  5. Debian10 上实现dns-CA+apache服务
  6. Python数据分析——分析名单表格的姓氏、姓名等
  7. D. Array and Operations
  8. Orcale的NVL、NVL2函数和SQL Server的ISNULL函数
  9. SOA面向服务的架构
  10. 循环语句中continue和break的使用