钻井布局[汇总]
钻井布局的数学模型
张强 陈朝旭 张保强
摘要:
本文讨论了在一个区域内按纵横等距的点来布置井位的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
,通过移动网格使旧井利用最多,采用网格遍历求解的方法得到很好的计算精度。最后得到问题1)的解为I=2,4,5,10时的旧井可以利用;问题2)的解为I=时的旧井可以利用。
一 问题重述
勘探部门在某地区找矿。要在一个区域内按纵横等距的网格点来布置井位,进行“撒网式”全面钻探。由于钻一口井的费用很高,如果新
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
的井位与原有井位重合(或相当接近),便可利用旧井,不必打新井。因此应该尽量利用旧井,少打新井,以节约钻探费用。
设平面上有n个点pi,其坐标为(ai,bi),I=1,2,„„,n,
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示以有的n个井位。新布置的井位是一个正方形网格N的所有结点(所谓“正方形网格”是指每个格子都是正方形的网格;结点是指纵线和横线的交叉点)。假定每个格子的边长都是1单位。整个网格是可以在平面上任意移动的。若一个已知点pi与某个网格结点Xi的距离不超过给定误差ε=(0.05单位),则认为pi处的旧井
资料
新概念英语资料下载李居明饿命改运学pdf成本会计期末资料社会工作导论资料工程结算所需资料清单
可用,不必在结点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
=ai&&y1i+nB>=b)则(x1i +mB-1,y1i+nB),(x2i,y2i).
即将新坐标作为pi所在方格的(x2i,y2i)
同理:
如果(x1i+mB>ai&&y1i+nBbi)则(x1i +mB,y1i+nB-1),(x1i,y1i).
如果(x1i+mB ε,Ti=0
4. 计算Nj
n
Nj= j=1,2,…..,m×n Ti,i,1
5. N=max(Nj),同时记下m,n值及Q(mB,nB).
对问题2)
同一坐标系下,将网格N旋转相当于将pi反方向旋转每次
ai*ai,bi*bi旋转的角度c=ε/r,r=max()
所以 c?ε 并且 s*c<=П/2
1. 执行问题1)中1后,以逆时针旋转,旋转后点pi的坐标
ai*ai,bi*bi变为(ai',bi')其中ai'=*cos(arctan(bi/ai)+s*c),
ai*ai,bi*bibi'=*sin(arctan(bi/ai)+s*c)
2. 求旋转后pi所在方格的对角线顶点坐标
如果(ai'>=x1i&&bi'<=y2i),则(x1i,y1i),(x1i,y1i)
如果(ai'y2i),则(x1i-1,y1i+1),(x1i,y1i)
3. 求 Dpixi
d1'=,d2'=(ai',x1i)^2,(bi',y1i)^2(ai',x2i)^2,(bi',y2i)^2
d3'=,d4'=(ai',(x1i,1))^2,(bi',y1i)^2(ai',(x2i,1))^2,(bi',y2i)^2
则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(pi pj)(问
题1)中的距离)。 pi pj:表示移动后旧井位点任意两点的
距离,如果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那么这些旧井都可以重用。
计算机实现流程图如下:
程序入口
井点坐标 数数旧井点数 据据
值值
输显
入 示 井点坐标 处理结果 数据处理
选择是否
需要考虑
旋转可进
行相应处 理
纪录未移动前p[i]所在方格的定点坐标
s,t循环10000
纪录s,t的值 返
回
求出网格移动后pi[I]所在循 过程count具体实
方格的定点坐标环现
s,tx1,y1,x2,y2
继
续
移
动求出p[i]到四个顶点的函数MinD具体实网最短距离MD 现 格
以上是在没有考虑旋转时的流程图,对于考虑旋转时的情况,只需改变一下count过程和MinD函数即可,还需要增加一层循用来考虑旋转90度的情况,解决解决方案与不考虑旋转时大同小异。
用程序解决问题一,我们将运行结果存到文件jieguo.xls中经分析知在我们的精确度范围内最多可以重用井的个数是4个,相应网格的位置是:祥见jieguo.xls。在算法优化的基础上我们还可以对这两个点的周围区域在进行循环查找看看是否有更多的旧井可以重用。
最后我们分析一下我们的算法复杂度,这对于优化算法,提高程序的执行效率是非常重要的。解决问题一时总的运行次数大约是n*10000次,若考虑旋转时运行次数更是庞大的惊人:n*900000,因此程序执行时间是比较长的,大约需要8s左右,分析输出的数据知,很多结果是没用的或者不需要程序循环,因此,我们可以这样优化程序:开始的时候我们的循环步值适当大些,这样可以粗略的找到合适的网格位置,我们再在这个位置上进行细化 最终得到最终最优结果,这样处理我们的程序循环次数会减少到至少0.1倍,同样在考虑旋转的情况下 我们也作这样的处理以便优化程序、提高运行效率、减少运行时间。
运行界面如下图:
附录:
1. 问题1)的源程序: (1)、自定义过程及函数
function MinD(k:integer): real; var
secondD:array[1..4] of real;
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]);
for i:=1 to 3 do
for j:=i+1 to 4 do
begin
if SecondD[i]a then boo1:=true else boo1:=false;
if y>b then Boo2:=true else boo2:=false;
// 求出坐标
if boo1 and boo2 then
begin
x2[k]:=x1[k]; y2[k]:=y1[k];
x1[k]:=x1[k]-1;y1[k]:=y1[k]-1;
end;
if boo1 and not boo2 then
begin
x2[k]:=x1[k]-1;
y2[k]:=y1[k]+1;
end;
if not boo1 and boo2 then
begin
x2[k]:=x1[k]+1;
y2[k]:=y1[k]-1;
end;
end;
procedure TForm1.countK(a:real;b:real;x:real;y:real;k:integer);
var
boo1,boo2:boolean; begin
boo1:=ay;
// 求出坐标
if boo1 and boo2 then
begin
end;
if not boo1 and boo2 then
begin
x2[k]:=x1[k]+1;
y2[k]:=y1[k]+1;
end;
if not boo1 and not boo2 then
begin
x2[k]:=x1[k]+1;
y2[k]:=y1[k]-1;
end;
if boo1 and not boo2 then
begin
x2[k]:=x1[k]-1;
y2[k]:=y1[k]-1;
end;
end;
(2)、变量定义部分
var
Form1: TForm1;
P,P1:array of ar;//存储旧井的坐标
JN:array[1..10000] of ar1; //存储结果
x1,y1,x2,y2:array of real; //存储某个P点所在的方格对角线的俩顶点的坐标
JW:array[1..10000] of string; //不考虑旋转的情况结果
i:integer;
n:integer; //旧井的个数
s,t:integer;//s,t网格移动部数 (3)、程序实现部分
var
k:integer;
MD:real;//存储最短距离
mess:string;
begin
for s:=0 to 99 do
for t:=0 to 99 do
begin
for k:=1 to n do
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);
if MD<0.05 then
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
for k:=1 to n do
for o:=1 to 2 do
P1[k][o]:=P[k][o];
//初始化P1[k][] 用于初始化
for s:=0 to 99 do
for t:=0 to 100 do
begin
for k:=1 to n do//初始化P[k][]
for o:=1 to 2 do
P[k][o]:=P1[k][o];
//旋转90度步长1度
for o:=1 to 89 do
begin
for k:=1 to n do
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]);
if P[k][1]<0 then
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;
if x1[k]<0 then
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);
if MDK<0.05 then
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.36 0.46 2 4 5 10 4个 0.37 0.46 2 4 5 10 4个 0.36 0.47 2 4 5 10 4个 0.37 0.47 2 4 5 10 4个 0.36 0.48 2 4 5 10 4个 0.37 0.48 2 4 5 10 4个 0.36 0.49 2 4 5 10 4个 0.37 0.49 2 4 5 10 4个 0.36 0.5 2 4 5 10 4个 0.37 0.5 2 4 5 10 4个 0.36 0.51 2 4 5 10 4个 0.37 0.51 2 4 5 10 4个 0.36 0.52 2 4 5 10 4个 0.37 0.52 2 4 5 10 4个 0.36 0.53 2 4 5 10 4个 0.37 0.53 2 4 5 10 4个 0.36 0.54 2 4 5 10 4个 0.37 0.54 2 4 5 10 4个 0.36 0.55 2 4 5 10 4个 0.37 0.55 2 4 5 10 4个 0.38 0.46 2 4 5 10 4个 0.39 0.46 2 4 5 10 4个 0.38 0.47 2 4 5 10 4个 0.39 0.47 2 4 5 10 4个 0.38 0.48 2 4 5 10 4个 0.39 0.48 2 4 5 10 4个 0.38 0.49 2 4 5 10 4个 0.39 0.49 2 4 5 10 4个 0.38 0.5 2 4 5 10 4个 0.39 0.5 2 4 5 10 4个 0.38 0.51 2 4 5 10 4个 0.39 0.51 2 4 5 10 4个 0.38 0.52 2 4 5 10 4个 0.39 0.52 2 4 5 10 4个 0.38 0.53 2 4 5 10 4个 0.39 0.53 2 4 5 10 4个 0.38 0.54 2 4 5 10 4个 0.39 0.54 2 4 5 10 4个 0.38 0.55 2 4 5 10 4个 0.39 0.55 2 4 5 10 4个 0.4 0.46 2 4 5 10 4个 0.41 0.46 2 4 5 10 4个 0.4 0.47 2 4 5 10 4个 0.41 0.47 2 4 5 10 4个 0.4 0.48 2 4 5 10 4个 0.41 0.48 2 4 5 10 4个 0.4 0.49 2 4 5 10 4个 0.41 0.49 2 4 5 10 4个 0.4 0.5 2 4 5 10 4个 0.41 0.5 2 4 5 10 4个 0.4 0.51 2 4 5 10 4个 0.41 0.51 2 4 5 10 4个 0.4 0.52 2 4 5 10 4个 0.41 0.52 2 4 5 10 4个 0.4 0.53 2 4 5 10 4个 0.41 0.53 2 4 5 10 4个 0.4 0.54 2 4 5 10 4个 0.41 0.54 2 4 5 10 4个 0.4 0.55 2 4 5 10 4个 0.41 0.55 2 4 5 10
4个 0.42 0.46 2 4 5 10 4个 0.42 0.51 2 4 5 10 4个 0.42 0.47 2 4 5 10 4个 0.42 0.52 2 4 5 10 4个 0.42 0.48 2 4 5 10 4个 0.42 0.53 2 4 5 10 4个 0.42 0.49 2 4 5 10 4个 0.42 0.54 2 4 5 10 4个 0.42 0.5 2 4 5 10 4个 0.42 0.55 2 4 5 10
4. 问题2)的计算结果:(由于时间原因暂未给出具体结果)