演算法與資料結構設計報告
( 2015 / 2016 學年第二學期)
題目: 多目標的距離之和最小問題
專業學生姓名
班級學號
指導教師
指導單位
日期一、課題名稱
二、課題內容和要求
【問題描述】
小明正在玩《文明iii》遊戲,現在他有n個洲際飛彈(簡稱icbm)。他需要在最短的時間內,用這n個icbm摧毀敵方n個目標(1個icbm只能摧毀1個目標)。n個icbm和目標的位置不一定相同,小明覺得給每個icbm確定目標是一件很麻煩的事情。
請你程式設計幫助小明給每個icbm確定目標,使每個icbm到其目標的距離之和最小。
輸入:第一行:n (n<=12)
第2到n+1行:x,y
說明:每一行包含乙個座標(x,y),表示乙個icbm,-10000第n+2到2n+1行:x,y
說明:每一行包含乙個座標(x,y),表示乙個目標,-10000輸出:
僅一行:min
說明:min是每個icbm到其目標距離之和的最小值。結果保留3位小數。
sample input:
21 1
-1 -1
-2 -2
2 2sample output:
2.828
三、需求分析
(1)由主函式呼叫init()函式
(2)以唯讀形式調取十個測試資料和十個結果比對資料,十個測試資料一次呼叫km()函式,算出結果與結果比對,因為資料都是保留小數點後三位,所以加上myans = int(myans*1000+0.5)/1000.0; 這條命令,可以使演算結果與比對結果一直。
如果結果一致輸出「true!」;結果不一致,輸出「flase!」
(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 取最小的。
四、概要設計
五、詳細設計
#include <>
#include <>
#include <>
#include <>
#include <>
#define m 500
#define inf 0x3f3f3f3f
int n,nx,ny;//nx,ny分別為x點集y點集的個數
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增廣路
else if (slack[y] > t) //不在相等子圖中slack 取最小的
slack[y] = t;
}return 0;
}double km()
}double res = 0;
for (i = 1;i <= ny;i ++)
if (link[i] > -1)
res += w[link[i]][i];
return -1.0*res;
}void init(){//初始化輸入
int i,j,len,t;
char s[1];
double temp,ans;
//char filein = "c:\\users\\administrator\\desktop\\測試\\"; //檔名
char filein = "";
char fileout = "";
//char fileout = "c:\\users\\administrator\\desktop\\測試\\"; //檔名
file *fp;
for(t=1;t<=9;t++)
{if(t==6) continue;
len = strlen(filein);
itoa(t,s,10);
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++)
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]);
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)
printf("輸入資料%d:flase!\n",t);
else
printf("輸入資料%d:true!\n",t);
《我與我的目標的距離》主題班會活動方案
中學主題班會活動方案 高三年級 17 班2007年 11月23日 主題 我與我的目標的距離 活動目的 教育 培養的效果及目標 1.對自己有正確的定位,明確奮鬥目標,激發學生鬥志 2.反思自己前段學習中問題,尋求對策,並制定適合自己的學習計畫 3.總結好的學習方法和做法,提高學習效率 活動準備 教室布...
第10章多目標規劃簡介
例1 物資調運優化 假設物資排程部門計畫將某種物資從若干個儲存倉庫,調運到若干個銷售網點。考慮到物資的時效性和銷售效益,排程部門希望物資在運輸過程中盡可能快地到達目的地 考慮到運輸的成本,排程部門還希望物資的總運輸費用最小。假設個倉庫的物資庫存量為,單位 t 個銷售網點預計銷售量為,單位 t 倉庫i...
Matlab學習系列27多目標規劃
27.多目標規劃 一 線性規劃的侷限性 1.線性規劃要求所求解問題必須滿足全部的約束,而實際問題中並非所有約束都需要嚴格的滿足 2.線性規劃只能處理單目標的優化問題,從而對一些次目標只能轉化為約束處理,而實際問題中,目標和約束是可以相互轉化的,處理時不一定要嚴格區分 3.線性規劃在處理問題時,將各個...