Mostrando entradas con la etiqueta Python. Mostrar todas las entradas
Mostrando entradas con la etiqueta Python. Mostrar todas las entradas

lunes, 20 de agosto de 2012

Neurona

Buenos días, tardes, noches aquí subiendo lo pedido de la ultima clase de Redes Neuronales.

El programa te da por default los valores umbral y cantidad de entradas luego te pide que ingreses los valores de las entradas para después multiplicarlo con los pesos que genera aleatoriamente y sumar el arreglo para obtener un resultado que se verificara con el valor umbral para ver si acepta o rechaza.


from numpy import *
from numpy.random import *

def Bin(n):#Aqui se toman las entradas en valores de 0 y 1
    bin = array([0])
    for i in range(n):
        bin = append(bin,int(input("Entrada: ")))
        i = i+1
    bin = delete(bin,[0])
    return bin

def Shuffle(n):#Aqui llena el arreglo de valores aleatorios entre 0 y 1
    pesos = uniform(low=0, high=1, size=(1,4))
    return pesos

def Suma(e,p):#Aqui multiplica las entradas con los pesos y suma el arreglo
    r = e*p
    resultado = r.sum()
    return resultado

def fin(m, u):#verifca si es acepta o rechaza conforme al valor umbral
    if(m>u):
        print "Acepta!"
    else:
        print "Rechaza!"

def main():
    
    n = 4
    u = 0.4
    bin = Bin(n)
    pesos = Shuffle(n)
    suma=Suma(bin,pesos)
    
    print "Numero de Entradas 4"
    print "Umbral : 0.4"
    print "Entradas " + str(bin)
    print "Pesos Aleatorios Entre 0 y 1 " + str(pesos)
    print "Suma " + str(suma)
    fin(suma,u)
 
main()

miércoles, 4 de julio de 2012

W.T.A.P. Metaheurística de recocido simulado

El meta-algoritmo llamado recocido simulado o enfriamiento simulado nos ayuda a encontrar una buena aproximación al valor óptimo de una función en un espacio de búsqueda grande. Por medio de este meta-algoritmo se busco encontrar un valor óptimo, donde primero tenemos un valor inicial y un valor modificado en el que se busca la diferencia de esos dos valores ( obji – objm ) para después evaluar el exponencial de la diferencia de los dos valores inicial y modificado entre temperatura, luego verificamos que el valor sea menor igual a un número pseudo aleatorio uniforme entre 0 y 1, y en caso de tomar un valor óptimo disminuimos la temperatura asignando la temperatura por un enfriamiento en el cual enfriamiento es un tasa porcentual de disminución a la temperatura. Las modificaciones relevantes ocurrieron en el método de búsqueda en el que se agregaron parámetros como temperatura y enfriamiento. Después se hizo lo anterior mencionado, tuvimos algunos errores ya que tomaba los valores factibles y no factibles y eso se corrigió dividiendo en dos condiciones la condición que verifica si es factible o no el valor.
def busqueda(rei, vuelta, armas, targets, matrix, cupo, temperatura, enfriamiento):
    mejor = sum(targets)
    resultado = None
    listaTabu = list()
    for r in range(rei):
        salida = open('reinicio%d.out' % r, 'w')
        paso = 0
        intentosRestantes = vuelta
        actual = asignacion(armas, targets, matrix)
        objAct = funcionObjetivo(armas, actual, targets, matrix)
        fact = factibilidad(actual, armas)
        mejor = objAct
        resultado = actual
        print >>salida, '%d %f' % (paso, mejor)
        while intentosRestantes > 0:
            exito = False
            paso += 1
            candidato = mejora(armas, targets, matrix, actual)
            objCand = funcionObjetivo(armas, candidato, targets, matrix)
            fact = factibilidad(candidato, armas)
            if tabu(listaTabu, candidato, cupo):
                if fact:
                    if objCand <= objAct: # acepto
                        exito = True
                        intentosRestantes = vuelta
                    elif temperatura > 0:
                        diferencia = (objAct - objCand) / temperatura
                        print diferencia, exp(diferencia)
                        if random.random() <= exp(diferencia):
                            exito = True
                            temperatura *= enfriamiento
                if exito:
                    actual = candidato
                    objAct = objCand
                    if objAct < mejor:
                        mejor = objAct
                        resultado = actual
                    print >>salida, '%d %f %f' % (paso, objAct, mejor)
            if not exito:
                intentosRestantes -= 1 #no mejora
        salida.close()
    return resultado

