【运筹优化】运输问题建模 + Java调用Cplex求解

文章目录

  • 一、问题描述
  • 二、思路分析
  • 三、建模方案
  • 四、Java调用Cplex代码
  • 五、输出结果


一、问题描述

运输问题(transportation problem)一般是研究把某种商品从若干个产地运至若干个销地而使总运费最小的一类问题。

本博客将根据下面的例题,介绍运输问题的建模和求解

在这里插入图片描述


二、思路分析

在料场与工地之间计算一个距离弧,然后将分配到弧上的运输量作为决策变量,从而建立线性规划模型调用Cplex求解。


三、建模方案

x i j x_{ij} xij为料场 i = ( 1 , 2 , . . . , n ) i=(1,2,...,n) i=(1,2,...,n)向工地 j = ( 1 , 2 , . . . , m ) j=(1,2,...,m) j=(1,2,...,m)运输的水泥量(吨), d i j d_{ij} dij为料场 i i i到工地 j j j的欧几里得距离(km), c i c_i ci为料场 i i i的日储量(吨), s j s_j sj为工地 j j j的日用量(吨),则问题(1)可以被建模为如下的线性规划模型:

在这里插入图片描述


四、Java调用Cplex代码

import ilog.concert.IloLinearNumExpr;
import ilog.concert.IloNumVar;
import ilog.cplex.IloCplex;
import lombok.AllArgsConstructor;import java.util.ArrayList;
import java.util.List;/*** @Author:WSKH* @ClassName:Answer1* @Description:* @Time:2023/8/15/9:49* @Email:1187560563@qq.com* @Blog:wskh0929.blog.csdn.net*/
public class Answer1 {/*** 料场对象*/@AllArgsConstructorstatic class Stockyard {/*** x,y坐标和储量c*/double x, y, c;}/*** 工地对象*/@AllArgsConstructorstatic class ConstructionSite {/*** x,y坐标和需求d*/double x, y, d;}private static double calcDistance(double x1, double y1, double x2, double y2) {return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));}public static void main(String[] args) throws Exception {// 浮点型精度误差double EPS = 1e-06;// 料场列表List<Stockyard> stockyardList = new ArrayList<>();stockyardList.add(new Stockyard(5, 1, 20));stockyardList.add(new Stockyard(2, 7, 20));// 工地列表List<ConstructionSite> constructionSiteList = new ArrayList<>();constructionSiteList.add(new ConstructionSite(1.25, 1.25, 3));constructionSiteList.add(new ConstructionSite(8.75, 0.75, 5));constructionSiteList.add(new ConstructionSite(0.5, 4.75, 4));constructionSiteList.add(new ConstructionSite(5.75, 5, 7));constructionSiteList.add(new ConstructionSite(3, 6.5, 6));constructionSiteList.add(new ConstructionSite(7.25, 7.75, 11));// 计算距离矩阵double[][] distanceMatrix = new double[stockyardList.size()][constructionSiteList.size()];for (int i = 0; i < distanceMatrix.length; i++) {Stockyard stockyard = stockyardList.get(i);for (int j = 0; j < distanceMatrix[i].length; j++) {ConstructionSite constructionSite = constructionSiteList.get(j);distanceMatrix[i][j] = calcDistance(stockyard.x, stockyard.y, constructionSite.x, constructionSite.y);}}// 开始建模IloCplex cplex = new IloCplex();// 声明变量IloNumVar[][] x = new IloNumVar[stockyardList.size()][constructionSiteList.size()];for (int i = 0; i < x.length; i++) {for (int j = 0; j < x[i].length; j++) {x[i][j] = cplex.numVar(0, Math.min(stockyardList.get(i).c, constructionSiteList.get(j).d));}}// 构造约束1:必须满足每个工地的需求for (int j = 0; j < constructionSiteList.size(); j++) {IloLinearNumExpr expr = cplex.linearNumExpr();for (int i = 0; i < x.length; i++) {expr.addTerm(1, x[i][j]);}cplex.addEq(expr, constructionSiteList.get(j).d);}// 构造约束2:不能超过每个料场的储量for (int i = 0; i < stockyardList.size(); i++) {cplex.addLe(cplex.sum(x[i]), stockyardList.get(i).c);}// 声明目标函数IloLinearNumExpr target = cplex.linearNumExpr();for (int i = 0; i < x.length; i++) {for (int j = 0; j < x[i].length; j++) {target.addTerm(distanceMatrix[i][j], x[i][j]);}}cplex.addMinimize(target);// 配置cplexcplex.setOut(null);cplex.setWarning(null);cplex.setParam(IloCplex.DoubleParam.EpOpt, EPS);// 开始求解long s = System.currentTimeMillis();if (cplex.solve()) {System.out.println("最小吨千米数为: " + cplex.getObjValue());for (int i = 0; i < stockyardList.size(); i++) {for (int j = 0; j < x[i].length; j++) {double xValue = cplex.getValue(x[i][j]);if (xValue > EPS) {System.out.println("料场" + (i + 1) + "向工地" + (j + 1) + "运输" + xValue + "吨水泥");}}}System.out.println("求解用时: " + (System.currentTimeMillis() - s) / 1000d + " s");} else {System.err.println("此题无解");}// 结束模型cplex.end();}
}

