使用MATLAB解算炼油厂的选址

news2025/1/12 23:09:31

背景

记得有一年的数据建模大赛,试题是炼油厂的选址,最后我们采用MATLAB编写(复制)蒙特卡洛算法,还到了省级一等奖,这里把仅有一些记忆和材料,放到这里来,用来纪念消失的青春。

本文使用素材下载,内含MATLAB代码

使用蒙特卡洛算法解算炼油厂的选址MATLAB程序,提供试题照片,以及MATLAB代码资源-CSDN文库

试题参考

如下图所示:

问题分析

问题一:

        本问的炼油厂选址是九口油井的任一处,我们可以把九口油井依次作为炼油厂,然后分别计算其费用。

问题二:

        本问的炼油厂选址范围应在0<横坐标x<100、0<纵坐标y<100,的矩形区域内。可以把问题转化为:在该矩形区域内找一点使其满足总费用最少。

问题三:

        本问的两个炼油厂的选址纵横坐标都应在[0,82]的范围内。问即可转化成在该矩形区域内找两点,使其总费用最低。

模型假设

  1. 总费用与距离成正比,设比例系数为1
  2. 总费用与油量成正比,设比例系数为1
  3. 其他因素不影响总费用;
  4. 一口油井的原油智能运往一个炼油厂;

模型建立与求解

第一问模型:

        设选1号油井为炼油厂产生的费用为feiyoug1

选1号油井为炼油厂产生的费用为feiyoug1

选2号油井为炼油厂产生的费用为feiyoug2

选3号油井为炼油厂产生的费用为feiyoug3

选4号油井为炼油厂产生的费用为feiyoug4

选9号油井为炼油厂产生的费用为feiyoug9

由问题一分析可知问题可转化为求

feiyong1=(abs(x2-x1)+abs(y2-y1))*chanliang2+(abs(x3-x1)+abs(y3-y1))*chanliang3+(abs(x4-x1)+abs(y4-y1))*chanliang4+(abs(x5-x1)+abs(y5-y1))*chanliang5+(abs(x6-x1)+abs(y6-y1))*chanliang6+(abs(x7-x1)+abs(y7-y1))*chanliang7+(abs(x8-x1)+abs(y8-y1))*chanliang8+(abs(x9-x1)+abs(y9-y1))*chanliang9

(其中abs是求绝对值,其余八个油井到1号油井的折线距离与产量之积作为费用,总费用即为八个油井产生费用之和)

同法可求feiyong2、feiyong3、……、feiyong9

第一问求解:

利用matlab编程求解如下:

第一问程序

x1=22;

y1=38;

x2=8;

y2=13;

x3=4;

y3=81;

x4=51;

y4=32;

x5=38;

y5=11;

x6=17;

y6=12;

x7=81;

y7=63;

x8=19;

y8=45;

x9=62;

y9=12;

chanliang1=17;

chanliang2=40;

chanliang3=60;

chanliang4=20;

chanliang5=25;

chanliang6=15;

chanliang7=50;

chanliang8=8;

chanliang9=30;

feiyong1=(abs(x2-x1)+abs(y2-y1))*chanliang2+(abs(x3-x1)+abs(y3-y1))*chanliang3+(abs(x4-x1)+abs(y4-y1))*chanliang4+(abs(x5-x1)+abs(y5-y1))*chanliang5+(abs(x6-x1)+abs(y6-y1))*chanliang6+(abs(x7-x1)+abs(y7-y1))*chanliang7+(abs(x8-x1)+abs(y8-y1))*chanliang8+(abs(x9-x1)+abs(y9-y1))*chanliang9

feiyong2=(abs(x1-x2)+abs(y1-y2))*chanliang1+(abs(x3-x2)+abs(y3-y2))*chanliang3+(abs(x4-x2)+abs(y4-y2))*chanliang4+(abs(x5-x2)+abs(y5-y2))*chanliang5+(abs(x6-x2)+abs(y6-y2))*chanliang6+(abs(x7-x2)+abs(y7-y2))*chanliang7+(abs(x8-x2)+abs(y8-y2))*chanliang8+(abs(x9-x2)+abs(y9-y2))*chanliang9

