[Python-es] Obtención de Sumandos para un Target a partir de una colección de valores

Manuel A. Estevez Fernandez stvzito en gmail.com
Vie Feb 9 17:31:05 EST 2018


Gracias por el dato, voy a intentarlo.
Saludos.



Manuel Alejandro Estévez Fernández



El 9 de febrero de 2018, 8:06, Daπid <davidmenhur en gmail.com> escribió:

> La forma eficiente de resolver el problema es usando programación dinámica
> (dynamic programming), y es equivalente a uno de los problemas clásicos:
> dar cambio en monedas. Hay mucha documentación al respecto, sobre todo en
> inglés.
>
> Un par de enlaces, sin garantía de calidad:
>
> https://interactivepython.org/runestone/static/pythonds/
> Recursion/DynamicProgramming.html
> https://es.wikibooks.org/wiki/Programaci%C3%B3n_din%C3%
> A1mica/Problema_de_las_monedas_con_programaci%C3%B3n_din%C3%A1mica
>
> Si te interesa, mi recomendación es que estudies programación dinámica en
> general, en cuanto lo pilles, aplicarlo a tu problema es fácil.
>
> /David.
>
> 2018-01-12 21:35 GMT+01:00 Manuel A. Estevez Fernandez <stvzito en gmail.com>
> :
>
>> Hola a todos, tengo la siguiente necesidad:
>>
>> Encontrar una combinación de valores pertenecientes a una colección cuyo
>> resultado sea un numero determinado.
>>
>> Algo así:
>> id target valores
>> 1 100 20
>> 1 100 30
>> 1 100 50
>> 1 100 15
>> 1 100 45
>> 1 100 60
>> 2 150 75
>> 2 150 75
>> 2 150 100
>> 3 1500 900
>> 3 1500 500
>> 3 1500 600
>> 3 1500 1000
>> 3 1500 750
>> 3 1500 200
>> 3 1500 300
>> 3 1500 10
>> 3 1500 30
>> 3 1500 50
>>
>> Toda esta información la tengo en un archivo csv. El cual leo y genero un
>> diccionario:
>>
>>  {
>>    id : {  target : target , values : [ valores ] }
>>   ,  id : { target : target , values : [ valores ] }
>> }
>>
>> con el siguiente codigo realizo un matriz de verdad de la longitud de la
>> cantidad de los valores por ID, y realizo la suma si es lo del target +1-1
>> con ese vale.
>>
>> import numpy as np
>> import itertools
>>
>> for id in in diccionario :
>> for tup in itertools.product([0,1] , repeat=len(diccionario[id]['va
>> lues'])):
>> resultado = np.sum( np.dot(  np.array(list(tup)) , np.array(
>> diccionario[id]['valores'] ) ) )
>> if ( diccionario[id]['target'] - 1) <= resultado and resultado <=  (
>> diccionario[id]['target'] + 1) :
>> print 'ID : ', id, ' Combinacion : ' , tup , 'Valores ',
>> diccionario[id]['valores']
>> break
>>
>>
>>
>> La problematica que tengo es que obviamente entre mas grande sea la
>> cantida de valores la combinaciones serán muchas más.
>>
>> Tengo la idea de utilizar un poco de paralelizar, pero no tengo idea de
>> como empezar.
>>
>> No sé como hacerlo o si sea posible lo siguiente:
>> Lanzar un proceso por ID.
>> -Generar una segmentación de la matriz de verdad y asignarla un subproceso
>> -Cuando algún subproceso encuentre un resultado válido, lo devuelva y se
>> detengan los subprocesos
>> -Avanzar al siguiente ID.
>>
>> Saludos y gracias de antemano.
>>
>>
>>
>> Manuel Alejandro Estévez Fernández
>>
>>
>>
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>>
>>
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20180209/6eeea764/attachment.html>


Más información sobre la lista de distribución Python-es