201971010233-潘晴 實驗二 個人專案—《0-1揹包問題》專案報告
阿新 • • 發佈:2022-03-21
專案 | 內容 |
---|---|
課程班級部落格連結 | 2019級卓越工程師班 |
這個作業要求連結 | 實驗二 軟體工程個人專案 |
我的課程學習目標 | 1.掌握軟體專案個人開發流程 2.掌握Github釋出軟體專案的操作方法 |
這個作業在哪些方面幫助我實現學習目標 | 1.對PSP有了一定的瞭解和掌握 2.熟悉了Java語言的開發步驟 3.複習回顧了0-1揹包問題演算法 |
Github倉庫連結地址 | 倉庫地址 |
任務一
點評的班級部落格1
作者的博文內容排版清晰,佈局美觀,提出的問題有自己的想法和見解,且方向不同,確實引人思考。
點評的班級部落格2
作者博文排布格式美觀整齊,博文內容充實,對於軟體工程學習提出的問題確實值得讓人思考,希望作者在未來的學習過程中可以對這些問題有更好的解答和理解。
點評的班級部落格3
博文排版主次分明,內容清楚充實,對於課程提出的問題也有自己的思考角度,期待博主更好的文章!
任務二
《構建之法》第1、2章學習總結:
- 軟體是什麼?
軟體=程式+軟體工程
軟體企業=軟體工程+商業模式 - 軟體工程是什麼?
軟體工程是把系統的、有序的、可量化的方法應用到軟體的開發、運營和維護上的過程。
軟體工程包括下列領域:軟體需求分析、軟體設計、軟體構建、軟體測試的軟體維護。 - 軟體工程的目標是創造“足夠好”的軟體
bug的多少可以直接衡量一個軟體的開發效率、使用者滿意度、可靠性和可維護性。 - PSP是什麼?
個人軟體過程(Personal Software Process,PSP)是一種可用於控制、管理和改進個人工作方式的自我持續改進過程,是一個包括軟體開發表格、指南和規程的結構化框架。PSP與具體的技術(程式設計語言、工具或者設計方法)相對獨立,其原則能夠應用到幾乎任何的軟體工程任務之中。
PSP能夠說明個體軟體過程的原則、幫助軟體工程師作出準確的計劃、確定軟體工程師為改善產品質量要採取的步驟、建立度量個體軟體過程改善的基準、確定過程的改變對軟體工程師能力的影響。 - PSP的特點?
- 不侷限於某一種軟體技術,而是著眼於軟體開發的流程。
- 不依賴於考試,而是依賴工程師自己收集資料,然後分析,提高。
- 在小型、初創的團隊中,很難找到高質量的專案需求,這意味著給程式設計師的輸入質量不高,在這種情況下,程式設計師的輸入(程式/軟體)往往質量也不高,然而這並不能全由程式設計師負責。
- PSP依賴於資料。
PSP展示
(min) |
(min) |
||
---|---|---|---|
Planning | 計劃 | ||
Development | 開發 | ||
(為目前的開發制定合適的規範) |
|||
Reporting | 報告 | ||
Process Improvement Plan |
任務三
1.專案背景
揹包問題(Knapsack Problem,KP)是NP Complete問題,也是一個經典的組合優化問題,有著廣泛而重要的應用背景。{0-1}揹包問題({0-1 }Knapsack Problem,{0-1}KP)是最基本的KP問題形式,它的一般描述為:從若干具有價值係數與重量係數的物品(或項)中,選擇若干個裝入一個具有載重限制的揹包,如何選擇才能使裝入物品的重量係數之和在不超過揹包載重前提下價值係數之和達到最大?
2.需求分析
- 讀取所給TXT檔案的有效D{0-1}KP資料
- 將讀取的有效資料以重量為橫軸、價值為縱軸繪製散點圖
- 對一組D{0-1}KP資料按項集第三項的價值:重量比進行非遞增排序,即遞減排序
- 選擇動態規劃演算法、回溯演算法求解指定D{0-1} KP資料的最優解和求解時間(以秒為單位)
- 計算所得最優解、求解時間和解向量可儲存為txt檔案或匯出EXCEL檔案
3.功能設計
- 可正確讀入實驗資料檔案的有效D{0-1}KP資料;
- 能夠繪製任意一組D{0-1}KP資料以重量為橫軸、價值為縱軸的資料散點圖;
- 能夠對一組D{0-1}KP資料按項集第三項的價值:重量比進行非遞增排序;
- 使用者能夠自主選擇動態規劃演算法、回溯演算法求解指定D{0-1} KP資料的最優解和求解時間(以秒為單位);
- 任意一組D{0-1} KP資料的最優解、求解時間和解向量可儲存為txt檔案或匯出EXCEL檔案
4.設計實現
- File類 :通過檔案路徑來建立檔案例項,能夠快速讀取檔案,最後,使用available檢查是不是讀到了檔案末尾。
- ScatterDiagram類 :建立二維陣列data儲存profit價值和height重量,以重量為橫軸、價值為縱軸,建立直角座標系畫出散點圖。
- PaiXu類 :分別定義int型別陣列profit和weight陣列將價值和重量儲存,因為所給資料全部為int型,再定義比值ratio為double型別,再將其int型別陣列強制轉換為double進行比值運算,最後運用氣泡排序將比值進行降序排序。
- SuanFa類 :演算法設計,在0/1揹包問題中,物品i或者被裝入揹包,或者不被裝入揹包,設xi表示物品i裝入揹包的情況,則當xi=0時,表示物品i沒有被裝入揹包,xi=1時,表示物品i被裝入揹包。
5.程式碼展示
- 讀入實驗資料檔案的有效D{0-1}KP資料
try{
//通過檔案路徑來建立檔案例項
fis = new FileInputStream(file);
//把FileInputStream例項傳遞到 BufferedInputStream
bis = new BufferedInputStream(fis);
//available檢查是不是讀到了檔案末尾
while( bis.available() > 0 ){
System.out.print((char)bis.read());
}
}catch(FileNotFoundException fnfe)
{
System.out.println("檔案不存在" + fnfe);
}
catch(IOException ioe)
{
System.out.println("I/O 錯誤: " + ioe);
}
- 繪製散點圖
int h = getHeight();//重量
int w = getWidth();//價值
g2.draw(new Line2D.Double(PAD, w-PAD, h-PAD, w-PAD));// 橫座標
g2.draw(new Line2D.Double(PAD, PAD, PAD, w-PAD));// 縱座標
double xInc = (double)(w - 2*PAD)/(data.length-1);
double scale = (double)(h - 2*PAD)/getMax();
// 資料點(座標)
g2.setPaint(Color.blue);//點的顏色
for(int i = 0; i < data.length; i++) {
double x = PAD + i*xInc;
double y = h - PAD - scale*data[i];
g2.fill(new Ellipse2D.Double(x-2, y-2, 4, 4));
- 重量比排序
//氣泡排序
double tmp;
for (int a= 1; a < ratio.length; a++) {
for (int j = 0; j < ratio.length-1; j++) {
if(ratio[j] < ratio[j+1]){
tmp = ratio[j];
ratio[j] = ratio[j+1];
ratio[j+1] = tmp;
}
}
}
- 計算最優解及求解時間
//建立二維陣列
//v[i][j]表示在前i個物品中能夠裝入容量為j的揹包中的最大價值
int[][] v=new int[n+1][m+1];
//存放記錄陣列
int[][] path=new int[n+1][m+1];
//初始化第一行第一列(已經處理了,因為預設是0)
//根據公式來動態規劃處理
for (int i = 1; i < v.length; i++) {
for (int j = 1; j < v[0].length; j++) {
//公式
if(w[i-1]>j){
v[i][j]=v[i-1][j];
}else{
//v[i][j]=Math.max(v[i-1][j],val[i-1]+v[i-1][j-w[i-1]]);
if(v[i-1][j]<val[i-1]+v[i-1][j-w[i-1]]){
v[i][j]=val[i-1]+v[i-1][j-w[i-1]];
path[i][j]=1;
}else{
v[i][j]=v[i-1][j];
}
}
}
}
6.設計實現
繪製散點圖
計算最優解及求解時間
儲存為txt檔案
任務四
將專案原始碼的完整工程檔案提交到你註冊Github賬號的專案倉庫中
專案總結
此次專案的完成效果並不是太理想,在演算法選擇設計上存在問題,會繼續嘗試解決。此次花費時間最長的部分,也是PSP中實際完成時間和預計完成時間差異最大的部分就是在程式碼編寫部分,因為對Java語言的不熟練,遺忘,在編寫程式碼的時候問題重重,今後也會加強自己的程式設計能力,多寫程式碼,多加練習。會繼續嘗試解決。專案的完成過程是充實有意義的,通過{0-1}揹包問題軟體的開發,將以前學過的知識重新回顧,重新拾起應用,在一點點解決問題中重新學習。