W.T.A.P. Búsqueda Tabú

Para optimizar nuestra respuesta se utilizo la búsqueda tabú que consiste en ir descartando asignaciones que ya se usaron para evitar repetir la misma asignación, lo que hace es usar el candidato que es la asignación de una mejor función objetivo comparando con la lista tabú para evitar repetir la misma asignación y dándole un limite a la lista tabú de valores y si se llena el y encuentra otro valor menor se sustituye por el primero de la lista tabú
def tabu(lista, candidato, cupo):
    if candidato in lista:
        return False # rechazar los que ya estan incluidos
    else:
        lista.append(candidato) # agregar al final
        if len(lista) > cupo:
            del lista[0] # eliminar el primero (mas viejo)
        return True

def busqueda(rei, vuelta, armas, targets, matrix, cupo):
    mejor = sum(targets)
    resultado = None
    listaTabu = list()
    for r in range(rei):
        salida = open('reinicio%d.out' % r, 'w')
        paso = 0
        intentosRestantes = vuelta
        actual = asignacion(armas, targets, matrix)
        objAct = funcionObjetivo(armas, actual, targets, matrix)
        fact = factibilidad(actual, armas)
        mejor = objAct
        resultado = actual
        print >>salida, '%d %f' % (paso, mejor)
        while intentosRestantes > 0:
            exito = False
            paso += 1
            candidato = mejora(armas, targets, matrix, actual)
            objCand = funcionObjetivo(armas, candidato, targets, matrix)
            fact = factibilidad(candidato, armas)
            if tabu(listaTabu, candidato, cupo):
                if fact and objCand                     exito = True
                    actual = candidato
                    objAct = objCand
                    if objAct < mejor:                         mejor = objAct                         resultado = actual                         print >>salida, '%d %f' % (paso, mejor)
            if not exito:
                intentosRestantes -= 1 #no mejora
            else:
                intentosRestantes = vuelta
            print intentosRestantes
        salida.close()
    return resultado
También se modifico esta parte para mandar llamar el cupo limite de la lista tabú, y se le agrego a las funciones gráfica, búsqueda y tabú
def main():

    armas, targets, matrix = instancia()
    cotaSup = cotaSuperior(armas, targets, matrix)
    cotaInf = cotaInferior(armas, targets, matrix)
    rei = 10
    cupoTabu = int(raw_input("Largo de la lista tabu: "))
    busqueda(rei, 40, armas, targets, matrix, cupoTabu)
    grafica(rei, cotaInf, cotaSup, cupoTabu)

main()

W.T.A.P. Mejora de Función Objetivo

-Cota Inferior: Asignación de objetivos a las armas con mayor probabilidad de destrucción sin importancia a disponibilidad -Cota Superior: Asignación de objetivos tomando en cuenta la disponibilidad y la mayor probabilidad de destrucción -Función Objetivo: Asignación de objetivos con armas aleatoriamente -Factibilidad: La verificación de no haber utilizado una arma que ya no este disponible Se realiza una búsqueda comparativa con función objetiva actual y la nueva funciones objetivo con selección de armas para los objetivos de manera aleatoria respetando disponibilidad, se comparan con diferentes nuevas funciones objetivo con la finalidad de encontrar la mínima expectativa de supervivencia del objetivo si la actual es mayor que la nueva se sustituye.
from numpy import *
import random
from sys import argv
from subprocess import call

