兩種算法:
第一你在你的例子大多描述的一個。這給出了最有效的,並完成所有站點最快的遷移,但可能不是一個,讓更多站點的前期
第二可能產生更多的網站遷移速度更快
生產所有組件的列表。對於列表中的每個組件,產生僅對此組件具有依賴關係的站點的計數(SitesPendingOn)。以最多的一個,並分配一個MigrationOrder(升序號碼)。如果列表中沒有剩餘此類組件,則爲每個剩餘(未分配的遷移訂單)生成站點使用的計數:ComponentSiteUsageCount。以最多的一個,併爲其分配下一個MigrationOrder。對組件重複循環未分配MigrationOrder得到SitesPendingOn直到所有組件都分配MigrationOrder
對於每個站點,通過ComponentMigrationDate由最後ComponentMigrationDate開始的所有組件進行迭代。在迭代過程中,檢查網站是否具有該組件,並且該網站具有的第一個組件是SiteMigrationDate。保存具有電子表格:它需要遷移一個組件是所有組件的統一 注意時間:
對於第二種算法 '
import pandas as pd
def get_pending_sites(site_components, component, components):
count = 0
for index, site in site_components.iterrows():
#print('site ...', site['Site'])
if site[component] > 0. and components[component][0] == 0:
#print('site uses component')
other_dependent = False
for site_component in list(site_components.columns.values)[1:]:
if site_component != component:
if site[site_component] > 0. and components[site_component][0] == 0:
#print('site uses other components')
other_dependent = True
break
if other_dependent == False:
count += 1
#print('count', count)
return count
def get_used_sites(site_components, component):
count = len(site_components[site_components[component] > 0.])
print ("Component: ", component, " used in sites: ", count)
return count
def get_most_pending_sites(components):
most_count = 0
most_component = None
for component in components:
if components[component][0] == 0:
count = components[component][1]
if count > most_count:
most_component = component
most_count = count
elif (count == most_count) and (most_component != None):
if components[component][2] > components[most_component][2] :
most_component = component
return most_component
def get_most_used_sites(components):
most_count = 0
most_component = None
for component in components:
if components[component][0] == 0:
count = components[component][2]
if count > most_count:
most_component = component
most_count = count
return most_component
migration_order = 1
site_components = pd.read_csv('site_components.csv')
#print(site_components.describe())
components = dict.fromkeys(list(site_components.columns.values)[1:])
for component in components:
components[component] = [0, 0, 0]
components[component][2] = get_used_sites(site_components, component)
#print(components)
while True:
print("Components: ", components)
for component in components:
if components[component][0] == 0:
print('starting .....', component)
components[component][1] = get_pending_sites(site_components, component, components)
print('finished .....', component, components[component][1], components[component][2])
while True:
most_pending_sites_component = get_most_pending_sites(components)
print('most pending sites components: ', most_pending_sites_component)
if most_pending_sites_component != None:
components[most_pending_sites_component][0] = migration_order
migration_order = migration_order + 1
else:
break
most_used_sites_component = get_most_used_sites(components)
if most_used_sites_component != None:
components[most_used_sites_component][0] = migration_order
migration_order = migration_order + 1
else:
break
# order of migration in [0]
print("Components: ", components)
假設代碼網站和組件作爲csv,並刪除所有總計縱向和橫向
你應該edi t標籤來反映它比Python/Excel更多的算法。 – Antimony
這聽起來像是[關鍵路徑方法](https://en.wikipedia.org/wiki/Critical_path_method)問題的變體。 – jq170727