Você pode adicionar uma variável e uma igualdade linear para alguns . Então, o problema original é equivalente a maximizar no novo sistema.yy=cTx+c0c0y
Exceto pela condição . É aí que entra. Precisamos fazer grande o suficiente que para alguns viável (isto é e hold), temos . Nesse caso, não importa que a não-negatividade corte partes do espaço viável. O valor ideal ainda é o mesmo.y≥0c0c0xAx=bx≥0cTx+c0≥0
Então, como escolher ? Eu não sou especialista em otimização linear. Encontrar um viável é mais fácil do que encontrar um que maximize a função objetivo? caso, podemos considerar que é .c0x0c0−cTx0
Se os coeficientes dados são racionais, existe outro caminho. Primeiro, vamos estabelecer que o politopo de viável tem vértices (a menos que esteja vazio): Seja um ponto em uma célula de fronteira dimensional mínima do referido politopo. Por contradição, suponha que a dimensão desta célula seja . Então, existe um ponto diferente na mesma célula. Como a célula possui uma dimensão mínima, ela não tem limites; portanto, os pontos da forma estão na mesma célula e, portanto, no politopo. Como , alguns desses têm coordenadas negativas, contradizendo a condição polítopo .xp≥1qr=p+t(q−p)q−p≠0rr≥0
Agora, faça todos os coeficientes de e inteiros multiplicando pelo denominador comum. Seja a dimensão (o comprimento do vetor ) e seja o valor absoluto máximo de qualquer coeficiente de , ou . Em seguida, podemos vincular as coordenadas de qualquer vértice do polítopo possível por . Portanto, escolha .AbncMAbcn!⋅Mnc0:=n⋅n!⋅Mn+1
[EDITAR]
Ainda outra abordagem, caso você esteja disposto a ligar para o oráculo várias vezes: Primeiro, tente o acima com . Se você obtiver uma solução ou a resposta "ilimitada", está bem. Se a resposta for "insolúvel", é necessário descobrir se existem soluções com função objetiva negativa. Portanto, defina e maximize vez disso. Se você obtiver uma solução, poderá usá-la como . Se você ficar "insolúvel" novamente, estará pronto também. O último caso é a resposta "ilimitada". Então, você precisa experimentar cada vez maior (para poucas chamadas da Oracle, use uma função de crescimento rápido; a função Ackermann pode funcionar) até encontrar uma solução.c0=0z=−cTzx0c0