Optimierung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
zwiety
User
Beiträge: 25
Registriert: Sonntag 1. April 2012, 19:06

Hallo.

Ich hätte mal eine Frage. Ich habe einen Algorithmus geschrieben der sehr viel Zeit benötigt.

Code: Alles auswählen

from itertools import izip
import numpy as np
import math



def erfrage_koordinate():
    return np.array(
        [float(raw_input('{0}. Koordinate: '.format(i + 1))) for i in xrange(2)]
    )



def lex_opt_standort(index1,index2, gewichte, standorte):
    W = sum(gewichte[i][index1] for i in xrange(len(gewichte)))
    sortiert=[[standorte[i][index2], gewichte[i][index1]] for i in xrange(len(standorte))]
    sortiert.sort()
    i = 0
    p = sortiert[i][1]
    while p < (W/2) and i <=len(gewichte):
        i = i+1
        p = p + sortiert[i][1]
    if p <= (W/2):
        opt ={sortiert[i][0],sortiert[i+1][0]}
    elif p > (W/2):
        opt = {sortiert[i][0]}
    return opt

def kanidaten(index, gewichte, standorte):
    return [[x1,x2] for x1 in lex_opt_standort(index,0, gewichte, standorte)
                         for x2 in lex_opt_standort(index,1, gewichte, standorte)]

def lex_opt_Zielwert(index, gewichte, standorte):
    return [min(
            f(x, gewichte, standorte)[i] for x in kanidaten(index, gewichte,standorte)
            ) for i in xrange(2)]
        
def f(x, gewichte, standorte):
    return [sum(
                (g[i] * abs(s - x)).sum() for g, s in izip(gewichte, standorte)
            ) for i in xrange(2)]

def flaecheninhalt(Y1, Y2):
    return (Y2[0] - Y1[0]) * (Y1[1] - Y2[1])

def stoppkriterium(Y1, Y2, genauigkeit, Liste, F):
    flaeche = flaecheninhalt(Y1, Y2)
    if genauigkeit < flaeche:
        Liste.append([Y1, Y2])
        F.append(flaeche)
        return Liste

def epsilon_bedingung(Y1,Y2):
    return Y1[0] + (Y2[0] - Y1[0])/2



def steigung(gewichte, index, p):
    return sum(
            gewichte[i][index] for i in range(0,p+1)
            ) - sum(
                    gewichte[i][index] for i in range(p+1, len(gewichte))
                    )



def gewSum(index1, index2 , p, gewichte, standorte):
    return sum(
        gewichte[i][index1] * standorte[i][index2] for i in range(0, p+1)
    ) - sum(
        gewichte[i][index1] * standorte[i][index2] for i in range(p+1, len(gewichte))
        )

def zwischenwert(x, index, gewichte, standorte):
    return sum(
            gewichte[i][0] * abs(standorte[i][index] - x) for i in xrange(len(gewichte))
            )
    
def res_kanidaten(epsilon, gewichte, standorte):
    kanidaten = []
    for j in xrange(len(gewichte)):
        x = standorte[j][0]
        t = epsilon - zwischenwert(x,0,  gewichte, standorte)
        v = standorte[j][1]
        s = epsilon - zwischenwert(x,1,  gewichte, standorte)
        for l in xrange(len(gewichte)):
            y = (t + gewSum(0, 1, l, gewichte, standorte)) / steigung(gewichte, 0, l)
            u = (s + gewSum(0, 0, l, gewichte, standorte)) / steigung(gewichte, 0, l)
            if f([x,y], gewichte, standorte)[0] == epsilon:
                kanidaten.append([x,y])
            if f([v,u], gewichte, standorte)[0] == epsilon:
                kanidaten.append([v,u])
    return kanidaten

def res_Zielwert(epsilon, gewichte, standorte):
    return [epsilon, min(
                f(x, gewichte, standorte)[1] for x in res_kanidaten(epsilon, gewichte,standorte)
            ) ]