feiyong3=(abs(x1-x3)+abs(y1-y3))*chanliang1+(abs(x2-x3)+abs(y2-y3))*chanliang2+(abs(x4-x3)+abs(y4-y3))*chanliang4+(abs(x5-x3)+abs(y5-y3))*chanliang5+(abs(x6-x3)+abs(y6-y3))*chanliang6+(abs(x7-x3)+abs(y7-y3))*chanliang7+(abs(x8-x3)+abs(y8-y3))*chanliang8+(abs(x9-x3)+abs(y9-y3))*chanliang9

feiyong4=(abs(x1-x4)+abs(y1-y4))*chanliang1+(abs(x2-x4)+abs(y2-y4))*chanliang2+(abs(x3-x4)+abs(y3-y4))*chanliang3+(abs(x5-x4)+abs(y5-y4))*chanliang5+(abs(x6-x4)+abs(y6-y4))*chanliang6+(abs(x7-x4)+abs(y7-y4))*chanliang7+(abs(x8-x4)+abs(y8-y4))*chanliang8+(abs(x9-x4)+abs(y9-y4))*chanliang9

feiyong5=(abs(x1-x5)+abs(y1-y5))*chanliang1+(abs(x2-x5)+abs(y2-y5))*chanliang2+(abs(x3-x5)+abs(y3-y5))*chanliang3+(abs(x4-x5)+abs(y4-y5))*chanliang4+(abs(x6-x5)+abs(y6-y5))*chanliang6+(abs(x7-x5)+abs(y7-y5))*chanliang7+(abs(x8-x5)+abs(y8-y5))*chanliang8+(abs(x9-x5)+abs(y9-y5))*chanliang9

feiyong6=(abs(x1-x6)+abs(y1-y6))*chanliang1+(abs(x2-x6)+abs(y2-y6))*chanliang2+(abs(x3-x6)+abs(y3-y6))*chanliang3+(abs(x4-x6)+abs(y4-y6))*chanliang4+(abs(x5-x6)+abs(y5-y6))*chanliang5+(abs(x7-x6)+abs(y7-y6))*chanliang7+(abs(x8-x6)+abs(y8-y6))*chanliang8+(abs(x9-x6)+abs(y9-y6))*chanliang9

feiyong7=(abs(x1-x7)+abs(y1-y7))*chanliang1+(abs(x2-x7)+abs(y2-y7))*chanliang2+(abs(x3-x7)+abs(y3-y7))*chanliang3+(abs(x4-x7)+abs(y4-y7))*chanliang4+(abs(x5-x7)+abs(y5-y7))*chanliang5+(abs(x6-x7)+abs(y6-y7))*chanliang6+(abs(x8-x7)+abs(y8-y7))*chanliang8+(abs(x9-x7)+abs(y9-y7))*chanliang9

feiyong8=(abs(x1-x8)+abs(y1-y8))*chanliang1+(abs(x2-x8)+abs(y2-y8))*chanliang2+(abs(x3-x8)+abs(y3-y8))*chanliang3+(abs(x4-x8)+abs(y4-y8))*chanliang4+(abs(x5-x8)+abs(y5-y8))*chanliang5+(abs(x6-x8)+abs(y6-y8))*chanliang6+(abs(x7-x8)+abs(y7-y8))*chanliang7+(abs(x9-x8)+abs(y9-y8))*chanliang9

feiyong9=(abs(x1-x9)+abs(y1-y9))*chanliang1+(abs(x2-x9)+abs(y2-y9))*chanliang2+(abs(x3-x9)+abs(y3-y9))*chanliang3+(abs(x4-x9)+abs(y4-y9))*chanliang4+(abs(x5-x9)+abs(y5-y9))*chanliang5+(abs(x6-x9)+abs(y6-y9))*chanliang6+(abs(x7-x9)+abs(y7-y9))*chanliang7+(abs(x8-x9)+abs(y8-y9))*chanliang8

