文章标题

来源:互联网 发布:win10优化不了怎么办 编辑:程序博客网 时间:2024/06/05 14:27

借鉴二分法的思想,提出了一种近似计算曲线外一点到曲线的最短距离的算法,我们将其命名为ILS算法。其具体步骤如下:

算法 ILS Algorithm
算法输入:待求解的点 equation.pdf,曲线 equation_1.pdf,循环次数 equation_2.pdf。
步骤一:取曲线上的点 equation_3.pdf。
步骤二:记 equation_4.pdf 中横坐标较小的一点为 equation_5.pdf,较大的一点为 equation_6.pdf,并检验equation_7.pdf 是否为真。如果为真,则停止算法,输出 equation_8.pdf 三条线段中最短的线段的长度;若为假,则继续算法。
步骤三:记 equation_9.pdf,判断equation_10.pdf 是否成立。若成立,则记点 equation_11.pdf 为新点 equation_12.pdf,新点 equation_13.pdf 的横坐标为点 equation_14.pdf 与点 equation_15.pdf 的横坐标的算术平均数,且新点 equation_16.pdf 仍在曲线上;若不成立,首先判断 equation_17.pdf是否成立,若表达式成立,则结束算法,输出 equation_18.pdf 的长度,否则,记点 equation_19.pdf 为新点 equation_20.pdf,新点 equation_13.pdf 的横坐标为点 equation_14.pdf 与点 equation_15.pdf 的横坐标的算术平均数,且新点 equation_16.pdf 仍在曲线上。
步骤四:如果步骤循环次数还未达到 equation_21.pdf,则返回步骤二,否则输出 equation_8.pdf 三条线段中最短的线段的长度

该算法的核心是二分逼近,而逼近的过程已经在算法中阐明,只要能无限逼近甚至达到切点,则方法成功。该算法可以较为便捷的在计算机上实现,在计算点到曲线的距离时有不错的效果。
实现该算法的R语言代码如下:

# 1.xls是附件一表格# 22.xlsx是经过处理的附件二表格library(xlsx)phi <- 0.05 workspace1 <- "1.xls"mydata1 <- read.xlsx(workspace1,1)workspace2 <- "22.xlsx"mydata2 <- read.xlsx(workspace2,1)F <- function (arg1,arg2,arg3,arg4){  phi <- 0.02   if ( ( ( arg1 - arg3 ) * (arg1 - arg3) + (arg2 - arg4) * (arg2 - arg4) ) <= phi * phi)   {        return(1);   }   else   {      return(0);   }}posx_mission <- mydata1$经度posy_mission <- mydata1$纬度posy_people  <- mydata2$经纬度posx_people  <- mydata2$预订任务限额price <- mydata1$任务标价print(posx_mission[1])print(posy_mission[1])print(posx_people[1])print(posy_people[1])N <- rep(0,length(posx_mission))for (index in 1:length(N) ){   for (i in 1:length(posx_people) )   {      N[index] <- N[index] + F(posx_mission[index] , posy_mission[index] , posx_people[i],posy_people[i])   }}x <- rep(1,length(posx_mission));pdf("my.pdf")plot(N,price,col="RED")dev.off()com <- c()com_price <- c()ncom <- c()ncom_price <- c()for (index in 1:length(N)){    if(mydata1$任务执行情况[index] == 1)     {         com <- c(com,N[index])         com_price <- c(com_price,price[index])     }     else     {          ncom <- c(ncom,N[index])          ncom_price <- c(ncom_price,price[index])     }}pdf("my1.pdf")plot(com,com_price,col="BLUE")points(ncom,ncom_price,col="RED")dev.off()k <- 1000mF <- function(x0, y0, k, n){    ax <- k / ceiling(y0)     ay <- y0    bx <- x0     by <- k / ceiling(x0)    cx <- ( ax + bx ) / (2)    cy <- k / ceiling(cx)    lx <- 0    lf <- 0    rx <- 0    ry <- 0    if( ax <bx )    {       lx <- ax       ly <- ay       rx <- bx       ry <- by    }    else    {       lx <- bx       ly <- by       rx <- ax       ry <- ay    }    for (i in (1):n )    {    if( (lx - x0 )*(lx - x0) + (ly - y0) * (ly + k) < 0 || (rx - x0) * (rx + 1 ) + (ry - y0)*(ry - k) < 0)    {      sl <- sqrt((x0-lx) * (x0-lx) + (y0 - ly)*(y0-ly))      sr <- sqrt((x0-rx) * (x0-rx) + (y0 - ry)*(y0-ry))      sc <- sqrt((x0-cx) * (x0-cx) + (y0 - cy)*(y0-cy))      if(sl <= sr && sl <= sc) {return(sl) }       else{      if(sr <= sl && sr <= sc) return(sr)       else{      return(sc)       }      }    }    if((cx - x0 )*(cx - x0) + (cy - y0) * (cy + k) > 0 )    {       lx <- cx;       ly <- cy;       cx <- (lx + rx) / 2       cy <- k / ceiling(cx)    }    else    {        if((cx - x0)*(cx-(1) ) + (cy - y0)*(cy+k) == 0 )        {           sc <- sqrt((x0-cx) * (x0-cx) + (y0 - cy)*(y0-cy))           return(sc)        }        else        {          rx <- cx          ry <- cy          cx <- (lx + rx) / (2)          cy <- k / ceiling(cx)        }    }    }    sl <- sqrt((x0-lx) * (x0-lx) + (y0 - ly)*(y0-ly))    sr <- sqrt((x0-rx) * (x0-rx) + (y0 - ry)*(y0-ry))    sc <- sqrt((x0-cx) * (x0-cx) + (y0 - cy)*(y0-cy))    if(sl <= sr && sl <= sc) return(sl)    if(sr <= sl && sr <= sc) return(sr)    return(sc)}for (newK in 650:850){newP <- c()newN <- c()for (index in 1:length(N)){  if(price[index] <= 75)  {     newP <- c(newP,price[index])     newN <- c(newN,N[index])  }}dis <- 0for(index in 1:length(newN)){    newN[index] <- newN[index] + 1}for (index in 1:length(newN)){   dis <- dis + mF(newN[index],newP[index],newK,5)}print(newK)print(dis)}
原创粉丝点击