def iteration(Liste, F, gewichte, standorte, repraesentatives_system, genauigkeit):
    while len(Liste) > 0:
        u = F.index(max(F))
        Y1 = Liste[u][0]
        Y2 = Liste[u][1]
        F.remove(F[u])
        Liste.remove(Liste[u])
        epsilon = epsilon_bedingung(Y1,Y2)
        Y3 = res_Zielwert(epsilon, gewichte, standorte)
        repraesentatives_system.append(Y3)
        stoppkriterium(Y1, Y3, genauigkeit, Liste, F)
        stoppkriterium(Y3, Y2, genauigkeit, Liste, F)
    return repraesentatives_system

    
def main():
    anzahl_standorte = int(raw_input('Anzahl der existierenden Standorte: '))
    
    standorte = [erfrage_koordinate() for _ in xrange(anzahl_standorte)]
    print 'Die Menge der existierenden Standorte ist: ', standorte
    
    gewichte = [erfrage_koordinate() for _ in xrange(anzahl_standorte)]
    print 'Die Menge der Gewichte ist: ', gewichte

    genauigkeit = float(raw_input('Gewuenschte Genauigkeit: '))

    repraesentatives_system = [lex_opt_Zielwert(i, gewichte, standorte) for i in xrange(2)]

    Y1 = repraesentatives_system[0]

    Y2 = repraesentatives_system[1]

    Liste = []

    F = []

    stoppkriterium(Y1, Y2, genauigkeit, Liste, F)

    iteration(Liste, F, gewichte, standorte, repraesentatives_system, genauigkeit)

    print 'Das repräsentative System ist gegeben durch: Rep= ', repraesentatives_system
        

                



    

    

    
        
if __name__ == '__main__':
    main()
    
Kann mir vielleicht jemand sagen, wie ich

Code: Alles auswählen

def res_kanidaten(epsilon, gewichte, standorte):
    kanidaten = []
    for j in xrange(len(gewichte)):
        x = standorte[j][0]
        t = epsilon - zwischenwert(x,0,  gewichte, standorte)
        v = standorte[j][1]
        s = epsilon - zwischenwert(x,1,  gewichte, standorte)
        for l in xrange(len(gewichte)):
            y = (t + gewSum(0, 1, l, gewichte, standorte)) / steigung(gewichte, 0, l)
            u = (s + gewSum(0, 0, l, gewichte, standorte)) / steigung(gewichte, 0, l)
            if f([x,y], gewichte, standorte)[0] == epsilon:
                kanidaten.append([x,y])
            if f([v,u], gewichte, standorte)[0] == epsilon:
                kanidaten.append([v,u])
    return kanidaten

verbessern könnte?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo,

ich gebe mal einige Anstöße, wieso sich trotz einiger Aufrufe hier noch niemand zu Wort gemeldet hat.

Du "klatscht" hier gefühlte 150 Zeilen *unkommentiereten* Code rein und fragst dann lapidar nach einer Optimierung. Das Stück, welches wir optimieren sollen, ist dabei auch noch der *Kern* Deines Algorithmus, d.h. man muss sämtliche anderen Funktionen ebenfalls angucken, durchdenken und in die Liste der potenziellen Flaschenhälse aufnehmen.

Wir wissen nicht einmal, *was* das Ding überhaupt tut bzw. welche Thematik das Ding lösen soll. Vielleicht sind es ja auch kombinierte Ansätze aus verschiedenen Themenbereichen (Graphentheorie, lineare Optimierung, ...) Eine Beschreibung des Problems, Deines Lösungsansatzes und der dahinter stehenden Theorie sind bei solch großer Komplexität einfach ein Muss.

Des Weiteren gibst Du uns keinerlei Infos, um welche Zeitspanne wir reden! Geht es um Millisekunden, Minuten oder gar Stunden? Was sind denn so Referenzzeiten? Kann man einen Verlauf beobachten, also die Tendenz, wie sich die Durchlaufeit verändert, wenn man die Instanzmenge hochschraubt? Evtl. kann man daraus die O-Klasse interpolieren.

Kannst Du uns gar eine O-Klasse des Problems geben? Wenn ja, mag es sein, dass sich da eh nichts / wenig optimieren lässt.

Du wirst schon mehr Arbeit in die Problembeschreibung investieren müssen, damit Du hier auf Hilfe zählen kannst :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten