我正在为一个工业质量实验室的Job Shop调度构建一个相当大且复杂的优化模型,我正在使用gurobi。
这是一个多目标模型,我需要最小化四台不同机器上的处理时间,但我还需要优先安排管道,这些管道将释放更多的材料运往客户(保持低库存)。
一个管道可以关联一个或多个测试,我也可以将多个管道关联到一个订单;一旦完成了所有需要的测试,订单就可以发送给客户端。管道被放在一些盒子里,然后被带到机器上(一台机器一次一个盒子),机器处理里面的所有管道。
我的目标函数如下:
OBJECTIVE = gp.quicksum(T[m] for m in machines)
- gp.quicksum(Pipe_Box[i,ii,c] * box_convenience[i][ii] * k1
for i in pipes for ii in pipes for c in boxes if pipes.index(ii) >
pipes.index(i))
- gp.quicksum(Weight_Check[i,c,m] * Pipe_Weight_Flag[i] * k2 for
i in pipes for c in boxes for m in machines)首先,我最小化机器时间。
其次,我正在考虑这样一个事实:如果我将与订单关联的所有管道放在一个盒子中,那么我将比将这些管道放在不同的盒子中更快地解锁订单。
第三,也是最后一点,我正在考虑所有订单重量/测试数量在5吨以上的订单。
T[m], Pipe_Box[i,ii,c] and Weight_Check[i,c,m]是我的变量。
box_convenience[i][ii] and Pipe_Weight_Flag[i]是二进制参数,它们告诉我不同的管道是否属于相同的顺序,以及消泡率是否大于5吨
k1 ad k2是系数,我需要知道,对于多目标函数,它们的最佳配置是什么。
我正在考虑运行一个带有两个嵌套循环的模拟,从零开始k1和k2,并将它们递增+100直到某个阈值(假设每个阈值为3000 )。
在这种情况下,我会有90个不同的模型迭代,因此有不同的解决方案。
我想知道在gurobi中是否有一个内置的工具来执行这个任务,或者我是否可以使用另一种方法并使用像simpy这样的库来实现我想要的。
Gurobi将目标函数保存在一个具有专有.sol扩展名的文本文件中(我认为,这是一个普通的文本文件),其结构如下:
# Solution for model Job Shop Scheduling
# Objective value = 1.9384345683700005e+04
T[M1] = 1000
T[M2] = 5332
...
Pipe_Box[Pipe1,Pipe2,Box1] = 1
Pipe_Box[Pipe1,Pipe2,Box2] = 0
...我从来不需要做这样的事情,我有点不知所措,任何投入或帮助都会非常感谢!
编辑:我看到gurobi支持多目标优化,所以下面的代码可以工作:
model.setObjectiveN(gp.quicksum(T[m] for m in machines), 2, 1)
model.setObjectiveN(- gp.quicksum(Pipe_Box[i,ii,c] * box_convenience[i][ii]
for i in pipes for ii in pipes for c in boxes if
pipes.index(ii) > pipes.index(i), 1, 1)
model.setObjectiveN(- gp.quicksum(Weight_Check[i,c,m] * Pipe_Weight_Flag[i] * k2
for i in pipes for c in boxes for m in machines, 1, 1)问题仍然是一样的,有没有办法改变权重和优先级参数并获得不同的解决方案?
发布于 2021-02-06 04:04:41
这并不总是可能的,但如果你能用美元来表达这两个目标,那么这个问题就解决了。
否则,我通常做的是:(1)找到目标的“框”(每个目标的最小/最大值),然后(2)进行粗略的网格搜索。这将生成一些结果,您可以使用这些结果来改进内容。(估计的)有效边界的图片可以帮助交流事物,还可以帮助识别需要更精细网格的有趣区域(空间的某些部分可能是平的)。
https://stackoverflow.com/questions/66063057
复制相似问题