java 多個一元分段行駛時間函式合併成一個分段行駛時間函式
阿新 • • 發佈:2018-10-31
多個f分段行駛時間函式合併需要注意的是一個節點的到達時間即為該點的出發時間。
分段函式的建構函式如下
這裡寫程式碼片
public class FunctionUnit {
private double k,b;
double XStart,XEnd;
public FunctionUnit(double k,double b,double XStart,double XEnd){
this.k=k;
this.b=b;
this.XStart=XStart;
this.XEnd=XEnd;
}
public double getB() {
return b;
}
public void setB(double b) {
this.b = b;
}
public double getXEnd() {
return XEnd;
}
public void setXEnd(double xEnd) {
XEnd = xEnd;
}
public double getK() {
return k;
}
public void setK(double k) {
this.k = k;
}
public double getXStart() {
return XStart;
}
public void setXStart(double xStart) {
XStart = xStart;
}
}
多個行駛時間函式合併程式碼如下:
這裡寫程式碼片
public class MergeFunction {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<List<FunctionUnit>> fun=new ArrayList<List<FunctionUnit>>();//多個分段函式集合
List<FunctionUnit> funnew=new ArrayList<FunctionUnit>();
for(int s=0;s<(fun.size()-1);s++){
for(int i=0;i<fun.get(s).size();i++){//迴圈第s個分段函式
double k1=fun.get(s).get(i).getK();
double b1=fun.get(s).get(i).getB();
double startX1=fun.get(s).get(i).getXStart();
double tem=startX1;
double endX1=fun.get(s).get(i).getXEnd();
double y1=startX1*k1+b1+startX1;//startX1時刻出發的到達時間
double y2=endX1*k1+b1+endX1;//endX1時刻出發的到達時間
for(int j=0;j<fun.get(s+1).size();j++){//迴圈第s+1個分段函式
double k2=fun.get(s+1).get(j).getK();
double b2=fun.get(s+1).get(j).getB();
double startX2=fun.get(s+1).get(j).getXStart();
double endX2=fun.get(s+1).get(j).getXEnd();
//判斷s+1的分段函式的第j個函式的分段區間與【y1,y2】的關係。
if(startX2<y1&&y1<endX2&&endX2<=y2){//[startX2,endX2]的後部分與[y1,y2]相交
double k=k2*k1+k1+k2;//兩個函式合併和新函式的斜率
double b=k2*b1+b2+b1;//兩個函式合併和新函式的截距
double startX=tem;//兩個函式合併和新函式的起始區間值
double endX=0;
//比較endX2與y2,如果兩個值相等,說明新函式的終止區間的值為endX1,否則終止區間的值為endX2對應s分段函式的第i個函式的x值
if(endX2==y2){
endX=endX1;//兩個函式合併和新函式的終止區間值
}else{
endX=(endX2-b1)/k1;//endX2對應s分段函式的第i個函式的x值為兩個函式合併和新函式的終止區間值
}
tem=endX;
FunctionUnit Fc=new FunctionUnit(k,b,startX,endX);//將新生成的每個值新增到Fc中
funnew.add(Fc);
}else if(startX2<=y1&&endX2<=y2){//[startX2,endX2]在[y1,y2]內
double k=k2*k1+k1+k2;
double b=k2*b1+b2+b1;
double startX=0;
//比較startX2與y1,如果兩個值相等,說明新函式的起始區間的值為tem,否則起始區間的值為startX2對應s分段函式的第i個函式的x值
if(startX2==y1){
startX=tem;
}else{
startX=(startX2-b1)/k1;//startX2對應s分段函式的第i個函式的x值
}
double endX=0;
if(endX2==y2){
endX=endX1;
}else{
endX=(endX2-b1)/k1;//endX2對應s分段函式的第i個函式的x值
}
tem=endX;
FunctionUnit Fc=new FunctionUnit(k,b,startX,endX);
funnew.add(Fc);
}else if(startX2>=y1&&startX2<y2&&endX2>y2){//[startX2,endX2]的前部分與[y1,y2]相交
double k=k2*k1+k1+k2;
double b=k2*b1+b2+b1;
double startX=0;
if(startX2==y1){
startX=tem;
}else{
startX=(startX2-b1)/k1;
}
double endX=endX1;
tem=endX;
FunctionUnit Fc=new FunctionUnit(k,b,startX,endX);
funnew.add(Fc);
}else if(startX2<y1&&endX2>y2){//[startX2,endX2]包含[y1,y2]
double k=k2*k1+k1+k2;
double b=k2*b1+b2+b1;
double startX=tem;
double endX=endX1;
tem=endX;
FunctionUnit Fc=new FunctionUnit(k,b,startX,endX);
funnew.add(Fc);
}
}
}
fun.set(s+1, funnew);//將原來s+1的分段函式用新合成的分段函式替換
}
}
}