这是一个结合选址、路径、装卸的穷举问题,军舰艇到集结点的不是固定的,也就是说每个军舰艇都可以选择1,2两地集结,所以集结方案就有2**5=32种,然后根据1,2两集结点的军舰艇数量穷举半潜船的往返运输路线。每个半潜船的满载量是4个,也就是说半潜船装完4个就必须去终点,终点用3代替。(最终的运输方案应该不超过32*16)
注:本问题是组合运输,可以由一艘船运输,也可以由两艘船共同完成运输
输出结果希望如下:
1 集结点{1:2,2:3} 半潜船1运输路线为[1,2,3],半潜船2运输路线为[2,3]
2 集结点{1:2,2:3} 半潜船1运输路线为[1,2,3,1,3],半潜船2运输路线[]
.............
下面是我自己的瞎操作,主要是要往返不知道怎么循环
count=0 b=[] set_all=set(range(1,6)) for i in range(0,6): for L1 in itertools.combinations(range(1,6), i): a = [] rem=set_all-set(L1) a.append(list(set(L1))) a.append(list(rem)) b.append(a) print(b) #这是32种集结方案 dian = {1: 2, 2: 3}#这里代表集结点军舰艇数量 ship = {'ship1':4, 'ship2':4}#半潜船实时的可装载量 ship1path=[] ship2path=[] destination=3 for key in ship: for key1 in dian: if ship[key] >=dian[key1]!=0: ship[key]=ship[key]-dian[key1] dian[key1] = 0 if key=='ship1': ship1path.append(key1) if dian[1] == 0 and dian[2] == 0: ship1path.append(3) if ship[key]==0: ship1path.append(3) if key == 'ship2': ship2path.append(key1) if dian[1] == 0 and dian[2] == 0: ship1path.append(3) if ship[key]==0: ship2path.append(3) if ship[key] < dian[key1]: dian[key1] = dian[key1]- ship[key] ship[key] = 0 if key=='ship1': ship1path.append(key1) if dian[1] == 0 and dian[2] == 0: ship1path.append(3) if ship[key]==0: ship1path.append(3) if key == 'ship2': ship2path.append(key1) if dian[1] == 0 and dian[2] == 0: ship1path.append(3) if ship[key]==0: ship2path.append(3) if dian[1]==0 and dian[2]==0: continue # if dian[key1]==0: print(ship1path) print(ship2path)
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。