Diretório de artigos
Sintaxe do Lingo
I. Visão geral
1. Introdução
LINGO é um software particularmente útil para resolver problemas de otimização, podendo resolver rapidamente programação linear, programação não linear, equações lineares e não lineares, etc.
(1) O modelo de programação matemática do LINGO contém três elementos: função objetivo, variáveis de decisão e restrições; (
2) No programa LINGO, cada declaração deve terminar com um ponto e vírgula em inglês, e uma declaração pode ser dividida em várias linhas.
(3) Os comentários do LINGO estão em inglês! Começam e devem terminar com ponto e vírgula em inglês;
(4) As variáveis LINGO não diferenciam maiúsculas de minúsculas e devem começar com uma letra, podendo conter números e sublinhados, com no máximo 32 caracteres; (5) No programa LINGO, desde
que como Depois de definir o conjunto, a ordem das outras instruções é arbitrária;
(6) As funções no LINGO começam com "@"; (7) Por padrão, todas as variáveis no programa LINGO
são não negativas; (8) "<" ou "
O sinal ">" tem a mesma função que o sinal "" ou " ".
2. Formato de arquivo
- O sufixo "lg4" indica o arquivo do modelo em formato lingo, que só pode ser aberto por software lingo;
- O sufixo “lng” representa o arquivo do modelo em formato de texto;
- O sufixo "ldt" indica arquivo de dados de linguagem;
- O sufixo "ltf" indica o arquivo de script de comando da linguagem;
- O sufixo "lgr" indica o arquivo de relatório de linguagem.
3. Explicação detalhada da janela
4. Otimizar modelo
Normalmente, um modelo de otimização consiste nas três partes a seguir:
- Função objetivo: Geralmente expressa como encontrar o valor máximo ou mínimo de uma determinada expressão matemática
- Variáveis de decisão: variáveis das quais depende o número da função objetivo
- Restrições: anexe algumas restrições condicionais às variáveis (geralmente expressas como equações ou desigualdades)
Nota: O padrão do Lingo é que todas as variáveis de decisão sejam positivas, portanto, as condições não negativas para as variáveis não precisam ser inseridas.
2. Operadores básicos
1. Operadores lógicos
- #not# Nega o valor lógico do operando, #not# é um operador unário
- #eq# Se os dois operandos forem iguais, é verdadeiro; caso contrário, é falso
- #ne# Se os dois operadores não forem iguais, é verdadeiro; caso contrário, é falso
- #gt# Se o operador à esquerda for estritamente maior que o operador à direita, é verdadeiro; caso contrário, é falso
- #ge# Se o operador à esquerda for maior ou igual ao operador à direita, é verdadeiro; caso contrário, é falso
- #lt# Se o operador à esquerda for estritamente menor que o operador à direita, é verdadeiro; caso contrário, é falso
- #le# Se o operador à esquerda for menor ou igual ao operador à direita, é verdadeiro; caso contrário, é falso
- #e# Somente quando ambos os parâmetros são verdadeiros, o resultado é verdadeiro; caso contrário, é falso
- #ou# Somente quando ambos os parâmetros são falsos, o resultado é falso; caso contrário, é verdadeiro
2. Operadores de comparação
Os operadores relacionais são completamente diferentes das comparações nos operadores lógicos: o primeiro é uma descrição verdadeira do relacionamento especificado pelo operador relacional no modelo, enquanto o último apenas determina se um relacionamento é satisfeito.
Existem três operadores no Lingo: =
,, >=、>
e.O <=、<
Lingo não suporta operadores relacionais estritamente menores que e estritamente maiores que.
A < B => A <= B
3. Operadores aritméticos
operador | descrever |
---|---|
- | Rebelião |
^ | poder |
* | pegar |
/ | remover |
+ | adicionar |
- | reduzir |
O único operador aritmético unário do Lingo é o operador de negação
A precedência dos operadores de alto para baixo é: negação -> menos
A ordem de prioridade pode ser alterada entre parênteses
3. Funções comuns
1. Funções matemáticas
@abs(x) Retorna o valor absoluto de x
@sin(x) Retorna o valor do seno de x, x está em radianos
@cos(x) Retorna o valor do cosseno de x
@tan(x) Retorna o valor da tangente de x
@ exp(x) Retorna a constante e elevada à potência de x
@log(x) Retorna o logaritmo natural de x
@lgm(x) Retorna o logaritmo natural da função gama de x
@sign(x) Se x<0 Retorna -1; caso contrário, retorna 1
@ floor(x) retorna a parte inteira de x. Quando x>=0, retorne o maior número inteiro não superior a x; quando x<0, retorne o maior número inteiro não inferior a x.
@smax(x1,x2,…,xn) Retorna o valor máximo entre x1, x2,…,xn
@smin(x1,x2,…,xn) Retorna o valor mínimo entre x1, x2,…,xn
2. Defina funções
@bin(x) limita x a 0 ou 1 — para planejamento 0-1
@bnd(L,x,U) limita L≤x≤U
@free(x) cancela a restrição de que o limite inferior padrão da variável x é 0 , Ou seja, x pode pegar qualquer número real
@gin(x) e restringir x a um número inteiro. Por padrão, o LINGO estipula que a variável é não negativa, o que significa que o limite inferior é 0 e o limite superior é +∞ . @free cancela o limite inferior padrão de 0, permitindo que as variáveis assumam valores negativos. @bnd é usado para definir os limites superior e inferior de uma variável.Também pode cancelar a restrição de que o limite inferior padrão seja 0.
3. Definir função de loop
@function(setname[(set_index_list)[|conditional_qualifier]]:
expression_list);
@function corresponde a uma das quatro funções de loop de conjunto listadas abaixo; setname é o conjunto a ser percorrido; set_index_list é a lista de índice de conjunto; condicional_qualifier é usado Limite o escopo da função de loop de conjunto. Quando a função de loop de conjunto atravessa cada membro do conjunto, o LINGO avaliará o qualificador_condicional. Se o resultado for verdadeiro, a operação @function será executada no membro. Caso contrário, ela será ignorada e continue a executar o próximo loop. expression_list é uma lista de expressões aplicadas a cada membro do conjunto. Ao usar a função @for, expression_list pode conter múltiplas expressões, separadas por vírgulas. Estas expressões serão adicionadas ao modelo como restrições. Ao usar as três funções de loop de conjunto restantes, expression_list só pode ter uma expressão. Se set_index_list for omitido, todos os atributos referenciados em expression_list serão do tipo setname.
-
@for
Esta função é usada para gerar restrições nos membros do conjunto. Linguagens de modelagem baseadas em escalares requerem entrada explícita de cada restrição. A função @for permite inserir apenas uma restrição e o LINGO gera automaticamente restrições para cada membro do conjunto. -
@soma
Esta função retorna a soma de uma expressão que itera sobre os membros do conjunto especificado.
-
@min e @max
retornam o valor mínimo ou máximo de uma expressão para o membro do conjunto especificado.
4. Funções auxiliares
-
@if(condição_lógica,resultado_verdadeiro,resultado_falso)
A função @if avaliará uma expressão lógica condição_lógica e retornará true_result se for verdadeiro, caso contrário, false_result.
-
@warn('text',logical_condition), se a condição lógica logic_condition for verdadeira, será gerada uma caixa de informações com o conteúdo de 'text'.
As demais funções podem ser consultadas no documento quando utilizadas.
4. Estabelecimento de modelo
1. Seção de coleta
Esta parte deve começar com "SETS:" e terminar com "ENDSETS". Ela é usada para definir as variáveis de conjunto necessárias (SET) e seus elementos (membros, ou seja, semelhantes a subscritos de array) e atributos (atributos, ou seja, semelhantes a arrays). .
Para definir um conjunto primitivo, ele deve ser especificado detalhadamente:
- Nome do conjunto
- Opcional, definir membro
- Opcional, defina propriedades de membro
Para definir um conjunto primitivo, use a seguinte sintaxe:
setname[/member_list/][:attribute_list]
- O conteúdo entre colchetes indica opcional
Várias maneiras de listar membros
- Exibir membros da lista: liste todos os nomes de membros, separados por vírgulas "," ou espaços.
- Listando implicitamente os membros do conjunto:
setname/member1..memberN/[: attribute_list]; !用".."表示省略
- Os membros do conjunto não são colocados na definição do conjunto, mas são definidos na seção de dados subsequente
Exemplo:
! 常用实例方法,创建一个罗列集
SETS:
QUARTERS/1,2,3,4/:DEM,RP,OP,INV; ! 生成四个属性,初始化值都为 [1 2 3 4]
factory /1..6/:a, b; ! 生成一个 1 x 6 的矩阵
! factory 称为数组的类型名,a, b 称为数组的变量名
plant /1..8/: c, d; ! 生成一个 1 x 8 的矩阵
Cooperation(factory,plant): e, f; ! 生成一个 6 x 8 的矩阵,如果交换一个位置,则,生成一个 8 x 6 的矩阵,也可以使用 link(factory, plant) 6 x 8
! Cooperation大工厂是由factory和plant两家小工厂合并而办,可生产6×8的矩阵
ENDSETS
! 初始化数据
DATA:
a = 1, 2, 3, 4, 5, 6
ENDDATA:
A matriz que precisa ser atribuída deve estar completa e você não pode atribuir apenas 3 valores a uma matriz de 6 elementos.
No Lingo, você pode atribuir números inteiros ou decimais a matrizes.
2. Seção de Metas e Restrições
Esta parte realmente define a função objetivo, restrições, etc., mas esta parte não possui as tags de início e fim dos segmentos, portanto, é na verdade o modelo de linguagem, exceto para os outros 4 segmentos (todos possuem tags de segmento claras).
Funções são geralmente usadas aqui. Por exemplo:
MIN = @SUM(QUARTERS:400*RP+450*OP+20*INV); ! @sum为一个求和函数,对这个一维数组求400*RP + 450*OP + 20*INV 的和,第一个参数传入集合的类型
@FOR(QUARTERS(I):RP(I)<40); ! 对 QUARTERS 进行遍历,传入类型名称,后面是操作,同时自动遍历PR里面的内容
@FOR(QUARTERS(I):I#GT#1:INV(I)=INV(I-1)+RP(I)+OP(I)-DEM(I););
INV(1) = 10+RP(1)+OP(1)-DEM(1);
5. Casos
1. Transporte e seleção do local
Uma empresa possui 6 canteiros de obras, as coordenadas de localização são (ai, bi) (unidade: quilômetros) e o consumo diário de cimento di (unidade: toneladas)
eu 1 2 3 4 5 6
a 1,25 8,75 0,5 5,75 3 7,25
b 1,25 0,75 4,75 5 6,5 7,75
d 3 5 4 7 6 11
Atualmente existem 2 pátios de materiais, localizados em A (5, 1) e B (2, 7).Nota (xj, yj), j=1,2, / i=1~6, com reservas diárias ej de 20 toneladas cada.
Suponha que haja uma estrada reta entre o pátio de materiais e o canteiro de obras. Desenvolva um plano de abastecimento diário, ou seja, quantas toneladas de cimento são transportadas do pátio de materiais A e B para cada canteiro de obras para minimizar o total de toneladas-quilômetros .
Considere a variável de decisão c_ij para representar a quantidade de cimento transportada do pátio de materiais j no canteiro de obras i. O modelo (modelo linear) é:
min ∑ j = 1 2 ∑ i = 1 6 cij ( xj − ai ) 2 + ( yj − bi ) 2 s . t { ∑ j = 1 2 cij = di . eu = 1, 2,. . . , 6 ∑ i = 1 6 cij ≤ ej , j = 1 , 2 \text{min} \sum_{j=1}^2{\sum_{i=1}^6{c_{ij}\sqrt{(x_j -a_i)^2+(y_j-b_i)^2}}}\\ st\left\{\begin{matriz} \sum_{j=1}^2 c_{ij}=d_i. i=1,2,...,6 \\ \sum_{i=1}^6 c_{ij} \le e_j,j=1,2 \end{matriz}\right.minj = 1∑2eu = 1∑6ceu( xj-aeu)2+( vocêj-beu)2é . t{
∑j = 12ceu=deu. eu=1 ,2 ,... ,6∑eu = 16ceu≤ej,j=1 ,2
Então, a solução pode ser obtida:
MODEL:
SETS:
demand/1..6/: a, b, d;
supply/1,2/:e, x, y;
link(demand, supply): c;
ENDSETS
DATA:
a=1.25 8.75 0.5 5.75 3 7.25;
b=1.25 0.75 4.75 5 6.5 7.75;
d=3 5 4 7 6 11;
x=5 2;
y=1 7;
e=20 20;
ENDDATA
MIN=@SUM(link(i, j):c(i, j)*@SQRT((a(i)-x(j))^2+(b(i)-y(j))^2)); ! express;
@FOR(demand(i):@SUM(supply(j):c(i,j))=d(i)); ! condition1;
@FOR(supply(j):@SUM(demand(i):c(i,j)) < e(j)); ! condition2;
END
2. Melhor escolha
Uma equipe de perfuração deseja determinar 5 poços para perfurar em busca de petróleo em 10 locais de poços disponíveis para minimizar o custo total de perfuração. Se os códigos de 10 localizações de poços forem s1, s2..., s10, os custos de perfuração correspondentes c1, c2,..., c10 são 5,8,10,6,9,5,7,6,10,8 . E as localizações dos poços A seleção deve atender às seguintes restrições:
(1) Escolha s1 e s7, ou escolha a perfuração s9;
(2) Se você escolher s3 ou s4, não poderá escolher s5, ou vice-versa;
(3) Em s5, s6, s7 , você só pode escolher dois no máximo em s8.
Tente estabelecer um modelo de programação inteira para este problema e determine a localização do poço selecionado.
Tabelas verdade podem ser usadas para estabelecer expressões de restrição
Considere a variável 0-1 s_i. Se s_i=1, significa que o i-ésimo poço está selecionado. Se s_i=0, significa que o i-ésimo poço não está selecionado. O modelo matemático é estabelecido da seguinte forma:
min ∑ i = 1 10 sicis .t { ( s 1 + s 7 − 2 ) ( s 9 ) = 0 s 3 s 5 + s 4 s 5 = 0 s 5 + s 6 + s 7 + s 8 ≤ 2 ∑ i = 1 10 si = 5 si ∈ 0 , 1 ( i = 1 , 2 , . . . , 10 ) \text{min} \sum_{i=1}^{10} { s_ic_i}\ \st \left\{\begin{matriz} (s_1+s_7 - 2)(s_9)=0 \\ s_3s_5+s_4s_5=0\\ s_5+s_6+s_7+s_8 \le 2\\ \sum_{ i=1 }^{10}s_i=5\\ s_i \in {0, 1}(i=1,2,...,10)\end{matriz}\right.mineu = 1∑10éeuceué . t⎩
⎨
⎧( s1+é7-2 ) ( s9)=0é3é5+é4é5=0é5+é6+é7+é8≤2∑eu = 110éeu=5éeu∈0 ,1 ( eu=1 ,2 ,... ,10 )
Então, a solução pode ser obtida:
MODEL:
SETS:
var/1..10/:s,c; ! 创建集合
ENDSETS
DATA:
c=5 8 10 6 9 5 7 6 10 8; ! 给集合赋值
ENDDATA
MIN = @SUM(var(i):s(i)*c(i)); ! 求解结果
(s(1)+s(7)-2)*s(9) = 0; ! 条件1
s(3)*s(5)+s(4)*s(5)=0; ! 条件2
s(5)+s(6)+s(7)+s(8)<2; ! 条件3
@SUM(var(i):s(i))=5; ! 条件4
@FOR(var(i):@BIN(s(i))); ! 条件5,使用for循环对s的每一个值进行约束,1代表true
END