钻井布局.docx
- 文档编号:2128677
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:20
- 大小:213.20KB
钻井布局.docx
《钻井布局.docx》由会员分享,可在线阅读,更多相关《钻井布局.docx(20页珍藏版)》请在冰点文库上搜索。
钻井布局
钻井布局的数学模型
张强陈朝旭张保强
摘要:
本文讨论了在一个区域内按纵横等距的点来布置井位的问题,通过移动网格使旧井利用最多,采用网格遍历求解的方法得到很好的计算精度。
最后得到问题1)的解为I=2,4,5,10时的旧井可以利用;问题2)的解为I=时的旧井可以利用。
一问题重述
勘探部门在某地区找矿。
要在一个区域内按纵横等距的网格点来布置井位,进行“撒网式”全面钻探。
由于钻一口井的费用很高,如果新设计的井位与原有井位重合(或相当接近),便可利用旧井,不必打新井。
因此应该尽量利用旧井,少打新井,以节约钻探费用。
设平面上有n个点pi,其坐标为(ai,bi),I=1,2,……,n,表示以有的n个井位。
新布置的井位是一个正方形网格N的所有结点(所谓“正方形网格”是指每个格子都是正方形的网格;结点是指纵线和横线的交叉点)。
假定每个格子的边长都是1单位。
整个网格是可以在平面上任意移动的。
若一个已知点pi与某个网格结点Xi的距离不超过给定误差ε=(0.05单位),则认为pi处的旧井资料可用,不必在结点Xi处打新井。
为进行辅助决策,勘探部门要求我们研究以下问题:
1)假定网格的横向和纵向是固定的(比如东西南北),并规定两点间的距离为其横向距离(横坐标之差绝对值)及纵向距离(纵坐标之差绝对值)的最大值。
在平面上平行移动网格N,使可利用的旧井数尽可能大。
试提供数值计算方法,并对下面的数值例子用计算机进行计算。
2)在欧氏距离的误差意义下,考虑网格的横向和纵向不固定(可以旋转)的情形,给出算法及计算结果。
3)如果有n口旧井,给出判定这些井均可利用的条件和算法(你可以任意选定一种距离)。
数值例子n=12个点的坐标如下表所示:
i
1
2
3
4
5
6
7
8
9
10
11
12
ai
0.50
1.41
3.00
3.37
3.40
4.72
4.72
5.43
7.57
8.38
8.98
9.50
bi
2.00
3.50
1.50
3.51
5.50
2.00
6.24
4.10
2.01
4.50
3.41
0.80
二基本假设
1)正方形网格N可以覆盖n个井位;
2)每个格子的边长为1;
3)旧井位点pi(ai,bi)初始坐标位于第一象限,网格N可以任意移动;
4)把旧井位点看作质点;初始位置网格的某条横县和纵线与坐标轴重合,并记交点Q与原点O重合
三相关变量及其说明
1)pi(ai,bi)I=1,2,……,n:
旧井位点的坐标;
2)Dpixi:
pi到结点xi的距离;
3)ε:
误差;
4)(x1i,y1i),(x2i,y2i):
pi所在方格对角线顶点坐标;(x1i 5)B: 网格每次移动的步长C: 每次旋转的角度; 6)m,n: 横向与纵向移动的次数(横向向右,纵向向上); 7)s: 旋转的次数(逆时针); 8)Q(p,q): 变化后Q点的坐标; 9)如果第pi个旧井可利用;否则Ti=1则Ti=0; 10)Nj= : 第j个位置可利用旧井的总数; 如果平移,则j=1,2,……mxn; 如果旋转,则j=1,2,……mxnxs; 四模型的建立 对问题1) 1计算移动后pi所在方格对角线顶点坐标,移动后,原对角线顶点坐标变为(x1i+m.B,y1i+n.B),(x2i+n.B,y2i+n.B)(其中: m.B,n.B<=1); 如果(x1i+mB>=ai&&y1i+nB>=b)则(x1i+mB-1,y1i+nB)(x2i,y2i).即将新坐标作为pi所在方格的(x2i,y2i) 同理: 如果(x1i+mB>ai&&y1i+nB 如果(x1i+mB 如果(x1i+mB 2.求Dpixi.令d1=|x1i-ai|,d2=|ai-x2i|,d3=|y1i-bi|,d4=|bi-y2i|. 则Dpixi=mc(d1,d2,d3,d4)mc(di)指di中次小的. 3.判断误差并确定pi是否可用 如果Dpixi<=ε,Ti=1 如果Dpixi>ε,Ti=0 4.计算Nj Nj= j=1,2,…..,m×n 5.N=max(Nj),同时记下m,n值及Q(mB,nB). 对问题2) 同一坐标系下,将网格N旋转相当于将pi反方向旋转每次旋转的角度c=ε/r,r=max( ) 所以c≈ε并且s*c<=П/2 1.执行问题1)中1后,以逆时针旋转,旋转后点pi的坐标变为(ai',bi')其中ai'= *cos(arctan(bi/ai)+s*c), bi'= *sin(arctan(bi/ai)+s*c) 2.求旋转后pi所在方格的对角线顶点坐标 如果(ai'>=x1i&&bi'<=y2i),则(x1i,y1i)(x1i,y1i) 如果(ai' 如果(ai' 3.求Dpixi d1'= d2'= d3'= d4'= 则Dpixi=min(d1',d2',d3',d4') 4.执行问题1)的3,4,5 五.计算与结果 计算过程中取B=c=ε=0.05 用计算机编程求得问题1),2)的解见附录 六.对问题3的讨论 1.根据题意,n口旧井均可利用的条件是由n口旧井的位置决定的,也就是说,n口旧井在满足一定位置关系的条件下都是可以重用的。 我们要计算的就是这种关系。 2.如果旧井pi(ai,bi)可利用,则pi'(ai+m,bi+n)也可利用。 由此,可把所有的旧井位点移到某个点的周围。 令d=max(pipj)(问题1)中的距离)。 pipj: 表示移动后旧井位点任意两点的距离,如果d<=2ε则满足条件,即n口旧井均可利用。 3.对具体坐标取值得讨论。 我们考虑将所有的旧井点移动到点(1,1)周围。 现假设旧井点坐标的小数部分是(xi,yi),现在分4种情况对旧井点坐标移动到点(1,1)的周围后新坐标的值进行讨论。 (1)、xi>=0.5并且yi>=0.5那么新坐标是(xi,yi)(xi,yi); (2)、xi<0.5并且yi>=0.5那么新坐标是(xi+1,yi)(xi,yi); (3)、xi>=0.5并且yi<0.5那么新坐标是(xi,yi+1)(xi,yi); (4)、xi<0.5并且yi<0.5那么新坐标是(xi+1,yi+1)(xi,yi); 4.接下来要求pipj的最大距离d(问题1)中的距离)。 令U1=min(xi),U2=max(xi); V1=min(yi),V2=max(yi);(I=1,2,……,n)则d=max(U2-U1,V2-V1) 由此可得所有旧井均可利用的条件: d<=2ε。 七.模型的推广及应用 该问题所采用的模型可用于一般的网格计算问题,所采用的算法在遍历求解方面有很好的精度要求,应用范围很广。 八、井布局算法实现: 我们研究的问题是: 已知旧井的位置确定可以重用旧井的最多的个数,假设有一网格可以在井分布的区域移动,这样只要旧井与网格的某个节点距离<=0.05那么认为这口旧井是可以重用的,具体计算机实现时我们考虑到网格的每个小方格是全等的,这样我们在移动网格时只需整体上下移动1单位即可,另外我们是以一个参考点Q(开始在原点)在一单位的小方格中移动来处理的。 移动步长我们设定为0.01,即共要移动100*100次。 在第二问,考虑旋转的情况下,便于计算,我们移动的是原来的旧井而不是方格这样便于处理,同时在第一问的基础上每移动一次我们都要对原来的旧井点坐标逆时针旋转90度(我们步长暂设定为1度,根据计算机实现情况,当步长1都时运行时间已达到15分钟左右),计算可以重用的旧井的个数。 到了第三问,我们还是考虑到网格的全等对称性,考虑将所有的旧井移动到近量小的范围,我们用逆向思维考虑: 将网格方在适当的位置,如果旧井都可以重用的话,一定可以将这些井的横纵坐标加上m,n单位(n,m可以小于零)将所有的旧井移动到某个节点的周围,并且新位置井位与这个节点的距离<=0.05。 这样只要将原来的节点移动到点(1,1)周围,做一个尽量小且能包围所有新位置井位的圆,如果圆的直径<=2*0.05那么这些旧井都可以重用。 计算机实现流程图如下: 以上是在没有考虑旋转时的流程图,对于考虑旋转时的情况,只需改变一下count过程和MinD函数即可,还需要增加一层循用来考虑旋转90度的情况,解决解决方案与不考虑旋转时大同小异。 用程序解决问题一,我们将运行结果存到文件jieguo.xls中经分析知在我们的精确度范围内最多可以重用井的个数是4个,相应网格的位置是: 祥见jieguo.xls。 在算法优化的基础上我们还可以对这两个点的周围区域在进行循环查找看看是否有更多的旧井可以重用。 最后我们分析一下我们的算法复杂度,这对于优化算法,提高程序的执行效率是非常重要的。 解决问题一时总的运行次数大约是n*10000次,若考虑旋转时运行次数更是庞大的惊人: n*900000,因此程序执行时间是比较长的,大约需要8s左右,分析输出的数据知,很多结果是没用的或者不需要程序循环,因此,我们可以这样优化程序: 开始的时候我们的循环步值适当大些,这样可以粗略的找到合适的网格位置,我们再在这个位置上进行细化 最终得到最终最优结果,这样处理我们的程序循环次数会减少到至少0.1倍,同样在考虑旋转的情况下我们也作这样的处理以便优化程序、提高运行效率、减少运行时间。 运行界面如下图: 附录: 1.问题1)的源程序: (1)、自定义过程及函数 functionMinD(k: integer): real; var secondD: array[1..4]ofreal; i,j: integer; L: real;//做交换中间变量 begin ////求的P[i]点与所在方框四个点即距离 SecondD[1]: =abs(x1[k]-P[k][1]);SecondD[2]: =abs(y1[k]-P[k][2]); SecondD[3]: =abs(x2[k]-p[k][1]);SecondD[4]: =abs(y2[k]-P[k][2]); fori: =1to3do forj: =i+1to4do begin ifSecondD[i] begin L: =SecondD[i]; SecondD[i]: =SecondD[j]; SecondD[j]: =L; end; end; result: =SecondD[3]; end; functionMinDK(k: integer): real; var secondD: array[1..4]ofreal;//存储四个点的即距离 i,j: integer; L: real; begin ////求的P[i]点与所在方框四个点即距离 SecondD[1]: =sqrt((P[k][1]-x1[k])*(P[k][1]-x1[k])+(P[k][2]-y1[k])*(P[k][2]-y1[k])); SecondD[2]: =sqrt((P[k][1]-x1[k])*(P[k][1]-x1[k])+(P[k][2]-y2[k])*(P[k][2]-y2[k])); SecondD[3]: =sqrt((P[k][1]-x2[k])*(P[k][1]-x2[k])+(P[k][2]-y1[k])*(P[k][2]-y1[k])); SecondD[4]: =sqrt((P[k][1]-x2[k])*(P[k][1]-x2[k])+(P[k][2]-y2[k])*(P[k][2]-y2[k])); //对距离进行排序,同时返回最小值 fori: =1to3do forj: =1to4do begin ifSecondD[i] begin l: =SecondD[i]; SecondD[i]: =SecondD[j]; SecondD[j]: =L; end; end; result: =SecondD[3]; end; procedureTForm1.count(a: real;b: real;x: real;y: real;k: integer); var boo1,boo2: boolean; begin ifx>athenboo1: =trueelseboo1: =false; ify>bthenBoo2: =trueelseboo2: =false; //求出坐标 ifboo1andboo2then begin x2[k]: =x1[k];y2[k]: =y1[k]; x1[k]: =x1[k]-1;y1[k]: =y1[k]-1; end; ifboo1andnotboo2then begin x2[k]: =x1[k]-1; y2[k]: =y1[k]+1; end; ifnotboo1andboo2then begin x2[k]: =x1[k]+1; y2[k]: =y1[k]-1; end; end; procedureTForm1.countK(a: real;b: real;x: real;y: real;k: integer); var boo1,boo2: boolean; begin boo1: =a =b>y; //求出坐标 ifboo1andboo2then begin end; ifnotboo1andboo2then begin x2[k]: =x1[k]+1; y2[k]: =y1[k]+1; end; ifnotboo1andnotboo2then begin x2[k]: =x1[k]+1; y2[k]: =y1[k]-1; end; ifboo1andnotboo2then begin x2[k]: =x1[k]-1; y2[k]: =y1[k]-1; end; end; (2)、变量定义部分 var Form1: TForm1; P,P1: arrayofar;//存储旧井的坐标 JN: array[1..10000]ofar1;//存储结果 x1,y1,x2,y2: arrayofreal;//存储某个P点所在的方格对角线的俩顶点的坐标 JW: array[1..10000]ofstring;//不考虑旋转的情况结果 i: integer; n: integer;//旧井的个数 s,t: integer;//s,t网格移动部数 (3)、程序实现部分 var k: integer; MD: real;//存储最短距离 mess: string; begin fors: =0to99do fort: =0to99do begin fork: =1tondo begin x1[k]: =int(P[k][1]); y1[k]: =int(P[k][2]); x2[k]: =x1[k]+1+0.01*s; y2[k]: =y1[k]+1+0.01*t; x1[k]: =x1[k]+0.01*s; y1[k]: =y1[k]+0.01*t; count(P[k][1],P[k][2],x1[k],y1[k],k);//求得[i]所在的方格的对郊县的两顶点的坐标 MD: =MinD(k); ifMD<0.05then begin JN[s*100+t+1][1]: =JN[s*100+t+1][1]+1;//如果最小距离小与0.05那么可用井的个数JN[s*t+1][1]加1; JW[s*100+t+1]: =JW[s*100+t+1]+''+inttostr(k); end; end; JN[s*100+t+1][2]: =s; JN[s*100+t+1][3]: =t; mess: =floattostr(JN[s*100+t+1][1])+'个'+char(9)+floattostr(JN[s*100+t+1][2]*0.01)+char(9)+floattostr(JN[s*100+t+1][3]*0.01)+char(9)+JW[s*100+t+1]; memo1.Lines.Add(mess); end; 2.问题2)的源程序: var k,o: integer;//k,循环n次计算n各界点;o循环90次 MDk: real;//存储最短距离 mess: string; f_x,f_y,bi: real; begin fork: =1tondo foro: =1to2do P1[k][o]: =P[k][o]; //初始化P1[k][]用于初始化 fors: =0to99do fort: =0to100do begin fork: =1tondo//初始化P[k][] foro: =1to2do P[k][o]: =P1[k][o]; //旋转90度步长1度 foro: =1to89do begin fork: =1tondo begin bi: =p[k][2]/p[k][1]; f_x: =p[k][1]*p[k][1]; f_y: =p[k][2]*p[k][2]; p[k][1]: =sqrt(f_x+f_y)*cos(ArcTan(bi)+(pi*o)/90); p[k][2]: =sqrt(f_x+f_y)*sin(ArcTan(bi)+(pi*o)/90);//坐标旋转后坐标值大小 x1[k]: =int(P[k][1]); y1[k]: =int(P[k][2]); ifP[k][1]<0then begin x2[k]: =x1[k]-1+0.01*s; x1[k]: =x1[k]+0.01*s; end else begin x2[k]: =x1[k]+1+0.01*s; x1[k]: =x1[k]+0.01*s; end; y2[k]: =y1[k]+1+0.01*t; y1[k]: =y1[k]+0.01*t; ifx1[k]<0then begin countK(P[k][1],P[k][2],x1[k],y1[k],k);//求得[i]所在的方格的对郊县的两顶点的坐标 end else begin countK(P[k][1],P[k][2],x1[k],y1[k],k); end; MDK: =MinDK(k); ifMDK<0.05then JN[s*100+t+1][1]: =JN[s*100+t+1][1]+1;//如果最小距离小与0.05那么可用井的个数JN[s*t+1][1]加1; JW2[s*100+t+1][2]: =JW2[s*100+t+1][2]+inttostr(k); end; JN[s*100+t+1][2]: =s; JN[s*100+t+1][3]: =t; JW2[s*100+t+1][1]: =inttostr(o); mess: =floattostr(JN[s*100+t+1][1])+'个'+char(9)+floattostr(JN[s*100+t+1][2]*0.01)+char(9)+floattostr(JN[s*100+t+1][3]*0.01)+char(9)+JW2[s*100+t+1][1]+char(9)+JW2[s*100+t+1][2]; memo1.Lines.Add(mess); end; end; 3.问题1)的计算结果: (仅列出符合提议数据) 4个0.360.4624510 4个0.360.4724510 4个0.360.4824510 4个0.360.4924510 4个0.360.524510 4个0.360.5124510 4个0.360.5224510 4个0.360.5324510 4个0.360.5424510 4个0.360.5524510 4个0.380.4624510 4个0.380.4724510 4个0.380.4824510 4个0.380.4924510 4个0.380.524510 4个0.380.5124510 4个0.380.5224510 4个0.380.5324510 4个0.380.5424510 4个0.380.5524510 4个0.40.4624510 4个0.40.4724510 4个0.40.4824510 4个0.40.4924510 4个0.40.524510 4个0.40.5124510 4个0.40.5224510 4个0.40.5324510 4个0.40.5424510 4个0.40.5524510 4个0.420.4624510 4个0.420.4724510 4个0.420.4824510 4个0.420.4924510 4个0.420.524510 4个0.370.4624510 4个0.370.4724510 4个0.370.4824510 4个0.370.4924510 4个0.370.524510 4个0.370.5124510 4个0.370.5224510 4个0.370.5324510 4个0.370.5424510 4个0.370.5524510 4个0.390.4624510 4个0.390.4724510 4个0.390.4824510 4个0.390.4924
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 钻井 布局
![提示](https://static.bingdoc.com/images/bang_tan.gif)