【问题标题】:Python number line cluster exercisePython数轴集群练习
【发布时间】:2019-07-31 02:15:45
【问题描述】:

我正在完成我的教科书(Ex 4.7)中的一个练习,并正在用 Python 实现代码来练习动态编程。我在实际执行算法 4.8 时遇到了一些麻烦。我明白发生了什么,直到我得到“否则范围 s1t-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)

非常感谢任何帮助!

【问题讨论】:

    标签: python algorithm cluster-analysis dynamic-programming


    【解决方案1】:

    算法很好。我的代码如下。

    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])
    

    一个建议: 不懂算法的时候,你可以在草稿纸上手一试,说不定你会弄清楚它是怎么工作的。

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 2022-06-10
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 2017-01-11
      • 1970-01-01
      相关资源
      最近更新 更多