【数学建模】建筑工地开工问题

2024-04-18 21:20

本文主要是介绍【数学建模】建筑工地开工问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:
某公司有 6 6 6个建筑工地要开工,每个工地的位置(用平面坐标 ( a , b ) (a,b) (a,b)表示,距离单位: k m km km)及水泥日用量 d ( 单位 : t ) d(单位:t) d(单位:t)由下表给出,目前有两个临时料场位于 P ( 5 , 1 ) , Q ( 2 , 7 ) P(5,1),Q(2,7) P(5,1)Q(2,7),日储量各有 20 t 20t 20t

工地123456
a1.258.750.55.7537.25
b1.250.754.7556.57.75
d3547611

研究下列问题:

  • 1)假设从料场到工地之间均有直线道路相连,试制定每天的供应计划,即从每个料场分别向各工地运送多少吨水泥,使总的吨公里数最小。
    • 如果工地到工地之间也有道路连接
  • 2)为了进一步减少吨公里数,打算舍弃目前的两个临时料场,改建两个新的临时料场日储量还是20t,给出新料场的位置。

1)假设从料场到工地之间均有直线道路相连,试制定每天的供应计划,即从每个料场分别向各工地运送多少吨水泥,使总的吨公里数最小。

首先我们要知道吨公里数是什么:
设运送水泥为 x x x吨,运送了 y y y公里,那么吨公里数就是 x y xy xy

所以我们可以设每次运输水泥为 x i x_i xi吨,运送了 y i y_i yi公里,那么总的吨公里数最小模型就是
min ⁡ ∑ i ∈ N ( x i y i ) \min{\sum_{ i\in N }(x_iy_i)} miniN(xiyi)

建立供应条件模型:
设料场 i i i到工地 j j j的运输量为 X i j X_{ij} Xij
则所有料场向某工地运输量之和大于等于该工地水泥日用量 d i d_i di
∑ j ∈ N X i j > = d i , i ∈ N \sum_{ j\in N }X_{ij} >= d_i, i\in N jNXij>=di,iN
且某料场对所有工地运算量之和不得超过料场的日储量 e j e_j ej:
∑ i ∈ N X i j ≤ e j , j ∈ N \sum_{ i\in N }X_{ij} \le e_j, j\in N iNXijej,jN

最后建立料场和工地距离模型:
设料场 P ( x , y ) P(x,y) P(x,y)到工地 A ( a , b ) A(a,b) A(a,b)的运输量为 d i s P A dis_{PA} disPA
则: d i s P A = ( x − a ) 2 + ( y − b ) 2 dis_{PA} = \sqrt{(x-a)^2+(y-b)^2} disPA=(xa)2+(yb)2

已知有6个工地和2个料场
将料场和工地距离模型和供应条件模型带入吨公里数最小模型可得:
a n s = min ⁡ ∑ i ∈ N ( X i j d i s i j ) , j = 1 , 2 ans = \min{\sum_{ i\in N }(X_{ij}dis_{ij})},j=1,2 ans=miniN(Xijdisij),j=1,2
或者
a n s = min ⁡ ∑ j = 1 , 2 ∑ i ∈ N , i < = 6 ( X i j d i s i j ) ans = \min{\sum_{j=1,2 }\sum_{ i\in N ,i<=6 }(X_{ij}dis_{ij})} ans=minj=1,2iN,i<=6(Xijdisij)

建模后带入已知进行LINGO求解:

sets:aa/1..6/:a,b,d;bb/1..2/:e,x,y;cc(aa,bb):k;
endsets
data:a = 1.25,8.75,0.5,5.75,3,7.25;b = 1.25,0.75,4.75,5,6.5,7.75;d = 3,5,4,7,6,11;e = 20,20;x = 5,2;y = 1,7;
enddata
min = @sum(cc(i,j):k(i,j)*@sqrt((a(i)-x(j))^2 + (b(i)-y(j))^2));
@for(aa(i):@sum(bb(j):k(i,j))=d(i));
@for(bb(j):@sum(aa(i):k(i,j))<=e(j));

解出:

Objective value:                              136.2275K( 1, 1)        3.000000            0.000000K( 1, 2)        0.000000            3.852207K( 2, 1)        5.000000            0.000000K( 2, 2)        0.000000            7.252685K( 3, 1)        0.000000            1.341700K( 3, 2)        4.000000            0.000000K( 4, 1)        7.000000            0.000000K( 4, 2)        0.000000            1.992119K( 5, 1)        0.000000            2.922492K( 5, 2)        6.000000            0.000000K( 6, 1)        1.000000            0.000000K( 6, 2)        10.00000            0.000000

如果工地到工地之间也有道路连接

假设每个工地都是一个点,那么这个点送进的水泥数量 i n i in_i ini和送出的水泥数量 o u t i out_i outi需要满足 i n i − o u t i > = d i in_i - out_i >= d_i iniouti>=di d i d_i di为该点水泥日用量
如果把料场也算进去,那么就需要设料场的 d d d为0即可,即料场可以不留任何水泥

将所有的道路编号 z = 1 , 2 , 3 , 4... z=1,2,3,4... z=1,2,3,4...,设改道路

编程求解
思路1:
化成图 , 遍历每个工厂,找到工厂到料场的最短距离(bfs),用这个最短距离替换料场和工地距离再带入上面问题模型求解即可:
C++:

