亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在執行變量嵌套循環以進行置換之前應用條件

在執行變量嵌套循環以進行置換之前應用條件

慕無忌1623718 2022-12-20 11:01:57
我需要通過以下方式獲得排列:我有N插槽,這個插槽可以填充從1 to D. 為了得到所有可能的排列,我寫了一個循環,它給了我每一種不同的可能性。這些循環看起來有點“奇怪”,因為它是一個需要可變的嵌套循環。這個循環需要兩天時間才能完成(對于我的 N = 8 和 D = 25 的條件),但是我只需要槽中變量之和等于 的排列"D"。import numpy as npfrom tqdm import tqdmN = 4 # actualy 8D = 16  # actually 25test = np.ones(shape=N)for k in range(0,pow(D-1,N)):    if sum(test) == D:        print("this is a suiting fit!",test)    # last one gets always changed    if test[N-1]+1 < D:        test[N-1] += 1    else:        test[N-1] = 1        for idx in range(2,len(test)+1):            if test[len(test) -idx] + 1 < D:                test[len(test) - idx] += 1                break            else:                test[len(test) - idx] = 1由于上面的循環可能看起來有點混亂,我將它加入了嵌套循環for i in range(0,D-1):    for j in range(0,D-1):        for k in range(0,D-1):            for l in range(0,D-1):                if k+1+l+1+j+1+i+1 == D:                    print("this is a suting fit!",k+1,l+1,j+1,i+1)我不知道如何通過簡化或在遍歷排列之前應用條件來使其更快,感謝任何幫助
查看完整描述

2 回答

?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

我可能沒有完全理解這個問題,但是,如果我理解了,這種完全不同的方法可以在幾秒鐘內解決N=8,實例。D=25


>>> sum(1 for x in gensums(4, 16))

455

似乎與您的代碼返回的內容相匹配,并且


>>> sum(1 for x in gensums(8, 25))

346104

上次運行的示例x:


[9, 2, 3, 1, 1, 1, 1, 7]

這在嘗試擴展部分解決方案的過程中使用遞歸來應用約束,因此可以提前切斷許多無結果的路徑。


注意:為了提高效率,它產生的列表通常是同一個列表對象,所以如果你想保存結果供以后使用,一定要復制每個結果。


編輯:替換為更快的版本,也許更清晰一些。


編輯:還有一個改進:添加nslots == 1允許斷言的情況remaining并且nslots在函數入口處都是非零的。


def gensums(N, D):

    def inner(sofar, nslots, remaining):

        assert remaining and nslots

        # If only 1 slot left, it's forced.

        if nslots == 1:

            sofar.append(remaining)

            yield sofar

            sofar.pop()

            return

        # If num slots equal to remaining, they must all be 1.

        if nslots == remaining:

            yield sofar + [1] * remaining

            return

        # What can we add next?

        # What's left over must be enough to put at least 1 into

        # each slot, so must have:

        #     remaining - candidate >= nslots - 1, or

        #     candidate <= remaining - nslots + 1

        sofar.append(None)

        for candidate in range(1, remaining - nslots + 2):

            sofar[-1] = candidate

            yield from inner(sofar, nslots - 1,

                             remaining - candidate)

        sofar.pop()

    return inner([], N, D)


查看完整回答
反對 回復 2022-12-20
?
茅侃侃

TA貢獻1842條經驗 獲得超21個贊

您可以使用排列并給出長度。


from itertools import permutations

d = 16  

n = 4

for item in permutations(range(d), r=n):

    if sum(item) == d:

        print("this is a suiting fit!", item)

我想你可能不需要排列


from itertools import product

d = 16  

n = 4

for item in product(range(d), repeat=n):

    if sum(item) == d:

        print("this is a suiting fit!", item)


查看完整回答
反對 回復 2022-12-20
  • 2 回答
  • 0 關注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號