def cotaSuperior(armas, targets, matrix, checa = True):
    cota = 0
    if checa:
        disponible = list(armas)
    for j in range(len(targets)):
        aux = 1.0
        arma = None
        for i in range(len(armas)):
            if (not checa or disponible[i] > 0) and matrix[i, j] < aux:
                aux = matrix[i, j]
                arma = i
        if checa and arma is not None:
            disponible[arma] -= 1
        cota += aux * targets[j]
        print 'Para target %d usamos arma %s con prob %f' % (j, str(arma), aux)
    return cota

def cotaInferior(armas, targets, matrix):
    return cotaSuperior(armas, targets, matrix, False)

def factibilidad(asig, armas):
    print asig, armas
    for i in range(len(armas)):
        #print 'En uso %d de %d disponibles' % (asig.count(i), armas[i])
        if armas[i] < asig.count(i):
            #print 'No respeta disponibilidad'
            
            return False
    return True

def funcionObjetivo(armas, asig, targets, matrix):
    objetivo = 0.0
    v = len(asig)
    for k in range(v):
        objetivo += targets[k] * matrix[asig[k], k]
    return objetivo

def mejora(armas, targets,matrix, asig):
    nuevo = list(asig)
    arma = random.randrange(0, len(armas))
    nuevo[random.randrange(0, len(targets))] = arma
    return nuevo

def asignacion(armas, targets, matrix):
    a = []
    disponible = list(armas)
    for target in targets:
        arma = None
        while True:
            arma = random.randrange(0,len(armas))
            if disponible[arma] > 0:
                break
        a.append(arma)
        disponible[arma] -= 1
    return a

def busqueda(rei, vuelta, armas, targets, matrix):
    mejor = sum(targets) 
    resultado = None
    for r in range(rei):
        salida = open('reinicio%d.out' % r, 'w')
        paso = 0
        intentosRestantes = vuelta
        actual = asignacion(armas, targets, matrix) 
        objAct = funcionObjetivo(armas, actual, targets, matrix)
        fact = factibilidad(actual, armas)
        mejor = objAct
        resultado = actual 
        print >>salida, '%d %f' % (paso, mejor)
        while intentosRestantes > 0:
            paso += 1
            candidato = mejora(armas, targets, matrix, actual)
            objCand = funcionObjetivo(armas, candidato, targets, matrix)
            fact = factibilidad(candidato, armas)
            if fact and objCand <= objAct: # acepto
                actual = candidato
                objAct = objCand
                if objAct < mejor:
                    mejor = objAct
                    resultado = actual
                    print >>salida, '%d %f' % (paso, mejor)
            else:
                intentosRestantes -= 1 # no pude mejorar
        salida.close()
    return resultado

def grafica(reinicios, cotaInf, cotaSup):
    out = open('grafica.plot', 'w')
    print >>out, \
        '''set term png 24
set size 2, 1
set xlabel \"Iteracion\"
set ylabel \"Objetivo\"
set key off
set logscale y
set pointsize 1.2
set output \"grafica.png\"'''
    plot = 'plot '
    for r in range(reinicios):
        plot += '\"reinicio%d.out\" with linespoints, ' % r
    plot += ' %f with lines lw 4, %f with lines lw 4' % (cotaInf, cotaSup)
    print >>out, plot
    out.close()
    call(['gnuplot', 'grafica.plot'])
    return
     
def instancia():
    armas = []
    targets = []
    try:
        datos = open(argv[1], 'r')
        tipos = datos.readline()
    #print tipos
        for t in tipos.split():
            armas.append(int(t))
        obj = datos.readline()
    #print obj
        for o in obj.split():
            targets.append(float(o))
        row = len(armas)
        print row
        col = len(targets)
        print col
    #print targets
    #print row, col
        matrix = empty((row, col))
        i = 0
        j = 0
        for linea in datos.readlines():
            elementos = linea.split()
            j = 0
        #print elementos
            for e in elementos:
            #print i, j
                matrix[i, j] = float(e)
                j += 1
            i += 1
        datos.close()
        
    except:

        row = int(argv[1])
        col = int(argv[2])
        print row
        print col
        for i in range(col):
            targets.append(random.uniform(1.0, 20.0))

        for i in range(row):
            armas.append(random.randrange(1, 10))

            matrix = empty((row, col))
        for i in range(row):
            for j in range(col):
                matrix[i, j] = random.random()
    
    print 'Numero de armas disponibles'
    s = ''
    for a in armas:
        s += '%d '% a
    print s
    
    print ' Objetivos '
    s = ''
    for t in targets:
        s += '%f ' % t
    print s
    print '\n'
    
    print 'Probabilidades de supervivencia'
    for i in range(row):
        s = ''
        for j in range(col):
            s += '%f ' % matrix[i, j]
        print s
    return armas, targets, matrix

