Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多目标优化函数(gurobi)中确定系数的仿真_Python_Optimization_Mathematical Optimization_Gurobi - Fatal编程技术网

Python 多目标优化函数(gurobi)中确定系数的仿真

Python 多目标优化函数(gurobi)中确定系数的仿真,python,optimization,mathematical-optimization,gurobi,Python,Optimization,Mathematical Optimization,Gurobi,我正在为工业质量实验室中的作业车间调度建立一个相当大且复杂的优化模型,我正在使用gurobi 这是一个多目标模型,我需要在四台不同的机器上最小化处理时间,但我还需要对管道进行优先级排序,这将解锁更多的材料运送给客户(保持低库存) 一个管道可以关联一个或多个测试,我也可以关联多个管道到一个订单;完成所需的所有测试后,即可将订单发送给客户。管道被放入一些盒子中,然后被带到机器上(一台机器一次一个盒子),机器处理里面的所有管道 我的目标函数如下: OBJECTIVE = gp.quicksum(T

我正在为工业质量实验室中的作业车间调度建立一个相当大且复杂的优化模型,我正在使用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,直到某个阈值(假设每个30万)

在这种情况下,我有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)


问题仍然存在,是否有办法更改权重和优先级参数并获得不同的解决方案?

这并不总是可能的,但如果您可以用美元表示这两个目标,那么这个问题就会消失


否则,我通常做的是:(1)找到目标的“框”(每个目标的最小值/最大值),然后(2)进行粗略的网格搜索。这会产生一些结果,您可以使用这些结果来优化内容。(估计)有效边界的图片有助于交流信息,也有助于确定需要更精细网格的有趣区域(部分空间可能是平坦的)。

我刚刚查找了什么是网格搜索,这正是我所期待的,我的问题是,是否有一种使用gurobi或通用python代码来实现这一点的好方法。