python 穷举2个半潜船去a,b两个集结点运输5个军舰艇(往返运输)

这是一个结合选址、路径、装卸的穷举问题,军舰艇到集结点的不是固定的,也就是说每个军舰艇都可以选择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)

 

 

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。