有这样的类:
class IdleArc:
def __init__(self,data):
self.data=data
实例化弧段类arc1=IdleArc(2),arc2=IdleArc(5),arc3=IdleArc(7),arc4=IdleArc(4),arc5=IdleArc(5)
这些实例化后的弧段按照上面的顺序存放在列表arc_list中,有两个固存值fix1=13,fix2=8,先在弧段中寻找满足首次加和大于13的弧段
然后再继续寻找首次加和大于8的弧段,选择的结果应该是,arc1,arc2,arc3,满足大于13,
arc4,arc5满足大于8,被大于13的用过的弧段不能再继续使用。
下面代码是升级后的版本,考虑了0等极端的情况
class IdleArc:
def __init__(self, data):
self.data = data
self.datasource=None
arc_list = []
arc_list.append(IdleArc(2))
arc_list.append(IdleArc(5))
arc_list.append(IdleArc(7))
arc_list.append(IdleArc(4))
arc_list.append(IdleArc(5))
def storage_find_used_arc(arc_list_calc,data_value,datasourace=None):#,给定固存或者交换机的数据量,给定出数据是固存还是交换机的
#固存找到使用的弧段
#如果要下载的数据为0,直接返回空
#如果弧段为空,直接不用计算了,数据被消耗为0,数据剩余为数据的大小
sum_data = 0
consum_data = 0 # 任务被消耗的数据
residue_data = 0 # 固存中剩余的数据量
find_used_arc = []
if len(arc_list_calc)==0: #没有弧段
residue_data=data_value
print(f"弧段个数为0,没有消耗数据,消耗数据{consum_data},剩余数据{residue_data}")
return find_used_arc,consum_data,residue_data
if data_value==0: #若没有数据,那么选中的弧段为0,消耗数据为0,剩余数据为0
return find_used_arc, consum_data, residue_data
if data_value == 0:
return find_used_arc
for arc in arc_list_calc:
sum_data += arc.data
arc.datasource = datasourace
find_used_arc.append(arc)
#说明弧段足够多,可以把数据下载下来
if sum_data >=data_value: #等号放在这里
print(f"数据已经下载完毕,消耗数据{consum_data},剩余数据{residue_data}")
consum_data=data_value
residue_data=data_value-consum_data # 固存中剩余的数据量
break
else:#说明弧段不够,还剩下了数据
consum_data=sum_data
residue_data = data_value - consum_data
print(f"弧段不够数据还有剩余,消耗数据{consum_data},剩余数据{residue_data}")
return find_used_arc,consum_data,residue_data #固存中剩余的数据量
fix1 = 18
fix2 = 0
result1 = []
result2 = []
copy_arc_list_1=arc_list[:]
result1,consum_data1,residue_data1 =storage_find_used_arc(copy_arc_list_1, fix1, datasourace=0)
copy_arc_list_2=[arc for arc in arc_list if arc not in result1 ]
result2,consum_data2,residue_data2 = storage_find_used_arc(copy_arc_list_2,fix2,datasourace=1)
a=result1
c=consum_data1
d=residue_data1
b=result2
e=consum_data2
f=residue_data2
e=3