五、输出结果

最小吨千米数为: 136.22751988318154
料场1向工地1运输3.0吨水泥
料场1向工地2运输5.0吨水泥
料场1向工地4运输7.0吨水泥
料场1向工地6运输1.0吨水泥
料场2向工地3运输4.0吨水泥
料场2向工地5运输6.0吨水泥
料场2向工地6运输10.0吨水泥
求解用时: 0.002 s

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

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

相关文章

STM32F407使用Helix库软解MP3并通过DAC输出,最精简的STM32+SD卡实现MP3播放器

只用STM32单片机SD卡耳机插座&#xff0c;实现播放MP3播放器&#xff01; 看过很多STM32软解MP3的方案&#xff0c;即不通过类似VS1053之类的解码器芯片&#xff0c;直接用STM32和软件库解码MP3文件&#xff0c;通常使用了labmad或者Helix解码库实现&#xff0c;Helix相对labm…

WebRTC音视频通话-WebRTC视频自定义RTCVideoCapturer相机

WebRTC音视频通话-WebRTC视频自定义RTCVideoCapturer相机 在之前已经实现了WebRTC调用ossrs服务&#xff0c;实现直播视频通话功能。但是在使用过程中&#xff0c;RTCCameraVideoCapturer类提供的方法不能修改及调节相机的灯光等设置&#xff0c;那就需要自定义RTCVideoCaptur…

到江西赣州ibm维修服务器之旅-联想X3850 x6黄灯故障

2023年08月15日&#xff0c;一位江西赣州工厂客户通过朋友介绍与冠峰售前工程师取得联系&#xff0c;双方对产品故障前后原因沟通的大致情况如下&#xff1a; 服务器型号&#xff1a;Lenovo system x3850 x6 为用户公司erp仓库服务器 服务器故障&#xff1a;正常使用过程中业…

<数据结构与算法>二叉树堆的实现

目录 前言 一、树的概念及结构 1 树的概念 2 树的相关概念 二、二叉树的概念及结构 1.二叉树的概念 2. 特殊的二叉树 3. 二叉树的性质 4.二叉树的存储结构 三、二叉树的顺序结构及实现 1.堆的性质 2.堆的插入 3.堆的实现 堆的结构体 HeapInit 初始化 HeapPush 插入 HeapPop 删…

【C++进阶】继承、多态的详解(多态篇)

【C进阶】继承、多态的详解&#xff08;多态篇&#xff09; 目录 【C进阶】继承、多态的详解&#xff08;多态篇&#xff09;多态的概念多态的定义及实现多态的构成条件&#xff08;重点&#xff09;虚函数虚函数的重写&#xff08;覆盖、一种接口继承&#xff09;C11 override…

solr快速上手:聚合分组查询|嵌套分组指南(十二)

0. 引言 solr作为搜索引擎经常用于各类查询场景&#xff0c;我们之前讲解了solr的查询语法&#xff0c;而除了普通的查询语法&#xff0c;有时我们还需要实现聚合查询来统计一些指标&#xff0c;所以今天我们接着来查看solr的聚合查询语法 1. 常用聚合查询语法 以下演示我们…

面试题-React(一):React是什么?它的主要特点是什么?

探索React&#xff1a;前端开发中的重要角色与主要特点 引言&#xff1a; 在现代前端开发领域&#xff0c;React已经成为最受欢迎和广泛使用的JavaScript库之一。它由Facebook开发并于2013年首次发布。随着时间的推移&#xff0c;React在开发社区中获得了强大的支持和认可。本…

画质提升+带宽优化,小红书音视频团队端云结合超分落地实践

随着视频业务和短视频播放规模不断增长&#xff0c;小红书一直致力于研究&#xff1a;如何在保证提升用户体验质量的同时降低视频带宽成本&#xff1f; 在近日结束的音视频技术大会「LiveVideoStackCon 2023」上海站中&#xff0c;小红书音视频架构视频图像处理算法负责人剑寒向…

基于注意力神经网络的深度强化学习探索方法:ARiADNE

