Uso básico do Lingo

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

  1. O sufixo "lg4" indica o arquivo do modelo em formato lingo, que só pode ser aberto por software lingo;
  2. O sufixo “lng” representa o arquivo do modelo em formato de texto;
  3. O sufixo "ldt" indica arquivo de dados de linguagem;
  4. O sufixo "ltf" indica o arquivo de script de comando da linguagem;
  5. O sufixo "lgr" indica o arquivo de relatório de linguagem.

3. Explicação detalhada da janela

https://images.cnblogs.com/cnblogs_com/blogs/722174/galleries/2074790/o_220720124434_20180810095626910.png

4. Otimizar modelo

Normalmente, um modelo de otimização consiste nas três partes a seguir:

  1. Função objetivo: Geralmente expressa como encontrar o valor máximo ou mínimo de uma determinada expressão matemática
  2. Variáveis ​​de decisão: variáveis ​​das quais depende o número da função objetivo
  3. 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.

  1. @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.

  2. @soma

    Esta função retorna a soma de uma expressão que itera sobre os membros do conjunto especificado.

  3. @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

  1. @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.

  2. @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

  1. Exibir membros da lista: liste todos os nomes de membros, separados por vírgulas "," ou espaços.
  2. Listando implicitamente os membros do conjunto:setname/member1..memberN/[: attribute_list]; !用".."表示省略

https://images.cnblogs.com/cnblogs_com/blogs/722174/galleries/2074790/o_220720134335_v2-d8b383a5a69ec4e28d20af7435addd7a_r.jpg

  1. 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 = 12eu = 16ceu( xj-aeu)2+( vocêj-beu)2 é . t{ j = 12ceu=deu. eu=1 ,2 ,... ,6eu = 16ceuej,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 = 110éeuceué . t ( s1+é7-2 ) ( s9)=0é3é5+é4é5=0é5+é6+é7+é82eu = 110éeu=5éeu0 ,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

Acho que você gosta

Origin blog.csdn.net/qq_62789540/article/details/125926169
Recomendado
Clasificación