避免 GAMS 中的非线性
Saving from nonlinearity in GAMS
我正在尝试解决时间跨度为 5 天的机器分配问题。生产计划很难赶上,所以我的 objective 是尽量减少机器总工作时间。机器使用模具进行生产,每种产品都有模具。如果产品是在一天结束时生产的,并且如果稍后会有生产,则该机器所需的总设置应减少一个。为此,
sets
i: mold type
j:jobs
k: days
parameters
x(i,k) ith mold production needed at day k
y(i,j) 1 if ith mold is compatible with jth machine
Decision variable
m(i,j,k) : 1 if ith mold processed in jth machine in day k 0 o/w
b(j,k) setup number of jth machine in day k
在计算第 1 天的设置数时,b(j,’1’)
简单地等于 m(i,j,k)
。
为了计算其他日期的设置数,我尝试了这些,但这些使问题变得非线性,需要几个月的时间才能解决。
b(j,'2')=e=sum(i,m(i,j,'2')) - sum(i,m(i,j,'2')*m(i,j,'1'))
这样的话,如果模具i
这两天都生产出来了,那么第二天就不会再做setup了。为了抑制多重设置减少,我输入:sum(i,m(i,j,'2')*m(i,j,'1')) =l= 1
那么,如果机器前一天使用过模具,我该如何减少机器的设置数而不会使问题非线性化。
可以线性化m(i,j,'2')*m(i,j,'1')
:
Both(i,j) <= m(i,j,'2')
Both(i,j) <= m(i,j,'1')
Both(i,j) >= m(i,j,'2')+m(i,j,'1')-1
Both(i,j) is a binary variable
此转换由某些求解器自动完成。
请注意,有其他方法可以对 运行 的开头进行建模,并且通常有一些东西可以利用(取决于细节)。
我正在尝试解决时间跨度为 5 天的机器分配问题。生产计划很难赶上,所以我的 objective 是尽量减少机器总工作时间。机器使用模具进行生产,每种产品都有模具。如果产品是在一天结束时生产的,并且如果稍后会有生产,则该机器所需的总设置应减少一个。为此,
sets
i: mold type
j:jobs
k: days
parameters
x(i,k) ith mold production needed at day k
y(i,j) 1 if ith mold is compatible with jth machine
Decision variable
m(i,j,k) : 1 if ith mold processed in jth machine in day k 0 o/w
b(j,k) setup number of jth machine in day k
在计算第 1 天的设置数时,b(j,’1’)
简单地等于 m(i,j,k)
。
为了计算其他日期的设置数,我尝试了这些,但这些使问题变得非线性,需要几个月的时间才能解决。
b(j,'2')=e=sum(i,m(i,j,'2')) - sum(i,m(i,j,'2')*m(i,j,'1'))
这样的话,如果模具i
这两天都生产出来了,那么第二天就不会再做setup了。为了抑制多重设置减少,我输入:sum(i,m(i,j,'2')*m(i,j,'1')) =l= 1
那么,如果机器前一天使用过模具,我该如何减少机器的设置数而不会使问题非线性化。
可以线性化m(i,j,'2')*m(i,j,'1')
:
Both(i,j) <= m(i,j,'2')
Both(i,j) <= m(i,j,'1')
Both(i,j) >= m(i,j,'2')+m(i,j,'1')-1
Both(i,j) is a binary variable
此转换由某些求解器自动完成。
请注意,有其他方法可以对 运行 的开头进行建模,并且通常有一些东西可以利用(取决于细节)。