第一问运行结果

feiyong1 =

       13720

feiyong2 =

       15317

feiyong3 =

       18635

feiyong4 =

       14835

feiyong5 =

       15185

feiyong6 =

       14857

feiyong7 =

       20108

feiyong8 =

       13980

feiyong9 =

       16970

由程序运行结果可知:

        feiyong1最小,即炼油厂建在1号油井附近,总费用最少。

第二问模型:

        由分析可设该炼油厂得地址为(x(1),x(2)),且0<x(1)<100,0<x(2)<100

即求zongfeiyong最小

zongfeiyong=17*sqrt((x(1)-22)^2+(x(2)-38)^2)+40*sqrt((x(1)-8)^2+(x(2)-13)^2)+60*sqrt((x(1)-4)^2+(x(2)-81)^2)+20*sqrt((x(1)-51)^2+(x(2)-32)^2)+25*sqrt((x(1)-38)^2+(x(2)-11)^2)+15*sqrt((x(1)-17)^2+(x(2)-12)^2)+50*sqrt((x(1)-81)^2+(x(2)-63)^2)+8*sqrt((x(1)-19)^2+(x(2)-45)^2)+30*sqrt((x(1)-62)^2+(x(2)-12)^2);

其中sqrt为平方的意思,分别求的每个油井的到炼油厂的距离与其产量的积,再作和,即为总费用。

第二问用matlab编程求解如下(利用matlab总求最优解函数fmincon):

第二问程序

function zongfeiyong=timu2(x)

zongfeiyong=17*sqrt((x(1)-22)^2+(x(2)-38)^2)+40*sqrt((x(1)-8)^2+(x(2)-13)^2)+60*sqrt((x(1)-4)^2+(x(2)-81)^2)+20*sqrt((x(1)-51)^2+(x(2)-32)^2)+25*sqrt((x(1)-38)^2+(x(2)-11)^2)+15*sqrt((x(1)-17)^2+(x(2)-12)^2)+50*sqrt((x(1)-81)^2+(x(2)-63)^2)+8*sqrt((x(1)-19)^2+(x(2)-45)^2)+30*sqrt((x(1)-62)^2+(x(2)-12)^2);

xmin=[0;0];

xmax=[100;100];

[x,fopt,flag,c]=fmincon('timu2',zeros(2,1),[],[],[],[],xmin,xmax)

第二问运行结果

x =

   32.4224

   35.0597

fopt =

  1.0213e+004

flag =

     5

c =

         iterations: 8

          funcCount: 26

       lssteplength: 1

           stepsize: 2.0001e-004

          algorithm: [1x44 char]

      firstorderopt: 5.9487e-004

    constrviolation: -32.4224

            message: [1x844 char]

由程序运行结果可知:

