多目标的距离之和最小问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
说明:min是每个ICBM到其目标距离之和的最小值。结果保留3位小数。
sample input:
2
1 1
-1 -1
-2 -2
2 2
sample output:
2.8源自文库8
三、需求分析
(1)由主函数调用init()函数
(2)以只读形式调取十个测试数据和十个结果比对数据,十个测试数据一次调用KM()函数,算出结果与结果比对,因为数据都是保留小数点后三位,所以加上myans = int(myans*1000+0.5)/1000.0; 这条命令,可以使演算结果与比对结果一直。如果结果一致输出“true!”;结果不一致,输出“flase!”
2、在一开始分析问题时,由于没有接触过这类课题,所以不得不去查阅资料。参考离散数学,利用图论部分的二分图里的霍尔定理就能够理解这道题目。处理方法多目标最优问题可以转化为单目标的优化问题,例如对多目标函数进行加权或最小二乘处理等。
3、在调用数据时,必须在源程序中修改调用地址,否则将会出现为报错却无法运行的状况,我在这里将其修改为//char filein[] = "C:\\Users\\Administrator\\Desktop\\测试\\a.in1"; //文件名
int link[M],slack[M];
int visx[M],visy[M];
double x[M][3],y[M][3],w[M][M],lx[M],ly[M]; //lx,ly为可行顶标,
int DFS(int x)//dfs增广路
{
visx[x] = 1;
for (int y = 1;y <= ny;y ++)
八、程序设计总结
首先这次程序设计实验由于涉及到数据结构中未学习到的内容,只有自己看书结合资料完成,并且由于时间紧张的关系本次实验程序的编写存在着一些困难,幸好有着学霸李某的帮助使得本次实验可以顺利的完成特此对其表示感谢。通过这次实验我了解了匈牙利算法、km算法,虽然由于水平有限一些复杂的算法并没有运用但至少了解了一些算法,对于水平的提高有着非常大的帮助。
int i,j,len,t;
char s[1];
double temp,ans;
//char filein[] = "C:\\Users\\Administrator\\Desktop\\测试\\a.in1"; //文件名
char filein[] = "a.in1";
char fileout[] = "a.ou1";
if (DFS(x))
break;
int d = inf;
for (i = 1;i <= ny;i ++)
if (!visy[i]&&d > slack[i])
d = slack[i];
for (i = 1;i <= nx;i ++)
if (visx[i])
lx[i] -= d;
for (i = 1;i <= ny;i ++) //修改顶标
用户界面设计
报告书写认真程度
内容详实程度
文字表达熟练程度
回答问题准确度
评分等级
评分等级选择:优秀、良好、中等、及格、不及格
教师签名:
年月日
一、课题名称
多目标的距离之和最小问题据
二、课题内容和要求
【问题描述】
小明正在玩《文明III》游戏,现在他有n个洲际导弹(简称ICBM)。他需要在最短的时间内,用这n个ICBM摧毁敌方n个目标(1个ICBM只能摧毁1个目标)。n个ICBM和目标的位置不一定相同,小明觉得给每个ICBM确定目标是一件很麻烦的事情。请你编程帮助小明给每个ICBM确定目标,使每个ICBM到其目标的距离之和最小。
算法与数据结构设计报告
( 2015 / 2016 学年 第 二 学期)
题 目:多目标的距离之和最小问题
专 业
学 生 姓 名
班 级 学 号
指 导 教 师
指 导 单 位
日 期
评 分 细 则
评分项
优秀
良好
中等

遵守机房规章制度
上机时的表现
学习态度
程序准备情况
程序设计能力
团队合作精神
课题功能实现情况
算法设计合理性
输入:
第一行:n (n<=12)
第2到n+1行:x,y
说明:每一行包含一个坐标(x,y),表示一个ICBM,-10000<x,y<10000,且x,y为整数。
第n+2到2n+1行:x,y
说明:每一行包含一个坐标(x,y),表示一个目标,-10000<x,y<10000,且x,y为整数。
输出:
仅一行:min
四、概要设计
五、详细设计
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <math.h>
#define M 500
#define inf 0x3f3f3f3f
int n,nx,ny;//nx,ny分别为x点集y点集的个数
if (w[i][j] > lx[i])
lx[i] = w[i][j];
for (int x = 1;x <= nx;x ++)
{
for (i = 1;i <= ny;i ++)
slack[i] = inf;
while (1)
{
memset (visx,0,sizeof(visx));
memset (visy,0,sizeof(visy));
{
if (visy[y])
continue;
int t = lx[x] + ly[y] - w[x][y];
if (t == 0) //
{
visy[y] = 1;
if (link[y] == -1||DFS(link[y]))
{
link[y] = x;
return 1;
}
}
else if (slack[y] > t) //不在相等子图中slack 取最小的
slack[y] = t;
}
return 0;
}
double KM()
{
int i,j;
memset (link,-1,sizeof(link));
memset (ly,0,sizeof(ly));
for (i = 1;i <= nx;i ++) //lx初始化为与它关联边中最大的
for (j = 1,lx[i] = -inf;j <= ny;j ++)
filein[len-1] = s[0];
fileout[len-1] = s[0];
fp = fopen(filein,"r");
fscanf(fp,"%d",&n);
nx=ny=n;
for(i=1;i<=n;i++)
fscanf(fp,"%lf%lf",&x[i][1],&x[i][2]);
for(i=1;i<=n;i++)
if (visy[i])
ly[i] += d;
else
slack[i] -= d;
}
}
double res = 0;
for (i = 1;i <= ny;i ++)
if (link[i] > -1)
res += w[link[i]][i];
return -1.0*res;
}
void init(){//初始化输入
(3)KM()函数求最佳路径,定义nx,ny分别为x点集y点集的个数,lx,ly为可行顶标,lx初始化为与它关联边中最大的,调用int DFS函数増广路,修改顶标,返回多目标的最小路径和。
(4)若ny是图G中一条连通导弹和目标的路径,并且属于nx的边和不属于nx的边(即已匹配和待匹配的边)在ny上交替出现,则称P为相对于nx的一条增广路径。该步骤即开始分配ny,即找到n个不同行不同列的ny;其中包括当找到不同行不同列的元素小于lx(初始化为与它关联边中最大的)时(导弹和目标的之间的年限不足)既要开始重新刷新ny信息,即不在相等子图中slack 取最小的。
//char fileout[] = "C:\\Users\\Administrator\\Desktop\\测试\\a.ou1"; //文件名
FILE *fp;
for(t=1;t<=9;t++)
{
if(t==6) continue;
len = strlen(filein);
itoa(t,s,10);
w[i][j] = -1*sqrt(temp);
}
double myans = KM();
myans = int(myans*1000+0.5)/1000.0;
fp = fopen(fileout,"r");
fscanf(fp,"%lf",&ans);
if(fabs(ans-myans)>1e-5)
fscanf(fp,"%lf%lf",&y[i][1],&y[i][2]);
fclose(fp);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
temp=0;
temp = (x[i][1]-y[j][1])*(x[i][1]-y[j][1]);
temp += (x[i][2]-y[j][2])*(x[i][2]-y[j][2]);
printf("输入数据%d:Flase!\n",t);
else
printf("输入数据%d:True!\n",t);
printf("%.3lf %.3lf\n\n",myans,ans);
}
}
int main ()
{
init();
return 0;
}
六、测试数据及其结果分析
七、调试过程中的问题
1、语法错误的位置能很快地被编译器找到,而运行时错误的位置却很难被我发现。在程序运行结束之前,提示Debug Error,它属于一种运行时错误。而且根据输出的一些内容,发现程序也没有达到连接字符串的目的。所以我让程序输出更多信息,查找错误原因。
相关文档
最新文档