Thursday 26 October 2017

Proc Optmodel Binary Options


Estou tentando ler uma quantidade moderadamente grande de dados em PROC OPTMODEL conjuntos, como em: onde ampquotedshops macrovariable contém uma lista de seqüências de caracteres, cada um cotado, delimitado por uma vírgula. O conjunto de dados KRN contém variáveis ​​binárias 0-1 com comprimento de 3, cada uma para cada cadeia na macrovariable, e a variável ID KLU única em cada linha. Toda a construção é suposto fazer lista dupen bidimensional e funciona perfeitamente em número limitado de observações e / ou variáveis, mas o conjunto de dados alvo terá cerca de 200K para alguns milhões de observações com 5800 de variáveis ​​binárias, e chokes maneira antes disso: (KRT sendo outra tabela foram ficando apenas 2 variáveis ​​de). Existe uma maneira de escrevê-lo de forma diferente, armazenar a matriz em disco, aplicar as restrições ao conjunto de dados em alguma forma ou forma, ou qualquer sas opções / configuração que pode me ajudar a executá-lo. Você pode especificar opções para controlar como o modelo de otimização é processado e como os resultados são exibidos. Esta é a sintaxe: As seguintes opções podem aparecer na instrução PROC OPTMODEL (essas opções também podem ser especificadas pela instrução RESET). CDIGITS num especifica o número esperado de dígitos decimais de precisão para restrições não-lineares. O valor pode ser fracionário. PROC OPTMODEL usa esta opção para escolher um comprimento de etapa quando são necessárias aproximações numéricas derivadas para avaliar o Jacobiano de restrições não-lineares. O valor padrão depende do seu ambiente operacional. Assume-se que os valores de restrição são precisos aos limites da precisão da máquina. Consulte a seção Diferenciação automática para obter mais informações sobre aproximações de derivativos numéricos. FDFORWARDCENTRAL seleciona o método usado para aproximar derivadas numéricas quando derivadas analíticas não estão disponíveis. A maioria dos resolvedores requer os derivados do objetivo e restrições. Os métodos disponíveis são os seguintes: FDFORWARD usar diferenças diretas FDCENTRAL usar diferenças centrais O valor padrão é FORWARD. Consulte a seção Diferenciação automática para obter mais informações sobre aproximações de derivativos numéricos. FDIGITS num especifica o número esperado de dígitos decimais de precisão para a função objetivo. O valor pode ser fracionário. PROC OPTMODEL usa o valor para escolher um comprimento de etapa quando derivadas numéricas são necessárias. O valor padrão depende do seu ambiente operacional. Supõe-se que os valores da função objetivo são precisos aos limites da precisão da máquina. Consulte a seção Diferenciação automática para obter mais informações sobre aproximações de derivativos numéricos. INITVAR NOINITVAR seleciona se deve ou não passar valores iniciais para variáveis ​​para o solver quando a instrução SOLVE é executada. INITVAR permite que os valores da variável atual sejam passados. NOINITVAR faz com que o solucionador seja invocado sem valores iniciais específicos para variáveis. A opção INITVAR é o padrão. Observe que os solucionadores LP e QP sempre ignoram os valores iniciais. Os resolvedores NLPU, NLPC, SQP e IPNLP tentam usar valores iniciais especificados. O solucionador MILP usa valores iniciais somente se a opção PRIMALIN for especificada. INTFUZZ num especifica a tolerância para arredondamento dos limites em inteiro e variáveis ​​binárias para valores inteiros. Os limites que diferem de um número inteiro no máximo num são arredondados para esse inteiro. Caso contrário, os limites inferiores são arredondados para o próximo inteiro maior e os limites superiores são arredondados para baixo para o próximo número menor. O valor de num pode variar entre 0 e 0,5. O valor padrão é 0,00001. MAXLABLEN num especifica o comprimento máximo para etiquetas de linha e coluna MPS. O intervalo permitido é 8 a 256, com 32 como o padrão. Essa opção também pode ser usada para controlar o comprimento dos nomes de linhas e colunas exibidos por solucionadores, como os encontrados no log de iteração do solver do LP. O MISSCHECK NOMISSCHECK permite verificar detalhadamente os valores em falta nas expressões. MISSCHECK solicita que uma mensagem seja produzida cada vez que PROC OPTMODEL avalia uma operação aritmética ou função incorporada que tem operandos de valor faltando (exceto quando a operação ou função suporta especificamente valores ausentes). A opção MISSCHECK pode aumentar o tempo de processamento. NOMISSCHECK desativa esse relatório detalhado. NOMISSCHECK é o padrão. PDIGITS num solicita que a instrução PRINT exiba dígitos significativos para colunas numéricas para as quais nenhum formato é especificado. O valor pode variar de 1 a 9. O padrão é 5. PMATRIX num ajusta a avaliação da densidade de uma matriz bidimensional para afetar a forma como ela é exibida. O valor num escala o número total de elementos de matriz não vazios e é usado pela instrução PRINT para avaliar se um array bidimensional é esparso ou denso. As tabelas que contêm uma única matriz bidimensional são impressas na forma de lista se forem escassas e em forma de matriz se forem densas. Qualquer valor não negativo pode ser atribuído a num o valor padrão é 1. Especificar valores para a opção PMATRIX menos de 1 faz com que o formulário de lista seja usado em mais casos, enquanto especificar valores maiores que 1 faz com que o formulário de matriz seja usado em mais casos . Se o valor for 0, o formulário de lista será sempre usado. Consulte a seção Declaração PRINT para obter mais informações. A opção PRESOLVER PRESOLVER num especifica uma opção presolve ou seu valor correspondente num. Conforme listado na Tabela 6.6. Tabela 6.6: Valores para a opção PRESOLVER Aplique o nível mais alto de processamento presolve. O dispositivo OPTMODEL aperta os limites variáveis ​​e elimina restrições redundantes. Em geral, isso melhora o desempenho de qualquer solucionador. A opção AUTOMATIC é intermediária entre os níveis MODERADO e AGRESSIVO. O PRESTOL num fornece uma tolerância para que restrições ligeiramente infundáveis ​​possam ser eliminadas pelo dispositivo de fixação OPTMODEL. Se a magnitude da inviabilidade não for maior do que, onde X é o valor do limite original, então a restrição vazia é removida do problema presolvido. OPTMODELs presolver não imprime mensagens sobre restrições inviáveis ​​e limites variáveis ​​quando a infeasibilty está dentro da tolerância PRESTOL. O valor de PRESTOL pode variar entre 0 e 0.1 o valor padrão é 1E-12. PRINTLEVEL num controla o nível de saída da listagem durante um comando SOLVE. As tabelas Output Delivery System (ODS) impressas em cada nível estão listadas na Tabela 6.7. Alguns resolvedores podem produzir tabelas adicionais, consulte os capítulos de solver individual para obter mais informações. Tabela 6.7: Valores para a opção PRINTLEVEL Desabilite todas as tabelas. Resumo do problema de impressão e resumo da solução. Resumo de Problemas de Impressão, Resumo de Soluções, Métodos de Computação Derivada (para solucionadores de PNL), Opções de Solver, Estatísticas de Otimização e tabelas de ODS específicas para o solucionador. Para obter mais detalhes sobre as tabelas ODS produzidas pelo PROC OPTMODEL, consulte a seção Tabela ODS e nomes de variáveis. PWIDTH num define a largura usada pela instrução PRINT para exibir colunas numéricas quando nenhum formato é especificado. O menor valor num pode tomar é o valor da opção PDIGITS mais 7 o maior valor num pode tomar é 16. O valor padrão é igual ao valor da opção PDIGITS mais 7. VARFUZZ num especifica a menor diferença que é permitida pela OPTMODEL presolver entre os limites superior e inferior de uma variável não fixa. Se a diferença for menor que num. Então a variável é fixada à média dos limites superior e inferior antes de ser apresentada ao solucionador. Qualquer valor não negativo pode ser atribuído a num, o valor padrão é 0.Optimização em SAS: Proc OPTMODEL Agora que os dados foram preparados, é hora de construir o modelo de otimização. Vamos dar um passo atrás e formular o problema primeiro. Cada problema de otimização baseado em restrições é dividido em três partes: a função objetivo, as variáveis ​​de decisão e as restrições. Lembre-se que o problema é identificar a melhor promoção disponível para cada pessoa. A variável de decisão é binária, quer uma pessoa receba ou não uma promoção específica. Neste exemplo, uma promoção específica é identificada por uma combinação de tipo de cartão de crédito e APR. O objetivo que vamos maximizar será a nossa idéia de lucro. Lucro será composto de duas peças de informação que são tipicamente modelado: lucro esperado é definido como o lucro (durante um período de tempo) que pode ser obtido a partir do cliente se abrir um cartão de crédito específico. A probabilidade de um cliente solicitar um determinado cartão de crédito se receber uma promoção de nós. A função objetivo resultante torna-se a soma de todos os lucros esperados contra a probabilidade de que eles se aplicam a essa conta, se optar por enviá-los uma promoção para essa conta. Para este primeiro exemplo, manteremos nossa lista de restrições curtas e simples. Aqui está a lista de restrições que vamos implementar nesta primeira iteração: Limitar o número de promoções que cada cliente pode receber por campanha. Cada cartão de crédito que é enviado para um cliente precisa ter apenas um preço. Limite o número total de promoções enviadas por tipo de cartão e preço. Agora que temos a formulação fora do caminho, vamos codificar eu vou orientá-lo através de minhas recomendações atrás usando OPTMODEL. Ive encontrado este estilo é o mais fácil de explicar aos colegas e seguir. A primeira etapa na utilização de OPTMODEL é definir a lista de iteradores para o qual o modelo de otimização irá usar. Um iterador é uma lista de itens que podem ser usados ​​para iterar ao definir restrições ou leitura em dados. Embora não seja necessário, certamente ajuda a manter o seu código curto e fácil de rever. Para este problema, vamos definir três iteradores: Clientes: a lista de clientes a analisar dentro desta campanha Produtos: a lista de tipos de cartão de crédito a ser promovido Preços: a lista de vários pontos de preço para cada um dos tipos de cartão de crédito proc optmodel Set ltstrgt customers set ltstrgt produtos set ltstrgt prices A próxima etapa será a definição de todos os dados que serão utilizados dentro do modelo de otimização. Aqui estão as variáveis ​​que vamos ler: lucro esperado: definido como o lucro esperado obtido em um cartão de crédito a esse preço para um determinado cliente Likelihoodtoapply: definido como a probabilidade de um cliente irá aplicar para um determinado cartão de crédito a esse preço Productvolume: Definido como o número de promoções que podem ser enviadas para cada cartão de crédito Pricevolume: definido como o número de promoções que podem ser enviadas para cada preço NUMPRODUCTSPERCUSTOMER: uma constante que define o número de promoções de cartão de crédito que podem ser enviadas a uma pessoa. Número NUMPRODUCTSPERCUSTOMER 1 O próximo passo é preencher essas variáveis ​​com dados reais. Dado os dados que produzimos de volta meu último post. Vamos usar a frase de leitura de dados para obter dados em nosso modelo de otimização. Como temos quatro conjuntos de dados, usaremos quatro frases de dados de leitura diferentes. Uma frase de dados lida pode ser construída da seguinte forma: read data datasetname em iteratorcolumnname productvolumecol (columnname) Vamos começar com o productdata dataset. Uma vez que este conjunto de dados é exclusivo ao nível do produto, podemos usá-lo para definir valores para o iterador de produtos que definimos acima. Observe que a única variável que é definida no nível do produto é volume de produto. Read data productdata in productsproduct productvolumecol (volume) O próximo conjunto de dados é lido dentro de dados relacionados aos preços. Observe que a única variável que é definida no nível de preço é pricevolume. Leia dados priceata em pricesprice pricevolumecol (volume) Observe que não temos quaisquer dados de clientes usados ​​no modelo, mas ainda precisaremos de uma maneira de identificar cada cliente. Leia dados customerdata em customerscustomerid Por último, mas não menos importante, precisamos ler nas duas pontuações do modelo. Como este conjunto de dados é único na combinação de cliente, produto e preço, colocamos os três índices entre parênteses. Observe que, uma vez que os três iteradores foram definidos, não precisamos listar qual deles é mapeado para o qual, mas ordenar as variáveis ​​como elas foram definidas. Ler dados modelscores em customerid preço do produto likelihoodtoapply expectedprofit Como com qualquer modelo, eu gostaria de verificar se os dados estão corretos e ler corretamente. A declaração de impressão a seguir imprimirá as duas variáveis ​​para o primeiro cliente (com ID1). Agora que os dados foram lidos, vamos definir o modelo. Primeiro, a nossa variável de decisão. Note que precisamos tomar uma decisão sobre se enviar para cada pessoa qual produto a que preço. Em seguida é definir a função objetivo, lucro. Vou definir o lucro como a soma dos tempos de lucro esperado para a probabilidade de aplicar vezes se eles obter uma promoção para todos os clientes, cartões de crédito e preços. Em seguida, definirei cada uma das restrições mencionadas acima. A primeira restrição limita o número de promoções que um cliente pode receber. A segunda limita o número de pontos de preços por cartão de crédito. A terceira e quarta restrições limitam o número de promoções que podem ser enviadas por cartão de crédito e preço, respectivamente. Restrição PRODUCTPERCUST: soma mailc, p, q lt NUMPRODUCTSPERCUSTOMER restrição CONSproductvolume: soma mailc, p, q lt productvolumep Agora a parte mais fácil, resolver o problema. Existem várias opções envolvidas com o solucionador dentro do SAS, mas eu vou começar simplesmente e identificar o solucionador para problemas de programação Integer. Resolver com milp Dada a natureza dos solucionadores, vou limpar a solução para eliminar qualquer potencial arredondamento erros. Também criarei um conjunto de dados com os resultados do problema de otimização. Essa instrução de criação de dados criará um conjunto de dados com três colunas de ID: customerid, product e price. Vou então acrescentar em três colunas de dados: lta, eprofit e mail. Criar resultados de dados de customerid produto preço lta likelihoodtoapplyc, p, q eprofit expectedprofitc, p, q mail mailc, p, q sair Bem, isso foi muito longo, mas ele irá fornecer como base para futuras melhorias e explorações para o problema. Você pode encontrar a listagem completa de código aqui. Meu próximo post irá explorar o log e os resultados deste programa.

No comments:

Post a Comment