避免 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

此转换由某些求解器自动完成。

请注意,有其他方法可以对 运行 的开头进行建模,并且通常有一些东西可以利用(取决于细节)。