即选址坐标为(32.4224,35.0597

此时总费用最少为10213

第三问模型:

        我们可以在纵、横坐标都为[0,82]的范围内任意选取两点做炼油厂。总费用即可转换为RES=min(17*sqrt((x(1)-22)^2+(x(2)-38)^2),17*sqrt((x(3)-22)^2+(x(4)-38)^2))+min(40*sqrt((x(1)-8)^2+(x(2)-13)^2),40*sqrt((x(3)-8)^2+(x(4)-13)^2))+min(60*sqrt((x(1)-4)^2+(x(2)-81)^2),60*sqrt((x(3)-4)^2+(x(4)-81)^2))+min(20*sqrt((x(1)-51)^2+(x(2)-32)^2),20*sqrt((x(3)-51)^2+(x(4)-32)^2))+min(25*sqrt((x(1)-38)^2+(x(2)-11)^2),25*sqrt((x(3)-38)^2+(x(4)-11)^2))+min(15*sqrt((x(1)-17)^2+(x(2)-12)^2),15*sqrt((x(3)-17)^2+(x(4)-12)^2))+min(50*sqrt((x(1)-81)^2+(x(2)-63)^2),50*sqrt((x(3)-81)^2+(x(4)-63)^2))+min(8*sqrt((x(1)-19)^2+(x(2)-45)^2),8*sqrt((x(3)-19)^2+(x(4)-45)^2))+min(30*sqrt((x(1)-62)^2+(x(2)-12)^2),30*sqrt((x(3)-62)^2+(x(4)-12)^2))

其中min(A,B)是求A、B中较小的数。

第三问求解:

        利用蒙特卡洛算法,我们对x(1),x(2),x(3), x(4)随机生成一千万组(范围在[0,82]内),带入总费用公式RES中。求得其中最小值。利用matlab编程如下(程序多次运行):

第三问程序:

% 原函数

function RES=myobjfunc(x)

RES=min(17*sqrt((x(1)-22)^2+(x(2)-38)^2),17*sqrt((x(3)-22)^2+(x(4)-38)^2))+min(40*sqrt((x(1)-8)^2+(x(2)-13)^2),40*sqrt((x(3)-8)^2+(x(4)-13)^2))+min(60*sqrt((x(1)-4)^2+(x(2)-81)^2),60*sqrt((x(3)-4)^2+(x(4)-81)^2))+min(20*sqrt((x(1)-51)^2+(x(2)-32)^2),20*sqrt((x(3)-51)^2+(x(4)-32)^2))+min(25*sqrt((x(1)-38)^2+(x(2)-11)^2),25*sqrt((x(3)-38)^2+(x(4)-11)^2))+min(15*sqrt((x(1)-17)^2+(x(2)-12)^2),15*sqrt((x(3)-17)^2+(x(4)-12)^2))+min(50*sqrt((x(1)-81)^2+(x(2)-63)^2),50*sqrt((x(3)-81)^2+(x(4)-63)^2))+min(8*sqrt((x(1)-19)^2+(x(2)-45)^2),8*sqrt((x(3)-19)^2+(x(4)-45)^2))+min(30*sqrt((x(1)-62)^2+(x(2)-12)^2),30*sqrt((x(3)-62)^2+(x(4)-12)^2));

%蒙特卡罗算法

MIN=inf;

%取一千万组随机数

LIMIT=10000000;

while LIMIT>0

    %生成指定范围内的随机数

    x(1)=82*rand;

    x(2)=82*rand;

    x(3)=82*rand;

    x(4)=82*rand;

    %过滤不符合条件的随机数

    while x(1)>82 | x(1)<0     %| x(2)>81 | x(2)<0 | x

            %再次生成随机数

            x(1)=82*rand;

           % x(2)=(1-0.9397)*rand+0.9397;

    end;

    while x(2)>82 | x(2)<0

        x(2)=82*rand;

    end;

    while x(3)>82 | x(3)<0

        x(3)=82*rand;

    end;

    while x(4)>82 | x(4)<0

        x(4)=82*rand;

    end;

   

    temp=myobjfunc(x);

    if temp<MIN

        MIN=temp;

        y=x;

    end;

    LIMIT=LIMIT-1;

end;

MIN

y

第三问结果:

利用蒙特卡洛算法matlab编程可求

程序多次运行的结果如下:

MIN =

  6.5582e+003

y =

   43.2099   25.0713    3.8432   81.0215

MIN =

  6.5665e+003

y =

    3.9281   81.0393   42.3370   27.9608

MIN =

  6.5583e+003

y =

    4.1848   81.1427   41.9258   25.2987

MIN =

  6.5597e+003

y =

   40.9820   25.7891    3.8891   80.8089

MIN =

  6.5713e+003

y =

   39.3252   23.5597    4.2433   80.8989

MIN =

  6.5511e+003

y =

    4.0086   81.1070   41.8500   25.6334

MIN =

  6.5553e+003

y =

   40.9798   26.6722    4.0593   80.9958

MIN =

  6.5536e+003

y =

   39.8126   24.6946    4.0317   81.0556

由多次运行程序的结果可知:

取其中最小的一次结果即可认为是本题求解答案:

MIN =6.5511e+003

y =4.0086   81.1070   41.8500   25.6334

即总费用最低为6551.1

两个炼油厂的坐标地址分别为(4.0086,81.1070),(41.8500,25.6334

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

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

相关文章

Creo结构设计-弧形实体绘制/两个实体的圆滑连接-轨迹扫描

实际需求&#xff1a; 在很多场景需要建模不同弧度的实体对象&#xff0c;常见的依据横截面进行拉伸操作无法很好的完成&#xff0c;有什么样的操作能够方便完成弧形实体建模&#xff1f; 解决方式&#xff1a; 采用轨迹扫描操作完成 举例1&#xff1a;例如两个垂直的圆柱&…

【OpenCV入门】第一部分——图像处理基础

本文结构 图像处理的基本操作读取图像imread() 显示图像imshow()waitKey()destroyAllWindows() 保存图像imwrite() 获取图像属性 像素确定像素的位置获取像素的BGR值修改像素的BGR值 色彩空间GRAY色彩空间cvtColor()——从BGR色彩空间转换到GRAY色彩空间 HSV色彩空间从BGR色彩空…

根据逻辑分析仪实际波形,解析IIC通信及可能出现的问题(从机控制时钟SCL)

1、通信是信息的传递 1.1、信息 信息是多种多样的&#xff0c;在数字电路中&#xff0c;最基本的信息是高低电平&#xff0c;高低电平的提供需要电路转化的&#xff0c;维持高/低是要消耗能量的&#xff0c;信息需要借助能量来存在。 1.2、传递 从发送端传递到接收端需要媒…

【复杂网络建模】——ER网络和SF网络的阈值分析

目录 1、介绍ER网络和SF网络 2、计算网络阈值 2.1 ER&#xff08;Erdős-Rnyi&#xff09;网络 2.2 SF&#xff08;Scale-Free&#xff09;网络 3、 研究网络阈值的意义 1、介绍ER网络和SF网络 在复杂网络理论中&#xff0c;ER网络&#xff08;Erdős-Rnyi网络&#xff…

C++------map和set的使用

文章目录 关联式容器键值对树型结构的关联式容器set的介绍map的介绍 关联式容器 什么是关联式容器&#xff1f;它与序列式容器有什么区别&#xff1f; 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是<key&#xff0c;value>结…

数据库备份和Shell基础测试及AWK(运维)

第一题&#xff1a;简述一下如何用mysql命令进行备份和恢复&#xff0c;请以test库为例&#xff0c;创建一个备份&#xff0c;并再用此备份恢复备份 备份步骤&#xff1a; 备份test库&#xff1a;使用mysqldump命令备份test库&#xff0c;并将备份写入一个.sql文件中。命令示例…

C语言基础之——结构体

前言&#xff1a;小伙伴们又见面啦&#xff0c;那么本篇文章&#xff0c;我们就将对C语言基础知识的最后一个章节——结构体展开讲解。 世上无难事&#xff0c;只要肯攀登&#xff01; 目录 一.什么是结构体 二.结构体讲解 1.结构体的声明和变量的定义 2.结构体成员的类型…

〖Python网络爬虫实战㉞〗- 图形验证码OCR识别

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;订阅本专栏前必读关于专栏〖Python网络爬虫实战〗转为付费专栏的订阅说明作者&#xff1…

操作系统_文件管理(三)

目录 3. 文件系统 3.1 文件系统结构 3.2 文件系统布局 3.2.1 文件系统在磁盘中的结构 3.2.2 文件系统在内存中的结构 3.3 外存空闲空间管理 3.3.1 空闲表法 3.3.2 空闲链表法 3.3.3 位示图法 3.3.4 成组链接法 3.4 虚拟文件系统 3.5 分区和安装 3.6 小结 3. 文件系…

Javaweb入门

Spring Spring发展到今天已经形成一种开发生态圈&#xff0c;Spring提供若干个子项目&#xff0c;每个项目用于完成特定的功能。 Spring Boot可以帮助我们非常快速的构建应用程序、简化开发、提高效率 SpringBootWeb入门 需求&#xff1a;使用Spring Boot开发一个web应用&a…

不同代码写法的区别

目录 神经网络中输入在layer中写输入在build中写输入 输出format写法f代替format写法 zip不加*加* 打平Flatten方法reshape方法 数据打包(batch)tensorflowpytorch 神经网络中输入 在layer中写输入 layers.Dense(512, activationrelu, namelayer1,input_shape(784,)),此处784…

C语言 实现atoi函数

实现类似atoi函数&#xff0c;把字符串“123456”转换成数值123456 函数int atoi(char *str); 使用ubuntu进行多文件编译&#xff08;main.c head.h test.c&#xff09; head.h&#xff08;预处理&#xff09; #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.…

freertos之信号量

介绍 信号量这个名字很恰当&#xff1a; 信号&#xff1a;起通知作用 量&#xff1a;还可以用来表示资源的数量 当"量"没有限制时&#xff0c;它就是"计数型信号量"(Counting Semaphores) 当"量"只有0、1两个取值时&#xff0c;它就是"二进…

2023必备AIGC人工智能软件Top 6

随着人工智能技术的迅猛发展&#xff0c;越来越多的应用程序开始集成AIGC&#xff08;Artificial Intelligence Generated Content&#xff0c;人工智能生成内容&#xff09;功能&#xff0c;为用户提供更高效、更创造性的体验。在本文中&#xff0c;我们将分享6款实用的AIGC软…

C++ DAY7

一、类模板 建立一个通用的类&#xff0c;其类中的类型不确定&#xff0c;用一个虚拟类型替代 template<typename T> 类template ----->表示开始创建模板 typename -->表明后面的符号是数据类型&#xff0c;typename 也可以用class代替 T ----->表示数据类型…

php开发环境搭建_宝塔、composer

宝塔面板下载&#xff0c;免费全能的服务器运维软件 一 下载宝塔面板 解压安装 登录之后修改安全入口 1 进入软件商店下载nginx,mysql5.6,php7.2 2 将php的安装路径配置到环境变量中 此电脑--右键--点击属性---高级系统设置---环境变量---系统变量path---添加确定 输入php -v…

DC/DC开关电源学习笔记(三)开关频率和储能元件

&#xff08;三&#xff09;开关频率和储能元件 1.开关频率2.储能元件 1.开关频率 频率是开关电源的一个基本属性&#xff0c;它代表了直流电压开启和关断的速率。了解开关频率就可以了解实际应用中电源线路的工作原理。 开关电源利用开关动作将直流电转换为特定频率的脉冲电…

【教程】部署apprtc服务中安装google-cloud-cli组件的问题及解决

前置条件 已经安装完成node&#xff0c;grunt&#xff0c;node 组件和python pip包等。需要安装google-cloud-cli组件。 Ubuntu安装google-cloud-cli组件 apprtc项目运行需要google-cloud-cli前置组件&#xff0c;且运行其中的dev_appserver.py。 根据google官方的关于安装g…

应用于伺服电机控制、 编码器仿真、 电动助力转向、发电机、 汽车运动检测与控制的旋变数字转换器MS5905P

MS5905P 是一款 12bit 分辨率的旋变数字转换器。 片上集成正弦波激励电路&#xff0c;正弦和余弦允许输入峰峰值 幅度为 2.3V 到 4.0V &#xff0c;可编程激励频率为 10kHz 、 12kHz 、 15kHz 、 20kHz 。 转换器可并行或串行输出角度 和速度对应的数字量。 MS5905…