Im tratando de leer una cantidad moderadamente grande de datos en PROC OPTMODEL conjuntos, como en: donde ampquotedshops macrovariable contiene una lista de cadenas, cada una de las citadas, delimitado por una coma. El conjunto de datos KRN contiene variables 0-1 binarias con longitud de 3, cada una para cada cadena en la macrovariable, y la variable KLU ID única para cada fila. Se supone que toda la construcción debe hacer una lista bidimensional de dupen y funciona perfectamente en un número limitado de observaciones y / o variables, pero el conjunto de datos objetivo tendrá alrededor de 200K a unos pocos millones de observaciones con 5800 de variables binarias, y se estrangula mucho antes: (KRT siendo otra tabla estaban recibiendo sólo 2 variables de). ¿Hay alguna manera de escribirlo de manera diferente, almacenar la matriz en el disco, aplicar las restricciones al conjunto de datos en alguna forma o forma, o cualquier sas opciones / configuración que me ayude a ejecutar itOptimization en SAS: Proc OPTMODEL Ahora que los datos han sido Prepped, su tiempo para construir el modelo de optimización. Vamos a dar un paso atrás y formular el problema primero. Cada problema de optimización basado en restricciones se divide en tres partes: la función objetivo, las variables de decisión y las restricciones. Recuerde que el problema es identificar la mejor promoción disponible para cada persona. La variable de decisión es binaria, ya sea que una persona reciba una promoción específica o no. En este ejemplo, una promoción específica se identifica mediante una combinación de tipo de tarjeta de crédito y APR. El objetivo que maximizaremos será nuestra idea de beneficio. El beneficio se compondrá de dos piezas de información que se modelan típicamente: El beneficio esperado se define como el beneficio (durante un período de tiempo) que se puede obtener del cliente si abren una tarjeta de crédito específica. Probabilidad de que un cliente solicite una determinada tarjeta de crédito si recibe una promoción de nosotros. La función objetivo resultante se convierte en la suma de todos los beneficios esperados contra la probabilidad de que se apliquen para esa cuenta, si elegimos enviarles una promoción para esa cuenta. Para este primer ejemplo, mantendremos nuestra lista de restricciones breve y sencilla. He aquí la lista de restricciones que implementaremos en esta primera iteración: Limitar el número de promociones que cada cliente puede recibir por campaña. Cada tarjeta de crédito que se envía por correo a un cliente necesita tener sólo un precio. Limite el número de promociones totales enviadas por tipo de tarjeta y precio. Ahora que tenemos la formulación fuera del camino, deja que el código le guiará a través de mis recomendaciones detrás de usar OPTMODEL. He encontrado este estilo es el más fácil de explicar a los colegas y seguir. El primer paso en el uso de OPTMODEL es definir la lista de iteradores para los que se utilizará el modelo de optimización. Un iterador es una lista de elementos que se pueden utilizar para iterar a través de la definición de restricciones o la lectura en los datos. Aunque no es necesario, sin duda ayuda a mantener su código corto y fácil de revisar. Para este problema, vamos a definir tres iteradores: Clientes: la lista de clientes a analizar dentro de esta campaña Productos: la lista de tipos de tarjetas de crédito a promocionar Precios: la lista de varios puntos de precio para cada uno de los tipos de tarjeta de crédito proc optmodel Set ltstrgt customers set ltstrgt productos set ltstrgt prices El siguiente paso será la definición de todos los datos que se utilizarán dentro del modelo de optimización. Aquí están las variables que vamos a leer en: Beneficio esperado: definido como el beneficio esperado obtenido en una tarjeta de crédito a ese precio para un cliente en particular Probabilidad de aplicar: definido como la probabilidad de que un cliente solicitará una determinada tarjeta de crédito a ese precio Volumen de producto: Definido como el número de promociones que se pueden enviar para cada tarjeta de crédito Pricevolume: definido como el número de promociones que se pueden enviar para cada precio NUMPRODUCTSPERCUSTOMER: una constante que define el número de promociones de tarjetas de crédito que se pueden enviar a una persona. Número NUMPRODUCTSPERCUSTOMER 1 El siguiente paso es rellenar esas variables con datos reales. Dado los datos que produjimos mi último post. Usaremos la frase de datos de lectura para obtener datos en nuestro modelo de optimización. Ya que tenemos cuatro conjuntos de datos, vamos a utilizar cuatro diferentes frases de datos de lectura. Una frase de datos leída se puede construir de la siguiente manera: read data dataetname en iteratorcolumnname productvolumecol (columnname) Empezaremos con el dataset de datos de producto. Dado que este conjunto de datos es único en el nivel del producto, podemos usarlo para establecer valores para el iterador de productos que definimos anteriormente. Tenga en cuenta que la única variable que se define en el nivel de producto es volume de producto. Leer los datos datos del producto en productsproduct productvolumecol (volumen) El siguiente conjunto de datos se lee en será datos relacionados con los precios. Tenga en cuenta que la única variable que se define en el nivel de precios es pricevolume. Leer los datos priceata en pricesprice pricevolumecol (volume) Tenga en cuenta que no tenemos datos de clientes utilizados en el modelo, pero todavía necesitaremos una manera de identificar a cada cliente. Leer los datos customerdata en customerscustomerid Por último, pero no menos importante, tenemos que leer en las dos puntuaciones del modelo. Dado que este conjunto de datos es único en la combinación de cliente, producto y precio, ponemos los tres índices entre paréntesis. Tenga en cuenta que, puesto que los tres iteradores se definieron, no necesitamos enumerar cuál se asigna a la que, sino ordenar las variables como se definieron. Lea los modelos de datos en el precio del producto de customerid likelihoodtoapply expectedprofit Como con cualquier modelo, me gusta verificar que los datos son correctos y leer correctamente. La siguiente instrucción de impresión imprimirá las dos variables para el primer cliente (con ID1). Ahora que los datos se han leído, vamos a definir el modelo. Primero, nuestra variable de decisión. Tenga en cuenta que tenemos que tomar una decisión sobre si enviar por correo a cada persona qué producto a qué precio. A continuación se define la función objetivo, beneficio. Definiré el beneficio como la suma de los tiempos de beneficio esperado a la probabilidad de aplicar tiempos si obtienen una promoción para todos los clientes, tarjetas de crédito y precios. A continuación voy a definir cada una de las limitaciones mencionadas anteriormente. La primera limitación limita el número de promociones que un cliente puede recibir. La segunda limita el número de puntos de precios por tarjeta de crédito. La tercera y cuarta restricciones limitan el número de promociones que se pueden enviar por tarjeta de crédito y precio respectivamente. Constraint PRODUCTPERCUST: suma mailc, p, q lt NUMPRODUCTSPERCUSTOMER constricción CONSproductvolume: sum mailc, p, q lt productvolumep Ahora la parte fácil, resolver el problema. Hay varias opciones involucradas con el solucionador dentro de SAS, pero voy a empezar simplemente e identificar el solucionador de problemas de programación de enteros. Resolver con milp Dada la naturaleza de los solucionadores, voy a limpiar la solución para eliminar posibles errores de redondeo. También crearé un conjunto de datos con los resultados del problema de optimización. Esta instrucción de creación de datos creará un conjunto de datos con tres columnas de ID: customerid, product y price. A continuación, añadir en tres columnas de datos: lta, eprofit y correo. Crear resultados de los datos del precio del producto de customerid lta likelihoodtoapplyc, p, q eprofit esperadoprofitc, p, q correo mailc, p, q salir Bueno, eso fue bastante largo, pero proporcionará como base para futuras mejoras y exploraciones en el problema. Puede encontrar el listado completo de código aquí. Mi siguiente post explorará el registro y los resultados de este programa. Estoy intentando cargar un conjunto de datos en el paquete de datos en proc optmodel en proc optmodel por ryanw14 raquo Vie, 03 Oct 2008 05:11:56 GMT Estoy tratando de cargar un conjunto de datos en Proc optmodel. He estado tratando de modificar el ejemplo del manual SAS adjunto a continuación para comprender mejor el proceso. Quiero leer un dataset 4x4 en coeff y un conjunto de datos 1x4 en r, pero no he podido hacerlo con el comando read data. Sigo recibiendo un mensaje de error El recuento subíndice implícito no coincide con el coeficiente de la matriz, 0 NE 2. Cualquier ayuda sería muy apreciada. Gracias por adelantado, Ryan / ejemplo 2: optimización de la cartera / proc optmodel / let x1, x2, x3, x4 la cantidad invertida en cada activo / var x gt 0 num coeff 0.08 -.05 -.05 -.05 -.05 0.16 -.02 -.02 -.05 -.02 0,35 0,06 -.05 -.02 0,06 0,35 nr 0,05 -20 0,15 0,30 / minimizar la variación de la rentabilidad total de las carteras / minimizar el coeficiente f sum, jxixj / sujeto a Las siguientes restricciones / con PRESUPUESTO: suma xi lt 10000 con CRECIMIENTO: suma rixi gt 1000 / imprime la solución óptima / impresión x
No comments:
Post a Comment