【无标题】444444

为带权路径进行加权最优规划,首先是时间问题,因为到达站点之后还要返回公司,所以时间最大为12小时,剩下要做的就是在12个小时内尽可能的使所有需要到达的站点获得的费用和最大。

应尽可能检索到所有可能的路径,所以的采用有向图的广度遍历来对所有路径进行检索。



select(站点数量n,穿梭使劲t,目的站点d,价值val){

    for(对站点的所有临接站点进行遍历)

        if(是否访问过){

            若访问过则继续访问下一个,若没有访问则标记为访问过

            判断价值是否为所有邻接表中的最优,若为最优则添加至路径,否则不添加

        }

}

//------定义一个结构体(用来记录相邻两点坐标和距离)--------------
struct NUM{
 double data;//距离
 double left;//构成此距离的左数
 double right;//构成此距离的右数
};//定义结构体数组
struct NUM L[20];//结构体数组20个
int J=0;//控制结构体数组的增加

//-------------------main()函数---------------------------------------------
int main()
{
 int n;
 double S[50];
 // 在这里先输入数组的长度
 //再输入S数组
 sort(S,n);对S进行排序
 double d=cpairl(S,0,n-1);//得到最短距离
 PUT(L,d);//输出一维最接近的两点
}

//----------------对S进行排序--------------------------------
void sort(double S[],int n)//排序
{
 int i,j;
 double temp=0;
 for(i=0;i
 {
  for( j=i+1;j
   if(S[i]>=S[j])
   { temp=S[i];S[i]=S[j];S[j]=temp;}
 }

}

//------------使用递归求最小距离值--------------------------
double min(double x,double y,double d)//三个数中得到最小的数
{
 if(x<=y&&x<=d)return x;
 if(y<=x&&y<=d)return y;
 else return d;
}

double cpairl(double S[],int left,int right)
{
 int n=right-left+1;
 int t;
 double m,sum=0;
 if(n==1)//只剩一个数时,距离无穷大
 {
  L[J].left=S[left];
  L[J].right=0;
  L[J].data=1000;
  return L[J++].data;
 }
 if(n==2)//剩两个数时,直接相减得到距离
 {

  L[J].left=S[left];
  L[J].right=S[right];
  L[J].data=S[right]-S[left];
  return L[J++].data;
 }
 for(int i=left;i<=right;i++)
   sum+=S[i];//全部坐标之和
  m=sum/n;//各点坐标的中位数
  cout<<"中位数:"<<m<<endl;
  int i=left-1;
   while(S[++i]<=m);//s[i-1]为m部分的开头
 t=i;//将s分位两段的记号
 double d1,d2;
 d1=cpairl(S,left,t-1);//左半部分递归
 d2= cpairl(S,t,right);//右半部分递归
 double p=S[t-1];//左部分最接近m的值
 double q=S[t];//右部分最接近m的值
 double d=min(d1,d2,q-p);//q-p的值为中间的距离
 return d;
}
//找到最近两点的坐标
void PUT(NUM L[],double d)//输出最小距离的L[].left和L[].right
{
 int i=-1;
 while(L[++i].data!=d);//直到L[].data==d时停止
   //输出这两个值
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值