我正在尝试编写一个程序,将一些驳船与一些船配对。每个驳船都有一定的体积。每艘船最多可容纳4艘驳船,并推至一定的总体积(因船而异)。最终目标是在放置每艘驳船时使用尽可能少的船。
我尝试将scipy.optimize.differential_evolution与各种策略和参数以及初始猜测结合使用。我只是将它吐出来的数字变成整数,以便可以将它们用于链接到特定的驳船。从优化器获取args之后,目标函数执行一些工作(未显示),然后查看条件是否满足并基于此返回值。这是一些代码,通常显示我在fobj中的工作(我不包括完整的代码,因为如果没有我设置的类的结构等很难理解):
bargeSpecsMet = True
boatSpecsMet = True
dumbBarge = 0
dumbBoat = 0
#sums up how many barges have either no assignment or more than 1 assignement
#each barge can only be in one place
for each in barges:
dumbBarge += abs(barge.numAssignments - 1)
if dumbBarge > 0:
bargeSpecsMet = False
#checks each boat to see if it over capacity
for each in boats:
if boats.totalBBLs > boats.maxBBLs:
boatSpecsMet = False
dumbBoat += 1
#returns a very large number based on how many barges aren't correct first
#does this until the barges have exactly 1 assignment each
if bargeSpecsMet == False:
return dumbBarge * 1e20
#returns a still large but smaller number based on how many boats are overcapacity
#does this until each barge is under capacity
if boatSpecsMet == False:
return dumbBoat * 1E10
#there will be more code for minimizing number of boats but i haven't gotten there yet
我之所以使用differential_evolution,主要是因为我在最小化传统数学函数的另一个项目中使用它很熟悉。我不认为它可能是用于离散放置的东西,但它确实可行。不幸的是,它不想偏离我的最初猜测。有人对此有任何提示吗?是否有人熟悉另一个更适合的求解器或方法?我对python和这种问题还比较陌生,所以我只是不知道我所不知道的东西...
到目前为止,我想出的唯一其他方法是通过生成任务组合来强行使用它,看看是否可行,如果不冲洗再重复一次。我尚未实现它,因为我知道这将永远需要一个解决方案。