def main():
    armas, targets, matrix = instancia()
    cotaSup = cotaSuperior(armas, targets, matrix)
    cotaInf = cotaInferior(armas, targets, matrix)
    rei = 10
    print busqueda(rei, 3300, armas, targets, matrix)
    grafica(rei, cotaInf, cotaSup)
   # print "Lista de asignacion:"
   # for i in range(10):
    #    fact = asignacion(armas, targets, matrix)
     #   print fact
      #  if factibilidad(fact, armas):
       #     print "Factible"
        #else:
         #   print "No factible"
          #  print "\n"
main()
Gráfica se gráfica con base de las cotas inferior y superior las cuales nos marcan una linea horizontal dando un limite sobre la gráfica para poder observar la graficación de las funciones objetivos como se va encontrando el mínimo hasta llegar a la cota inferior o casi llegar sin sobrepasarla

W.T.A.P. Función Objetivo, Factibilidad, Solución

En la versión estática de el problema WTA todas las entradas están fijas, significa que conocemos todos los enemigos y todas las armas posibles y también sabemos que arma confronta a que objetivo en un solo escenario. WTA = determinar el numero de armas Xij para minimizar el valor total de supervivencia de todos los objetivos En palabras mortales: usar menos armas pero igual poder matar a todos los objetivos Evaluando la función objetivo: Observamos la cantidad de objetivos que se aproximan a la "base"(por así decirlo), así de esa manera asignaremos una arma  y obtendremos una probabilidad de supervivencia. Obtendremos una lista con asignaciones Xij y lo que estaremos evaluando es que la asignacion de armas no sobrepase la cantidad de armas que tenemos en la base. Factibilidad: La cantidad de armas que asignamos esta evaluada con Wi asi que no debe de ser mayor a la cantidad de armas que tenemos, de manera que si este sobrepasa no sera una solución factible. Generar una solución: ......Pendiente de revisión

W.T.A.P. Cotas

Cota Superior: Sumatoria de probabilidades de supervivencia del objetivo según el arma con mayor ataque se toma así ya que esto sería el arma que causa mayor daño y deja un mínimo de sobrevivientes que es lo que se busca. Cota Inferior: Sumatoria de probabilidades de supervivencia del objetivo según el arma con menor ataque se toma así porque seria el menor que se puede obtener que deja un mínimo de sobrevivientes ya que es la que tiene menor poder de ataque.
from numpy import *
import random
from sys import argv

armas = list()
targets = list()

def cotaSuperior(armas):
    arma_mejor = armas.index(max(armas))
    return arma_mejor

def cotaInferior(armas):
    arma_peor = armas.index(min(armas))
    return arma_peor

try:
    datos = open(argv[1], 'r')
    tipos = datos.readline()
    #print tipos
    for t in tipos.split():
        armas.append(int(t))
    obj = datos.readline()
    #print obj
    for o in obj.split():
        targets.append(float(o))
    row = len(armas)
    col = len(targets)
    #print targets
    #print row, col
    matrix = empty((row, col))
    i = 0
    j = 0
    for linea in datos.readlines():
        elementos = linea.split()
        j = 0
        #print elementos
        for e in elementos:
            #print i, j
            matrix[i, j] = float(e)
            j += 1
        i += 1
    datos.close()