#include <iostream>
#include <cmath>
#include <queue>
using namespace  std;
double a[10] = {0, 1.25,8.75,0.5,5.75,3,7.25,5,2},b[10] = {0, 1.25,0.75,4.75,5,6.5,7.75,1,7};
double px = 5 , py = 1;
double qx = 2 , qy = 7;
double dis[10][10];
double min_dis[10]; // p
double min_dis2[10]; // qvoid bfs(int begin){queue<int>q;q.push(begin);while(!q.empty()){int x = q.front();q.pop();for(int i=1;i<=8;i++){if(begin == 7){if(min_dis[i] > min_dis[x] + dis[x][i]){min_dis[i] = min_dis[x] + dis[x][i];q.push(i);}}else{if(min_dis2[i] > min_dis2[x] + dis[x][i]){min_dis2[i] = min_dis2[x] + dis[x][i];q.push(i);}}}}
}int main() {//init disfor(int i=1;i<=8;i++){for(int j=i+1;j<=8;j++){dis[i][j] = dis[j][i] = sqrt((a[i]-a[j]) * (a[i]-a[j])+  (b[i]-b[j])*(b[i]-b[j])); // 初始化距离}}for(int i=1;i<=6;i++)min_dis[i] = min_dis2[i] = 0x3f3f3f3f; // max setmin_dis[7] = min_dis2[8] = 0;bfs(7); // pbfs(8); // qfor(int i=1;i<=6;i++){cout << min_dis[i] << ' ';}cout << '\n';for(int i=1;i<=6;i++){cout << min_dis2[i] << ' ';}cout << '\n';return 0;
}

求解得

3.75832 3.75832 5.85769 4.06971 5.85235 7.11512
5.79871 9.19918 2.70416 4.25 1.11803 5.3033

或者:

for(int i=1;i<=6;i++){cout << min_dis[i] << ',';cout << min_dis2[i] << ',';}

求解得

3.75832,5.79871,3.75832,9.19918,5.85769,2.70416,4.06971,4.25,5.85235,1.11803,7.11512,5.3033,
sets:aa/1..6/:d;bb/1..2/:e;cc(bb,aa):k,dis;
endsets
data:d = 3,5,4,7,6,11;e = 20,20;dis= 3.75832,3.75832,5.85769,4.06971,5.85235,7.11512,5.79871,9.19918,2.70416,4.25,1.11803,5.3033;
enddata
min = @sum(cc(i,j):k(i,j)*dis(i,j));
@for(aa(i):@sum(bb(j):k(j,i))=d(i));
@for(bb(j):@sum(aa(i):k(j,i))<=e(j));
Objective value:                              136.2275Infeasibilities:                              0.000000

2)为了进一步减少吨公里数,打算舍弃目前的两个临时料场,改建两个新的临时料场日储量还是20t,给出新料场的位置。

直接用第一问的模型:
a n s = min ⁡ ∑ j = 1 , 2 ∑ i ∈ N , i < = 6 ( X i j d i s i j ) ans = \min{\sum_{j=1,2 }\sum_{ i\in N ,i<=6 }(X_{ij}dis_{ij})} ans=minj=1,2iN,i<=6(Xijdisij)
设新料场坐标为 P ( x 1 , y 2 ) P(x_1,y_2) P(x1,y2) Q ( x 2 , y 2 ) Q(x_2,y_2) Q(x2,y2)
则:
a n s = min ⁡ ∑ j = 1 , 2 ∑ i ∈ N , i < = 6 X i j ( x j − a i ) 2 + ( y j − b i ) 2 ans = \min{\sum_{j=1,2 }\sum_{ i\in N ,i<=6 }X_{ij} \sqrt{(x_j-a_i)^2+(y_j-b_i)^2}} ans=minj=1,2iN,i<=6Xij(xjai)2+(yjbi)2

如果直接带入LINGO求解,实际上就是问题一的答案去掉 x , y x,y x,y的复制

sets:aa/1..6/:a,b,d;bb/1..2/:e,x,y;cc(aa,bb):k;
endsets
data:a = 1.25,8.75,0.5,5.75,3,7.25;b = 1.25,0.75,4.75,5,6.5,7.75;d = 3,5,4,7,6,11;e = 20,20;!x = 5,2;!y = 1,7;
enddata
min = @sum(cc(i,j):k(i,j)*@sqrt((a(i)-x(j))^2 + (b(i)-y(j))^2));
@for(aa(i):@sum(bb(j):k(i,j))=d(i));
@for(bb(j):@sum(aa(i):k(i,j))<=e(j));

如果赋初值给 x , y x,y x,y

sets:aa/1..6/:a,b,d;bb/1..2/:e,x,y;cc(aa,bb):k;
endsets
data:a = 1.25,8.75,0.5,5.75,3,7.25;b = 1.25,0.75,4.75,5,6.5,7.75;d = 3,5,4,7,6,11;e = 20,20;enddata
init:x = 5,2;y = 1,7;
endinit
min = @sum(cc(i,j):k(i,j)*@sqrt((a(i)-x(j))^2 + (b(i)-y(j))^2));
@for(aa(i):@sum(bb(j):k(i,j))=d(i));
@for(bb(j):@sum(aa(i):k(i,j))<=e(j));

MATLAB求解看数学规划模型(2)-非线性规划

这篇关于【数学建模】建筑工地开工问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/915866

相关文章

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原