两种算法:
第一你在你的例子大多描述的一个。这给出了最有效的,并完成所有站点最快的迁移,但可能不是一个,让更多站点的前期
第二可能产生更多的网站迁移速度更快
生产所有组件的列表。对于列表中的每个组件,产生仅对此组件具有依赖关系的站点的计数(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