《算法設計》課程報告-最小重量機器設計問題

上傳人:muw****50 文檔編號:140442167 上傳時間:2022-08-23 格式:DOC 頁數(shù):11 大?。?76.51KB
收藏 版權(quán)申訴 舉報 下載
《算法設計》課程報告-最小重量機器設計問題_第1頁
第1頁 / 共11頁
《算法設計》課程報告-最小重量機器設計問題_第2頁
第2頁 / 共11頁
《算法設計》課程報告-最小重量機器設計問題_第3頁
第3頁 / 共11頁

下載文檔到電腦,查找使用更方便

9.9 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《《算法設計》課程報告-最小重量機器設計問題》由會員分享,可在線閱讀,更多相關(guān)《《算法設計》課程報告-最小重量機器設計問題(11頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、 《算法設計》課程報告 課題名稱: 算法設計 課題負責人名(學號): --- 同組成員名單(角色): --- 指導教師: --- 評閱成績: 評閱意見: 提交報告時間:2014年 6 月 17 日 最小重量機器設計問題 計算機科學與技術(shù) 專業(yè) 學生 -- 指導老師 --- [題目描述] 設某一機器由 n 個部件組成,每一種部件都可以從 m 個 不同的供應商處購得。高 wi

2、j 是從供應商 j 處購得的部件 i 的重量, cij 是相應的價格。 試設計一個算法,給出總價格不超過 c 的最小重量機器設計。 編程任務: 對于給定的機器部件重量和機器部件價格,編程計算總價 格不超過 d 的最小重量機器設計。 數(shù)據(jù)輸入:由文件 input.txt 給出輸入數(shù)據(jù)。第一行有 3 個正整數(shù) n, m 和 d。接正業(yè)的 2n 行,每行 n 個數(shù)。前 n 行是 c,后 n 行是 w。 結(jié)果輸出: 將計算出的最小重量, 以及每個部件的供應商輸出到文件 output.txt。 輸入文件示例 輸出文件示例 input.txt

3、 output.txt 3 3 4 4 1 2 3 1 3 1 3 2 1 2 2 2 1 2 3 3 2 1 2 2 2 [算法分析] 采用回溯算法和分支定界法分別實現(xiàn),對于回溯法,采用深度優(yōu)先搜索對子集樹進行剪枝,剪枝條件是當前的總費用不超過總費用;對于分支定界法,采用按照層次遍歷對子集樹進行剪枝,并將每層的結(jié)點按照重量由小到大進行排序,將相應下標保存在二維數(shù)組s中,以便構(gòu)造最優(yōu)解。 兩種算法是時間復雜度都是O(m^n) ,空間復雜度均為O(nm),但由于分支定界法在已經(jīng)排好序的序列中查

4、找,因此查找到的第一個解即為最優(yōu)解,理論上來說,時間效率會比回溯法高。 [程序?qū)崿F(xiàn)] 回溯法代碼 #include #include #include #include #include #include using namespace std; #define INF 999999999 #define MAXSIZE 100+1 int cur_solution[MAXSIZE]; int solution[MAXSIZE];

5、int w[MAXSIZE][MAXSIZE]; //weight int c[MAXSIZE][MAXSIZE]; //cost int minWeight; int cur_minWeight; void Backtrack(int t,int n,int m,int d){ if(t>n){ if(cur_minWeight < minWeight){//保存最優(yōu)解和最優(yōu)值 minWeight = cur_minWeight; for(int r=1;r<=n;++r){ solution[r] = cur_solution[r];

6、 } } } else{ for(int i=1;i<=m;++i){ d -= c[t][i]; cur_solution[t] = i; cur_minWeight += w[t][i]; if(d>=0) { Backtrack(t+1,n,m,d); } cur_minWeight -= w[t][i]; //if(Constraint(t) && Bound(t)) Backtrack(t+1,n,m,d); d += c[t][i]; } } return; }

7、 int main(){ int n,m,d; cout<<"Please input the input file path:"<>strPath; ofstream fout(strPath); if(fin.good() && fout.good()){ minWeight

8、 = INF; cur_minWeight = 0; fin>>n>>m>>d; int j,k; for(j=1;j<=n;++j){ for(k=1;k<=m;++k){ fin>>c[j][k]; } } for(j=1;j<=n;++j){ for(k=1;k<=m;++k){ fin>>w[j][k]; } } Backtrack(1,n,m,d); fout<

9、 fout< #include #include

10、st> #include using namespace std; #define MAX_NODE 256 typedef struct _node { int weight,price; int level,th; struct _node *prev; }node; void qs(int *a,int *s,int b,int e)//快速排序 { int t,c=a[s[b]]; int l=b,r=e; while(l=c)-

11、-r; t=s[r];s[r]=s[l];s[l]=t; while(l que; list::iterator i

12、t; node *pnode; /* 讀取文件 */ FILE *pf; if((pf=fopen("input.txt","r"))!=0) { fscanf(pf,"%d%d%d",&n,&m,&c); w=(int *)malloc(n*m*sizeof(int));//重量 p=(int *)malloc(n*m*sizeof(int));//價格 for(i=0;i

13、0;j

14、要多少錢 minprice[n]=0; //買了n個零件之后,不需要再買了 for(i=0;i=0;--i) //計算買剩下的零件至少要多少錢 { minprice[i]=minprice[i+1]+minprice[i]; } for(i=0;i<

15、n;++i) //每種零件按重量排序,排序下標記錄的s中,排序后w[i*m+s[i][j]],i相同時,對于變量j是遞增的 qs(w+i*m,s[i],0,m-1); /* 開始計算 */ for(i=0;iweight=w[s[0][i]]; pnode->price=p[s[0][i]]; if(pnode->price+minprice[2]<=c) { pnode->th=i; pnode->level=

16、1; pnode->prev =0; que.push_back(pnode); } else delete pnode; } while(!que.empty()) //計算,直到得出結(jié)果或者隊列為空 { level =que.front()->level; price =que.front()->price; weight=que.front()->weight; if(level

17、de->weight=weight+w[level*m+s[level][i]]; pnode->price=price+p[level*m+s[level][i]]; if(pnode->price+minprice[level+1]<=c) //剪枝,如果當前結(jié)點剩下的錢不夠買全所有零件,則剪掉 { pnode->th=s[level][i]; pnode->level=level+1; pnode->prev =que.front(); for(it=que.begin();it!=que.end();++it) //按重量

18、遞增構(gòu)造優(yōu)先隊列 if(pnode->weight<(*it)->weight) break; que.insert(it,pnode); if(level==n-1)break; //如果已經(jīng)找到答案,退出循環(huán) } else delete pnode; } que.pop_front(); if(ilevel!=n) { printf("can not find answer!!");

19、 getchar();    exit(0); } pf=fopen("output.txt","w"); if(pf) { fprintf(pf,"%d\n",pnode->weight); int count=n,ans[n]; while(pnode) { ans[--count]=pnode->th; pnode=pnode->prev; } for(i=0;i

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!