采用两人结对编程方式,设计开发一款{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、测试运行