鋼管下料方案的生成方法(python3)

2021-09-25 13:25:07 字數 3311 閱讀 6415

'''

更新10根解的演算法

標準鋼管6公尺/根,需要截斷成不同長度的料,比如:

(1.2m, 0.8m*5, 2.3m, 4.1m, 0.65m*10, 3m*2, 1.8m, 1.9m*6, 1.5m, 5.1m*2, 3.1m*3)

如何獲取最優計畫:需要多少根標準鋼管,每一根怎麼截

'''def

getbestplan

(dict_plan)

:"""

分解相同規格的需求並排序

=> [1.2,0.8,0.8,0.8,0.8,0.8,2.3]

"""planlis =

[y for y in dict_plan for x in

range(0

, dict_plan[y])]

planlis.sort(reverse=

true

) res =

# 計畫表

n =-1

# 當前分割序號

while planlis :

) n +=

1 longest = planlis[0]

# 取當前最長的一根加入計畫

res[n]

surplusbest =

# 剩餘長度的最優組合

surpluslong =

6- longest # 剩餘長度

if surpluslong ==0:

# 剩餘長度surpluslong為0,跳到下一根計畫

planlis.remove(longest)

continue

# 過濾超過剩餘長度的

rightprepare =

list

(filter

(lambda x: x <= surpluslong, planlis[1:

]))if

not rightprepare:

# 無可以分割項,跳到下一根計畫

planlis.remove(longest)

continue

left,right =0,

1# 剩餘長度組合標記

currentcomp =

# 當前組合

while left <

len(rightprepare)-1

:# 當前組合為空,新增左標記if)

t = surpluslong -

sum(currentcomp)

if t ==0:

# 最佳計畫,退出迴圈

surplusbest = currentcomp

break

t = surpluslong -

sum(currentcomp)

- rightprepare[right]

if t <0:

# 組合超出剩餘長度

# 對比最佳計畫,如果更佳則替換

# 左標記右移,又標記還原到到左標記+1

ifsum

(currentcomp)

>

sum(surplusbest)

: surplusbest = currentcomp

left +=

1 right = left +

1 currentcomp =

else:)

if right ==

len(rightprepare)-1

:# 如果右標記已經到末尾,對比最佳計畫,如果更佳則替換

# 左標記右移1,右標記還原到左標記+1

ifsum

(currentcomp)

>

sum(surplusbest)

: surplusbest = currentcomp

left +=

1 right = left +

1 currentcomp =

else

:# 右標記右移1

right +=

1# 新增到計畫,並刪除已新增項

for x in surplusbest:

res[n]

planlis.remove(x)

planlis.remove(longest)

return res

if __name__ ==

'__main__'

: test =

res = getbestplan(test)

print

("下料總數:%d"

%len

(res)

)for inx, item in

enumerate

(res)

:print

("no:%2d used:%.2f"

%(inx +1,

sum(item)

), item)

下料總數:10

no:1 used:

5.90

[5.1

,0.8

]no:

2 used:

5.90

[5.1

,0.8

]no:

3 used:

6.00

[4.1

,1.9

]no:

4 used:

5.90

[3.1

,1.2

,0.8

,0.8

]no:

5 used:

5.85

[3.1

,0.8

,0.65

,0.65

,0.65

]no:

6 used:

5.90

[3.1

,1.5

,0.65

,0.65

]no:

7 used:

6.00[3

,3]no:

8 used:

6.00

[2.3

,1.9

,1.8

]no:

9 used:

5.75

[1.9

,1.9

,0.65

,0.65

,0.65

]no:

10 used:

5.10

[1.9

,1.9

,0.65

,0.65

]

陣列的生成方法

1 1.由列表生成 2np.array list output array list 34 2.陣列的基本操作 56 import numpy as np78 10種陣列初始化方法 9 1 建立乙個長度為10的陣列,陣列的值都是0 10 np.zeros 10,dtype int 1112 2 建立...

flickr 的全域性主鍵生成方案

類似於京東的資料庫設計,我們的使用者分庫有 shop 1 2 3 4 那麼uid怎樣生成?現在的做法是在用一張索引表 shop share.user index 取其自增主鍵,insert id 便是uid。但缺點是,有單點負載的風險。flickr提供了乙個擴充套件的更好的方案 他們把 user i...

基於mysql的全域性ID生成方案

背景介紹 隨著資料庫容量的增加,在對資料庫完成垂直拆分效果不是很理想的情況下需要對資料庫進行水平拆分,而由於乙個表被分成了多份,不能再使用之前的單錶的自增id作為主鍵,所以需要乙個全域性的id生成器來統一的進行id分配,全域性id的生成有很多種方案,此處介紹乙個最簡單的實現。實現方案 mysql作為...