Python 数线集群练习
Python number line cluster exercise
我正在完成教科书(Ex 4.7)中的练习,并且正在实现 Python 中的代码来练习动态规划。我在实际执行算法 4.8 时遇到了一些麻烦。我明白发生了什么,直到我到达“否则范围 s
从 1
到 t-1
并设置 s
以最小化 f(s)
。为什么本书在 for 循环中使用 s
并将其设置为函数 f(s)
?在 Python 中应该如何实现这一行?
[底部的当前代码]
我目前的代码是这样的:
x = [1,2,5,6,10]
k = 3
n = 5
r = [[0 for x in range(k)] for x in range(n)]
c = [[0 for x in range(k)] for x in range(n)]
def Union(lst1, lst2):
final_list = lst1 + lst2
return final_list
for j in range(k):
for t in range(n):
if j == 0:
r[t][j] = (x[t]-x[0])/2
c[t][j] = [(x[t]+x[0])/2]
else:
for s in range(t-1):
f = max(r[s][j-1], (x[t]-x[s+1])/2)
#set s to minimize f??
r[t][j] = f
w = []
w.append((x[t]+x[s+1])/2)
if c[s][j-1] == 0:
c[t][j] = w
else:
c[t][j] = Union(c[s][j - 1], w)
print(r)
print(c)
非常感谢任何帮助!
算法很好。我的代码如下。
x = [1,2,5,6,10]
k = 3
n = 5
r = [[[] for _ in range(k)] for _ in range(n)]
c = [[[] for _ in range(k)] for _ in range(n)]
def f(s, j_down, t):
return max(r[s][j_down], (x[t]-x[s+1])/2.)
def get_min_f_and_s(j_down, t):
""" range s from 1 to t-1 and set s to minimize f(s)
for example t=5 and j=3, so s range from 1 to 4, if f(1)=0.5, f(2)=0.4, f(3)=0.1, f(4)= 1.0, so f(4) is min one and s=2.
And r[5][j] = f(2).
"""
items = [(s, f(s, j_down, t))for s in range(t)]
s, min_f = min(items, key=lambda x:x[1])
return s, min_f
for j in range(k):
if j == 0:
for t in range(n):
for t in range(n):
r[t][j] = (x[t]-x[0])/2.0
c[t][j] = [(x[t]+x[0])/2.0]
else:
for t in range(1, n):
s, min_f = get_min_f_and_s(j-1, t)
r[t][j] = min_f
c[t][j] = c[s][j-1] + [(x[t]+x[s+1])/2.,]
print(r[-1][-1])
print(c[-1][-1])
一个建议:
不懂算法的时候,可以运行在草稿纸上手写,说不定你就会明白是怎么回事了。
我正在完成教科书(Ex 4.7)中的练习,并且正在实现 Python 中的代码来练习动态规划。我在实际执行算法 4.8 时遇到了一些麻烦。我明白发生了什么,直到我到达“否则范围 s
从 1
到 t-1
并设置 s
以最小化 f(s)
。为什么本书在 for 循环中使用 s
并将其设置为函数 f(s)
?在 Python 中应该如何实现这一行?
[底部的当前代码]
我目前的代码是这样的:
x = [1,2,5,6,10]
k = 3
n = 5
r = [[0 for x in range(k)] for x in range(n)]
c = [[0 for x in range(k)] for x in range(n)]
def Union(lst1, lst2):
final_list = lst1 + lst2
return final_list
for j in range(k):
for t in range(n):
if j == 0:
r[t][j] = (x[t]-x[0])/2
c[t][j] = [(x[t]+x[0])/2]
else:
for s in range(t-1):
f = max(r[s][j-1], (x[t]-x[s+1])/2)
#set s to minimize f??
r[t][j] = f
w = []
w.append((x[t]+x[s+1])/2)
if c[s][j-1] == 0:
c[t][j] = w
else:
c[t][j] = Union(c[s][j - 1], w)
print(r)
print(c)
非常感谢任何帮助!
算法很好。我的代码如下。
x = [1,2,5,6,10]
k = 3
n = 5
r = [[[] for _ in range(k)] for _ in range(n)]
c = [[[] for _ in range(k)] for _ in range(n)]
def f(s, j_down, t):
return max(r[s][j_down], (x[t]-x[s+1])/2.)
def get_min_f_and_s(j_down, t):
""" range s from 1 to t-1 and set s to minimize f(s)
for example t=5 and j=3, so s range from 1 to 4, if f(1)=0.5, f(2)=0.4, f(3)=0.1, f(4)= 1.0, so f(4) is min one and s=2.
And r[5][j] = f(2).
"""
items = [(s, f(s, j_down, t))for s in range(t)]
s, min_f = min(items, key=lambda x:x[1])
return s, min_f
for j in range(k):
if j == 0:
for t in range(n):
for t in range(n):
r[t][j] = (x[t]-x[0])/2.0
c[t][j] = [(x[t]+x[0])/2.0]
else:
for t in range(1, n):
s, min_f = get_min_f_and_s(j-1, t)
r[t][j] = min_f
c[t][j] = c[s][j-1] + [(x[t]+x[s+1])/2.,]
print(r[-1][-1])
print(c[-1][-1])
一个建议: 不懂算法的时候,可以运行在草稿纸上手写,说不定你就会明白是怎么回事了。