采用两人结对编程方式,设计开发一款{0-1}KP 实例数据集算法实验平台

本文档详细介绍了如何设计并开发一个支持多种算法求解0-1背包问题的实验平台。该平台具备数据读入、散点图绘制、动态嵌入算法、遗传算法求解等功能,并采用GUI界面,同时支持数据存储在数据库。遗传算法部分实现了种群规模、迭代次数等参数,并展示了最大价值的计算过程。
摘要由CSDN通过智能技术生成

采用两人结对编程方式,设计开发一款{0-1}KP 实例数据集算法实验平台

1、实现如下功能:
(1)平台基础功能:实验二 任务3;
(2){0-1}KP 实例数据集需存储在数据库;
(3)平台可动态嵌入任何一个有效的{0-1}KP 实例求解算法,并保存算法实验日志数据;
(4)人机交互界面要求为GUI界面(WEB页面、APP页面都可);
(5)查阅资料,设计遗传算法求解{0-1}KP,并利用此算法测试要求(3);
(6)附加功能:除(1)-(5)外的任意有效平台功能实现。
2、需求分析
Who 为谁设计,用户是谁?

  • 设计开发一款{0-1}KP 实例数据集算法实验平台 ,提供给使用不同方法求解0-1背包,且处理多组数据的用户。
    What 需要解决如下问题?
    数据读入:
    正确读入实验数据文件的有效{0-1}KP数据;
    绘制散点图:
    绘制任意一组{0-1}KP数据以价值重量为横轴、价值为纵轴的数据散点图;
    排序:
    对一组{0-1}KP数据按重量比进行非递增排序;
    多算法选择求解:
    能够自主选择贪心算法、动态规划算法、回溯算法求解指定{0-1} KP数据的最优解和求解时间(以秒为单位);
    文件保存:
    任意一组{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件;
    存储数据库:
    {0-1}KP 实例数据集需存储在数据库;
    使用人机交互页面:
    人机交互界面要求为GUI界面(WEB页面、APP页面都可);
    遗传算法求解:
    查阅资料,设计遗传算法求解{0-1}KP,并利用此算法测试要求平台可动态嵌入任何一个有效的{0-1}KP 实例求解算法,并保存算法实验日志数据;
    Why 为什么解决这些问题?
    根据题目要求,实现完整的项目,提高学生的编程水平;结对编程,让我们平等地,互补地进行开发工作。
    3、功能设计
    图一4、设计实现
    函数之间的调用:选用不同的模块,调用相应的函数
    图二
    5、主要代码
    # 创建数据库
    def CreateDataBase(self):
        global i
        global d
        global cubage   # 背包最大容量
        global profit   # 物品价值
        global weight   # 物品重量
        global pw       # 物品价值/重量比

        # 连接到SQLite数据库,数据库文件是mrsoft.db
        conn = sqlite3.connect('mrsoft.db')
        cursor = conn.cursor()
        # 如果表已经存在则删除
        cursor.execute('DROP TABLE IF EXISTS user')
        # 如果表不存在则创建表
        cursor.execute('create table if not exists user (num int(10) primary key,profit int(20), weight int(20))')
        cubage[i] = max(list(map(int,re.findall(r'\d+',line[i*8+3]))))
        profit[i] = list(map(int,re.findall(r'\d+',line[i*8+5])))
        weight[i] = list(map(int,re.findall(r'\d+',line[i*8+7])))
        pw[i] = list(map(lambda x:x[0]/x[1],zip(profit[i],weight[i])))
        # 往表中插入数据
        for j in range(0,d):
            cursor.execute('insert into user (num,profit,weight) values ("%d","%d","%d")'%(j,profit[i][j],weight[i][j]))
        cursor.execute('select * from user')
        result=cursor.fetchall()

        # 关闭游标
        cursor.close()
        # 提交事务
        conn.commit()
        # 关闭Connection
        conn.close()

        return result


class MyFrame3(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, '有效数据', size=(800, 800))
        # 遗传算法
        start2 = time.perf_counter()
        heigh = heigh+70
        m = 32       # 规模
        N = 500      # 迭代次数
        Pc = 0.8     # 交配概率
        Pm = 0.05    # 变异概率
        V =profit[i] # 物品价值
        W =weight[i] # 物品重量
        n = len(W)   # 染色体长度
        w = cubage[i]  # 背包最大容量

        C = self.init(m, n)
        S,F  = self.fitness(C,m,n,W,V,w)
        B ,y = self.best_x(F,S,m)
        Y =[y]
        for i in range(N):
            p = self.rate(F)
            C = self.chose(p, C, m, n)
            C = self.match(C, m, n, Pc)
            C = self.vari(C, m, n, Pm)
            S, F = self.fitness(C, m, n, W, V, w)
            B1, y1 = self.best_x(F, S, m)
            if y1 > y:
                y = y1
            Y.append(y)
            
        wx.StaticText(self.panel,label='遗传算法:', pos=(500,heigh))
        heigh = heigh+30
        wx.StaticText(self.panel,label='最大价值为:%d'%(y), pos=(500,heigh))
                   
    # 初始化,N为种群规模,n为染色体长度
    def init(self,N,n):
        C = []
        for i in range(N):
            c = []
            for j in range(n):
                a = np.random.randint(0,2)
                c.append(a)
            C.append(c)
        return C

    # 评估函数
    # x(i)取值为1表示被选中,取值为0表示未被选中
    # w(i)表示各个分量的重量,v(i)表示各个分量的价值,w表示最大承受重量
    def fitness(self,C,N,n,W,V,w):
        S = []     # 用于存储被选中的下标
        F = []     # 用于存放当前该个体的最大价值
        for i in range(N):
            s = []
            h = 0  # 重量
            f = 0  # 价值
            for j in range(n):
                if C[i][j]==1:
                    if h+W[j]<=w:
                        h=h+W[j]
                        f = f+V[j]
                        s.append(j)
            S.append(s)
            F.append(f)
        return S,F

    # 适应值函数,B位返回的种族的基因下标,y为返回的最大值
    def best_x(self,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(self,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(self,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(self,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(self,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


6、测试运行
图三

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值