日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

背包问题追踪解

發布時間:2024/9/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 背包问题追踪解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

混合背包問題通用處理如下,我們以通用狀態方式處理解空間的追蹤:

def pack_01_and_complete_and_multiple_Bottom_up(N,V,C,W,M):list = np.zeros((N+1,V+1),dtype=int)for i in range(1,N+1):for j in range(0,V+1):t = min(j // C[i-1],M[i-1])result = -1000for k in range(t+1):A = list[i-1,j-k*C[i-1]] + k*W[i-1]if A > result:result = Alist[i,j] = result return list[N,V]

我們用G[i][v]來追蹤解,這里面記錄的是在i,v狀態下取了多少件i物品

def pack_01_and_complete_and_multiple_Bottom_up(N,V,C,W,M):list = np.zeros((N+1,V+1),dtype=int)G = np.zeros((N+1,V+1),dtype=int)for i in range(1,N+1):for j in range(0,V+1):t = min(j // C[i-1],M[i-1])result = -1000for k in range(t+1):A = list[i-1,j-k*C[i-1]] + k*W[i-1]if A > result:result = AG[i,j] = klist[i,j] = result return list[N,V] ,G

然后逆向搜索解空間得到PATH

def decode_G(G,N,V,W,C):i = Nv = Vwhile i > 0:print("Choose value {} : cost {}: how many {}".format(W[i-1],C[i-1],G[i,v]))v -= G[i,v]*C[i-1]i -= 1

運行結果:

python N = 8 V = 20 C = [11,2,3,9,13,6,7,5] W = [1,2,5,7,5,11,6,14] M = [10,2,9,1,19,3,4,1]value,path = pack_01_and_complete_and_multiple_Bottom_up(N,V,C,W,M) print value decode_G(path,N,V,W,C)41 Choose value 14 : cost 5: how many 1 Choose value 6 : cost 7: how many 0 Choose value 11 : cost 6: how many 2 Choose value 5 : cost 13: how many 0 Choose value 7 : cost 9: how many 0 Choose value 5 : cost 3: how many 1 Choose value 2 : cost 2: how many 0 Choose value 1 : cost 11: how many 0

選與不選,就是01問題的追蹤:

import numpy as np def pack_01_track_solution_Bottom_up(N,V,C,W):track_solution = np.zeros((N+1,V+1),dtype = int)list =[0]*(V+1)for i in range(1,N+1):for v in range(V,C[i-1]-1,-1):if list[v] < list[v-C[i-1]] + W[i-1]:list[v] = list[v-C[i-1]] + W[i-1]track_solution[i,v] = 1 # else: # track_solution[i,v] = 0 return list[V],track_solution def track_solution(G,N,V,W,C):i = Nv = Vwhile i > 0:print("Choose value {} : cost {}: how many {}".format(W[i-1],C[i-1],G[i,v]))v -= G[i,v]*C[i-1]i -= 1

無限數量,完全背包問題,標記函數:

def pack_complete_track_solution_Bottom_up(N,V,C,W):track_solution = np.zeros((N+1,V+1),dtype = int)track_solution[1:,1:] =-1list =[0]*(V+1)for i in range(1,N+1):for v in range(C[i-1],V+1):if list[v] <= list[v-C[i-1]] + W[i-1]:list[v] = list[v-C[i-1]] + W[i-1]track_solution[i,v] = ielse:track_solution[i,v] = track_solution[i-1,v]return list[V],track_solution def track_solution_standard(G,N,V,W,C):i = Nv = Vwhile G[i,v] !=0: i = G[i,v]m = 0while G[i,v] == i:# 在v的方向上搜索m +=1v -=C[i-1] print("Choose value {} : cost {}: how many {}".format(W[i-1],C[i-1],m))while G[i,v] == -1:# 在i的方向上搜索i -=1#%% N = 8 V = 30 C = [11,2,3,9,13,6,15,7,19] W = [1,2,5,7,5,11,6,14] value,path = pack_complete_track_solution_Bottom_up(N,V,C,W) print value print path track_solution_standard(path,N,V,W,C) 58 [[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0][ 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1][ 0 -1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22 2 2 2 2 2 2][ 0 -1 -1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 33 3 3 3 3 3 3][ 0 -1 -1 -1 -1 -1 -1 -1 -1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 33 3 3 3 3 3 3][ 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 3 3 3 3 3 3 3 3 3 33 3 3 3 3 3 3][ 0 -1 -1 -1 -1 -1 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 66 6 6 6 6 6 6][ 0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 6 6 6 6 6 6 6 66 6 6 6 6 6 6][ 0 -1 -1 -1 -1 -1 -1 8 8 8 8 8 -1 8 8 8 8 8 8 8 8 8 8 88 8 8 8 8 8 8]] 8 Choose value 14 : cost 7: how many 4 2 Choose value 2 : cost 2: how many 1

標記函數首先是得到標記列表,又叫映射表,追蹤解的過程實際就是一個雙指針模型的搜索,在這里對應的就是i,v怎么收縮,編碼過程,先把表畫出來,確定雙針移動的方式,最后確定邊界條件,也就是循環的條件。

總結

以上是生活随笔為你收集整理的背包问题追踪解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。