有向直线K中值问题.ppt

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
有向直线K中值问题

有向直线K中值问题          问题描述:   给定一条有向直线L以及L 上的n+1 个点x0<x1<x2<… <xn。有向直线L 上的每个点xi都有一个权 w(xi);每条有向边 (xi,xi-1),也都有一个非负边长d(xi,xi-1)。有向直线L 上的每个点xi 可以看作客户,其服务需求量为w(xi) 。每条边(xi,xi-1) 的边长 , d(xi,xi-1) 可以看作运输费用。如果在点xi 处未设置服务机构,则将点xi 处的服务需求沿有向边转移到点xj处服务机构需付出的服务转移费用为w(xi)*d(xi,xj) 。在点0 x 处已设置了服务机构,现在要在直线L上增设k处服务机构,使得整体服务转移费用最小。 编程任务    对于给定的有向直线L,编程计算在直线L 上增设k处服务机构的最小服务转移费用。 数据输入 由文件input.txt给出输入数据。第1 行有1个正整数n,表示有向直线L 上除了点x0 外还有n 个点x0 <x1 <… <xn.接下来的n行中,每行有2个整数.第i+1 行的2个整数分别表示w(Xn-i-1) 和d( Xn-i-1,Xn-i-2)。 结果输出 将计算的最小服务转移费用输出到文件output.txt。 例子: input.txt          output.txt  9 2             2 6           1 2  2 1  3 3  1 1  3 2  1 6  2 1  1 2  1 1 问题分析 本题是求解最优解的问题,考虑用动态规划算法。 在直线L上增设k处服务机构,设xt为我们增设的第一个服务机构,则问题转化为x0到x(t-1)的转移服务费用之和加上xt后增设k-1处服务机构的最小费用.我们计算x0到xn增设k个(设置k+1个点)是最优的,必须xt到xn增设k-1(设置k个点)也是最优的。 我们引入数组c[i][j]表示最小服务转移费用,其中i表示直线L上点xi处已设置了1个服务机构,j表示在xi后设置j处服务机构.我们的问题转化为求c[0][k+1]。 证明最优子结构性质 设xt是我们增设的第一个服务站,总的服务费用等于X1...Xt-1到X0的服务费W1用加上后面一段Xt...Xn增设k个服务站的费用W2,要使总的服务费用最优,则Xt...Xn增设k个服务站的费用W2是最优的.证明使用反正法,如果这后面一段服务费用W2不是最优的,假设存在某种增设方法得到后一段服务费用W2‘<W2,则W2‘ +W1 <W2 +W1 ,所以得到原来的设置方法不是最优解,这与题设矛盾,所以后面一段必须是最优的. 解题过程 计算出所有两点之间的距离d(i,j),并计算出之间的服务转移费m(i,j). 设L上有n个点,在点xi处已设置了服务机构,现在要Xi后设置j个服务机构(包括xi那个),使得整体服务转移费用最小。 0 i+j=n+1 c[i][j]= min{ c[t][j-1]+p } i<t<n+1; n ∑ m[t][i] j=1 t=i+1 n 其中p为x(t-1)到xi站的转移费用 p= ∑ m[t][i] t=i+1 根据递推公式,容易求出c[0][k+1]的递推式。 核心代码 void Distance(int n,int *w,int **d,int **m) { for(int i=0;i<=n;i++) { d[i][i]=0; m[i][i]=0; } for(i=0;i<n;i++) for(int j=i+1;j<=n;j++) { d[j][i]=d[j-1][i]+d[j][j-1]; m[j][i]=w[j]*d[j][i];} } int c(int i,int n,int k,int *w,int **d,int **m) { int s=0,t=0,j; if(k==1) { for(j=n;j>i;j--) t+=m[j][i]; return t;} if(i==n-k+1) return 0; for(j=n-k+1;j>i;j--)

文档评论(0)

5201314118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:7065201001000004

1亿VIP精品文档

相关文档