ARiADNE:A Reinforcement learning approach using Attention-based Deep Networks for Exploration 文章目录 ARiADNE:A Reinforcement learning approach using Attention-based Deep Networks for Exploration机器人自主探索(ARE)ARE的传统边界法非短视路径深度强化学习的方…

Python | Package | Python的三种包安装方式(pip/whl/tar.gz)

文章目录 PIP 安装与卸载Source 安装与卸载Whell 安装与卸载 PIP 安装与卸载 pip install xxx pip install xxxversion_numberpip install captcha pip install captcha0.4# XXX/anaconda3/envs/py373/lib/python3.7/site-packages pip uninstall captchaSource 安装与卸载 p…

C++音乐播放系统

C音乐播放系统 音乐的好处c发出声音乐谱与赫兹对照把歌打到c上 学习c的同学们都知道&#xff0c;c是一个一本正经的编程语言&#xff0c;因该没有人用它来做游戏、做病毒、做…做…做音乐播放系统吧&#xff01;&#xff01; 音乐的好处 提升情绪&#xff1a;音乐能够影响我们…

java语言B/S架构云HIS医院信息系统源码【springboot】

医院云HIS全称为基于云计算的医疗卫生信息系统( Cloud- Based Healthcare Information System)&#xff0c;是运用云计算、大数据、物联网等新兴信息技术&#xff0c;按照现代医疗卫生管理要求&#xff0c;在一定区域范围内以数字化形式提供医疗卫生行业数据收集、存储、传递、…

动手学深度学习--基础知识上篇

&#x1f388;动手学deep learning ☁️本专栏会定期更新关于动手学深度学习的每章知识点的讲解&#xff0c;题目答案 &#x1f47b;如果喜欢&#xff0c;欢迎点赞&#xff0c;收藏 动手学深度学习-预备知识篇 线性代数篇 1-3题讲解 证明一个矩阵 A \mathbf{A} A的转置的转置…

安卓手机跑 vins slam (2)

既然选择把vins的代码移植到新工程&#xff0c;那么就需要先确定自己电脑的Android Studio的C开发环节是OK的&#xff0c;可以通过创建C的示例工程&#xff0c;能正常跑通做验证。 选择Native C 需要选择用C哪个版本&#xff0c; 这里通过百度搜索&#xff0c;slam 编译需要C 1…

电脑提示丢失(或找不到)msvcp120.dll解决办法

msvcp140.dll是Microsoft Visual C Redistributable的一部分&#xff0c;它是Windows操作系统中的一个动态链接库文件。这个文件包含了许多C标准库函数的实现&#xff0c;对于一些依赖C标准库的应用程序来说&#xff0c;msvcp140.dll是非常重要的。msvcp140.dll的主要用途是提供…

热电联产在综合能源系统中的选址定容研究(matlab代码)

目录 1 主要内容 目标函数 程序模型 2 部分代码 3 程序结果 1 主要内容 该程序参考《热电联产在区域综合能源系统中的定容选址研究》&#xff0c;主要针对电热综合能源系统进行优化&#xff0c;确定热电联产机组的位置和容量&#xff0c;程序以33节点电网和17节点热网为例…

CI/CD入门(二)

CI/CD入门(二) 目录 CI/CD入门(二) 1、代码上线方案 1.1 早期手动部署代码1.2 合理化上线方案1.3 大型企业上线制度和流程1.4 php程序代码上线的具体方案1.5 Java程序代码上线的具体方案1.6 代码上线解决方案注意事项2、理解持续集成、持续交付、持续部署 2.1 持续集成2.2 持续…

小白到运维工程师自学之路 第七十五集 (Kubernetes 企业级高可用部署)2

8、添加master节点 在k8s-master2和k8s-master3节点创建文件夹 mkdir -p /etc/kubernetes/pki/etcd在k8s-master1节点执行 从k8s-master1复制密钥和相关文件到k8s-master2和k8s-master3 scp /etc/kubernetes/admin.conf root192.168.77.15:/etc/kubernetes scp /etc/kubernet…

UAF释放后重引用原理

原地址&#xff1a;https://blog.csdn.net/qq_31481187/article/details/73612451 原作者代码是基于linux系统的演示代码&#xff0c;因为windows和Linux 内存管理机制上略有不同&#xff0c;该程序在Windows需要稍微做些改动。 Windows上执行free释放malloc函数分配的内存后…

Docker碎碎念

docker和虚拟机的区别 虚拟机&#xff08;VM&#xff09;是通过在物理硬件上运行一个完整的操作系统来实现的。 每个虚拟机都有自己的内核、设备驱动程序和用户空间&#xff0c;它们是相互独立且完全隔离的。 虚拟机可以在不同的物理服务器之间迁移&#xff0c;因为它们是以整…