201971010135-孙得弘 实验三 结对项目—《{0-1}KP 实例数据集算法实验平台》项目报告

2022/4/4 22:19:35

本文主要是介绍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的效果,但是如果水平不是太好的人就比如我和我的同伴来说,合作开发一个如此复杂的软件确实是很头疼的事情,不过还是要承认两个人合作会让工作量减轻不少,并且可以从同伴身上学习到一些自己所不知道的知识。总之这次合作软件开发也让我受益良多,虽然博文写完了,但是我还是要继续学习自己没有学完的知识,否则当下一次工程来时我的时间还是会不够用。



这篇关于201971010135-孙得弘 实验三 结对项目—《{0-1}KP 实例数据集算法实验平台》项目报告的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程