except:

    row = int(argv[1])
    col = int(argv[2])

    for i in range(col):
        targets.append(random.uniform(1.0, 20.0))

    for i in range(row):
        armas.append(random.randrange(1, 10))

    matrix = empty((row, col))
    for i in range(row):
        for j in range(col):
            matrix[i, j] = random.random()
s = ''
for a in armas:
    s += '%d '% a
print s

s = ''
for t in targets:
    s += '%f ' % t
print s

sumatoria =0
for i in range(row):
    s = ''
    for j in range(col):
        s += '%f ' % matrix[i, j]
    print s

for i in range(row):
    sumatoria += matrix[i, cotaSuperior(armas)]
print sumatoria

sumatoria2 =0
for i in range(row):
    sumatoria2 += matrix[i, cotaInferior(armas)]
print sumatoria2

W.T.A.P. Datos y Benchmark

Code:
from numpy import *
import random
from sys import argv

#Fila y columna de la matriz, se les pide como parámetros desde la terminal
row = int(argv[1])
col = int(argv[2])

#Creamos las listas para guardar los valores de armas y objetivos
armas = list()
targets = list()

#Insertar un valor pseudo-aleatorio uniforme de objetivos
for i in range(col):
  targets.append(int(random.uniform(1.0, 20.0)))
#Insertar un valor pseudo-aleatorio en un rango de 1 a 10 para definir el arma
for i in range(row):
  armas.append(random.randrange(1, 10))

#Matriz con valores pseudo-aleatorio de daños a los objetivos
matrix = empty((row, col))
for i in range(row):
  for j in range(col):
   matrix[i, j] = random.random()

print "Las armas: ",armas
print "Los objetivos: ", targets
print "La matriz de indice de supervivencia: \n",matrix
Benchmark: -En este benchmark nos basaremos ya que es el más parecido Branch and bound: http://www.dodccrp.org/events/10th_ICCRTS/CD/papers/182.pdf -Si no funciona pasaremos a la segunda opción MMR: http://research.engineering.wustl.edu/~mchan/projects/mitll/wta.pdf

martes, 26 de junio de 2012

El problema: Weapon Target Assignment


¿Quiénes somos?
Saúl Gausin
Calificación esperada: 130
Omar Jair Montalvo Aquines
Calificación esperada: 82
David Sosa Valdes
Calificación esperada: 80
Lenguajes: Python, JAVA(Posible).
Descripción del problema: Weapon-Target Assignment Problem (WTA) consiste en buscar una asignación óptima de un conjunto de armas de varios tipos a un conjunto de objetivos en orden para maximizar el daño total esperado hacia un oponente.
Se tiene un número de armas y un número de objetivos. Las armas son de tipo i = 1, 2, ..., m. Nosotros tenemos Wi armas disponibles de tipo i. De igual manera nosotros tenemos j = 1, 2, ..., n objetivos, y cada uno con un valor VjCualquiera de estas armas se les puede asignar a cualquier objetivo. Cada tipo de arma tiene una cierta probabilidad de destruir cada objetivo, denotado por Pij.
Optimización: Se busca tener un máximo daño Pij Vj hacia un oponente dada la asignación de armas a objetivos. Esto esta formulado por medio de un problema entera no lineal.
esta sujeto a algunas limitantes,
En donde la variable Xij representa la asignacion de cuantos tipo de armas del tipo i confrontan a objetivos j y Qij es la probabilidad de supervivencia(i-Pij). La primera restricción requiere que el número de armas de cada tipo asignado no exceda el número disponible. La segunda restricción es la restricción integral.
Decisión: Si es posible lograr un daño mayor o superior a un valor establecido D.
NP-DurezaEl problema NP-completo 3-cubierta exacta se reduce a Weapon Target Assignment, lo que le hace NP duro.
Tamaño (Medida de blancos y defensas): Seleccionamos un rango de 80 a 200 armas y objetivos a base del siguiente artículo.
http://web.mit.edu/sloan-msa/Papers/1.5.pdf