1. 程式人生 > 其它 >201971010135-孫得弘 實驗三 結對專案—《{0-1}KP 例項資料集演算法實驗平臺》專案報告

201971010135-孫得弘 實驗三 結對專案—《{0-1}KP 例項資料集演算法實驗平臺》專案報告

專案 內容
課程班級部落格連結 2019卓越班
這個作業要求連結 作業要求連結
我的課程學習目標 (1)結對完成軟體開發(2)深入學習Github釋出軟體專案的操作方法。
這個作業在哪些方面幫助我實現學習目標 (1)複習psp流程(2)學習python GUI(3)學習GitHub
結對方學號-姓名 201971010131-李治江
結對方本次部落格作業連結 [部落格地址](https://www.cnblogs.com/bkbkb/p/16100391.html
)
本專案Github的倉庫連結地址 倉庫地址

需求分析

(1)平臺基礎功能:實驗二 任務3;
(2){0-1}KP 例項資料集需儲存在資料庫;
(3)平臺可動態嵌入任何一個有效的{0-1}KP 例項求解演算法,並儲存演算法實驗日誌資料;
(4)人機互動介面要求為GUI介面(WEB頁面、APP頁面都可);
(5)查閱資料,設計遺傳演算法求解{0-1}KP,並利用此演算法測試要求(3)

本次實驗在和我的partner進行協商後決定繼續用python語言進行開發,並且用python GUI程式設計完成使用者互動介面,並且本次合作專案需要將例項資料集儲存在資料庫中。

設計說明

  • 本次設計主要是在實驗二的基礎上繼續開發的一次合作軟體開發
  • 由於本次工程需要設計一個GUI介面,我在開始採用的是PyQt5進行GUI介面的設計,但是由於PyQt5的體系很複雜,我學習的網課長達幾十小時,由於我個人的原因不能及時看完,所以在種種原因下又改為tkinter開發GUI介面。相比PyQt5,tkinter相對要更好上手,對於我這種新手來說很友好。

主要功能如下

graph LR A[主要功能] -->B(選擇方法) A --> C(輸出最優解) A -->D(繪製散點圖) A -->E(連結資料庫)

程式碼展示

tkinter基本框架

window = tk.Tk()
window.title('{0-1}KP 例項資料集演算法實驗平臺')
window.geometry('500x500')
#定義一個lable
l = tk.Label(window,text='請選擇方法並輸入資料',font=('Arial',12))
l.pack() #固定視窗位置

遺傳演算法(Genetic Algorithm,GA)最早是由美國的 John holland於20世紀70年代提出,該演算法是根據大自然中生物體進化規律而設計提出的。是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜尋最優解的方法。該演算法通過數學的方式,利用計算機模擬運算,將問題的求解過程轉換成類似生物進化中的染色體基因的交叉、變異等過程。在求解較為複雜的組合優化問題時,相對一些常規的優化演算法,通常能夠較快地獲得較好的優化結果。遺傳演算法已被人們廣泛地應用於組合優化、機器學習、訊號處理、自適應控制和人工生命等領域。

##遺傳演算法
def best_x(F, S, N):
    y = 0
    x = 0
    B = [0] * N
    for i in range(N):
        if y < F[i]:
            x = i
        y = F[x]
        B = S[x]
    return B, y


def rate(x):
    p = [0] * len(x)
    s = 0
    for i in x:
        s += i
    for i in range(len(x)):
        p[i] = x[i] / s
    return p

def chose(p, X, m, n):
    X1 = X
    r = np.random.rand(m)
    for i in range(m):
        k = 0
        for j in range(n):
            k = k + p[j]
            if r[i] <= k:
                X1[i] = X[j]
                break
    return X1

def match(X, m, n, p):
    r = np.random.rand(m)
    k = [0] * m
    for i in range(m):
        if r[i] < p:
            k[i] = 1
    u = v = 0
    k[0] = k[0] = 0
    for i in range(m):
        if k[i]:
            if k[u] == 0:
                u = i
            elif k[v] == 0:
                v = i
        if k[u] and k[v]:
            # print(u,v)
            q = np.random.randint(n - 1)
            # print(q)
            for i in range(q + 1, n):
                X[u][i], X[v][i] = X[v][i], X[u][i]
            k[u] = 0
            k[v] = 0
    return X

def vari(X, m, n, p):
    for i in range(m):
        for j in range(n):
            q = np.random.rand()
            if q < p:
                X[i][j] = np.random.randint(0, 2)

    return X

建立資料庫

import sqlite3

# 1.建立資料庫連結
# 2.建立資料庫
conn = sqlite3.connect('sql.db') # 相對路徑
# 3.建立遊標
cursor = conn.cursor()
# 4.建立表
cursor.execute('create table Ranking')
# timestamp 時間戳
# 5.關閉遊標
cursor.close()
# 6.關閉資料庫連結
conn.close()

程式執行

  • 這是執行程式後的主GUI介面
  • 但是目前還存在一些問題,我和我的同伴研究了很久也沒能得到解決,在我們把GUI介面設計好之後,把實驗二的0-1揹包問題的功能函式帶入時出現了很多問題。
  • 繪製的散點圖如下

合作過程


結對PSP

小結

歷時兩週的結對軟體開發對於我來說真的很漫長,在這個過程中真的學習到了很多很多新的知識,一些新的演算法。非常遺憾我們沒有按時把軟體的全部功能完成,我和我的夥伴水平是否有限,本來希望通過看網課等方式繼續自學完成,但是由於時間安排上的問題導致本次專案不得不提前結束。對於1+1>2這個問題我認為還是要分情況的,如果是兩個水平都相當不錯的人合作,那他們一定會發揮出1+1>2的效果,但是如果水平不是太好的人就比如我和我的同伴來說,合作開發一個如此複雜的軟體確實是很頭疼的事情,不過還是要承認兩個人合作會讓工作量減輕不少,並且可以從同伴身上學習到一些自己所不知道的知識。總之這次合作軟體開發也讓我受益良多,雖然博文寫完了,但是我還是要繼續學習自己沒有學完的知識,否則當下一次工程來時我的時間還是會不夠用。