Array aufteilen

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.
Bine2706
User
Beiträge: 13
Registriert: Samstag 30. Juni 2018, 18:09

@Thomas: Vielen vielen Dank, das klappt. Nun habe ich auch verstanden das das oben ja schon genau dasselbe war und ich nur die letzte for-Schleife hätte ersetzen müssen. Sorry =)

Wie gesagt, python ist meine erste Programmiersprache und es ist am Anfang recht viel was da alles Neues auf einen zukommt. Aber ich habe aus dieser Frage sehr viel gelernt, vielen Dank an alle =) =)
Bine2706
User
Beiträge: 13
Registriert: Samstag 30. Juni 2018, 18:09

jetzt hab ich leider doch nochmal ein Problem =(
das Ausgeben hat super geklappt, und nun habe ich die Funktion in den restlichen Code eingebaut. Es kommt nun jedoch die Fehlermeldung "int" is not iterable. Das heißt ja python sieht die fahrtkostenmatrix als ein int-Wert und nicht als Liste oder? und wie kann ich sie iterabel machen?
Bisher habe ich bei Listen immer mit .append gearbeitet, da habe ich jedoch aus einer .txt eingelesen und die Werte nicht erst in Python berechnet
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast wahrscheinlich wieder die selbe Variable für zwei verschiedene Dinge benutzt. Aber ohne den Code zu kennen, kann man da nicht helfen.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Nabend Bine,
int ist ja auch nicht iterable, die fahrtkostenmatrix die im letzten Code erzeugt wurde aber doch.
Also muss bei deinem "Einbau" was nicht richtig sein.
Zeig uns den Code, nur dann haben wir was mit dem wir arbeiten und helfen können.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Bine2706
User
Beiträge: 13
Registriert: Samstag 30. Juni 2018, 18:09

@Sirius: nein habe ich nicht.
Das scheint damit zu tun zu haben ob ich die Funktion in eine andere Datei schreibe und und sie dann in meiner main-Datei aufrufe oder ob ich alles in einer Datei habe.

So ist alles in einer Datei und es funktioniert:

def errechne_fahrtkosten_ersterStufe(x, y):
return math.ceil(math.sqrt((int(y[0])-int(x[0]))**2+(int(y[1])-int(x[1]))**2)*200)
fahrtkosten_ersterStufe = [[errechne_fahrtkosten_ersterStufe(reihe, spalte) for spalte in koordinaten_standorte_ersterStufe] for reihe in koordinaten_standorte_ersterStufe]

So ist es in zwei Dateien. Das Übertragen klappt, also ich kann zb. fahrtkosten_ersterStufe printen, aber eben nicht damit weiterrechnen (mit Gurobi)

MAIN-DATEI:
fahrtkosten_ersterStufe = [[errechne_fahrtkosten_ersterStufe(reihe, spalte) for spalte in koordinaten_standorte_ersterStufe] for reihe in koordinaten_standorte_ersterStufe]

DATEI MIT FUNKTION:
def errechne_fahrtkosten_ersterStufe(x, y):
return math.ceil(math.sqrt((int(y[0])-int(x[0]))**2+(int(y[1])-int(x[1]))**2)*200)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Bine2706: bitte zeige Deinen vollständigen Code inklusive des Fehlers mit gesamtem Traceback. Und benutze das nächste mal die Code-Tags hier im Forum.
Bine2706
User
Beiträge: 13
Registriert: Samstag 30. Juni 2018, 18:09

Code der Main-Datei:

Code: Alles auswählen

from gurobipy import *
from Einlesen_Prodhon_Funktion import read_textfile
from Fahrtkosten_berechnen_Funktion import errechne_fahrtkosten_ersterStufe
from Fahrtkosten_berechnen_Funktion import errechne_fahrtkosten_zweiterStufe
from optLsg_Funktion import berechne_Crainic_drei_Indizes
#_______________________________________________________________________
##Funktion read_textfile aus der Datei Einlesen_Prodhon_Funktion, die eine Textdatei
##der Standardinstanzen von Prodhon (Link: http://prodhonc.free.fr/) einliest
data = read_textfile('coord20-5-1-2e.txt')
##Inputparametern der Funktion werden die Daten der eingelesenen Datei zugewiesen
#Inputparameter bezüglich der Plattform
plattform = data[0]
koordinaten_plattform = data[1]
kapazitaet_plattform = data[2]
fixkosten_plattform = data[3]
anzahl_plattform = data[4]
#Inputparameter bezüglich den Satelliten
satellit = data[5]
koordinaten_satellit = data[6]
kapazitaet_satellit = data[7]
fixkosten_satellit = data[8]
anzahl_satellit = data[9]
#Inputparameter bezüglich den Kunden
kunde = data[10]
koordinaten_kunde = data[11]
kundennachfrage = data[12]
anzahl_kunde = data[13]
#Inputparameter bezüglich der Menge an Standorten
standorte_ersterStufe = data[14]
koordinaten_standorte_ersterStufe = data[15]
standorte_zweiterStufe = data[16]
koordinaten_standorte_zweiterStufe = data[17]
alleStandorte = data[18]
anzahlStandorte = data[19]
#Inputparameter bezüglich der Primärfahrzeuge
primaerfahrzeug = data[19]
kapazitaet_primaerfahrzeug = data[20]
nutzungskosten_primaerfahrzeug = data[21]
anzahl_primaerfahrzeug = data[22]
#Inputparameter bezüglich der Sekundärfahrzeuge
sekundaerfahrzeug = data[23]
kapazitaet_sekundaerfahrzeug = data[24]
nutzungskosten_sekundaerfahrzeug = data[25]
anzahl_sekundaerfahrzeug = data[26]
#_______________________________________________________________________
##mit der Funktion errechne_fahrtkosten_ersterStufe aus der Datei Fahrtkosten_berechnen_Funktion,
##werden die Fahrtkosten der ersten Stufe berechnet
fahrtkosten_ersterStufe = [[errechne_fahrtkosten_ersterStufe(reihe, spalte) for spalte in koordinaten_standorte_ersterStufe] for reihe in koordinaten_standorte_ersterStufe]
##mit der Funktion errechne_fahrtkosten_zweiterStufe aus der Datei Fahrtkosten_berechnen_Funktion,
##werden die Fahrtkosten der zweiten Stufe berechnet
fahrtkosten_zweiterStufe = [[errechne_fahrtkosten_zweiterStufe(reihe, spalte) for spalte in koordinaten_standorte_zweiterStufe] for reihe in koordinaten_standorte_zweiterStufe]
#_______________________________________________________________________
##mit der Funktion berechne_Crainic_drei_Indizes aus der Datei optLsg_Funktion
##wird die optimale Lösung eines Two-Echelon Location Routing Problems anhand
##des Modells 3i-2E-LRP mit drei Indizes von Crainic et al.(2011) berechnet
optLsg_dreiIndizes = berechne_Crainic_drei_Indizes(plattform, satellit, standorte_ersterStufe, primaerfahrzeug, standorte_zweiterStufe, sekundaerfahrzeug, kunde, alleStandorte,
                                                   anzahlStandorte, fixkosten_plattform, fixkosten_satellit, nutzungskosten_primaerfahrzeug)
Bine2706
User
Beiträge: 13
Registriert: Samstag 30. Juni 2018, 18:09

Fahrtkosten_berechnen_Funktion:

Code: Alles auswählen

import math
#_______________________________________________________________________
##Funktion zur Berechnung der Fahrtkosten der ersten Stufe aus den euklidischen Distanzen
##multipliziert mit 200, Ausgabe als geschachtelte Liste
def errechne_fahrtkosten_ersterStufe(x, y):
    return math.ceil(math.sqrt((int(y[0])-int(x[0]))**2+(int(y[1])-int(x[1]))**2)*200)
##Funktion zur Berechnung der Fahrtkosten der zweiten Stufe aus den euklidischen Distanzen
##multipliziert mit 100, Ausgabe als geschachtelte Liste
def errechne_fahrtkosten_zweiterStufe(x, y):
    return math.ceil(math.sqrt((int(y[0])-int(x[0]))**2+(int(y[1])-int(x[1]))**2)*100)
Bine2706
User
Beiträge: 13
Registriert: Samstag 30. Juni 2018, 18:09

Traceback:

Code: Alles auswählen

Reloaded modules: Einlesen_Prodhon_Funktion, Fahrtkosten_berechnen_Funktion, optLsg_Funktion
Traceback (most recent call last):

  File "<ipython-input-21-5d6bef3c9499>", line 1, in <module>
    runfile('C:/Users/bine/OneDrive/Masterarbeit/Python/3i-2E-LRP/3_Gurobi_Crainic_3i-2E-LRP -/Crainic_3i-2E-LRP.py', wdir='C:/Users/bine/OneDrive/Masterarbeit/Python/3i-2E-LRP/3_Gurobi_Crainic_3i-2E-LRP -')

  File "C:\Users\bine\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 710, in runfile
    execfile(filename, namespace)

  File "C:\Users\bine\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 101, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/bine/OneDrive/Masterarbeit/Python/3i-2E-LRP/3_Gurobi_Crainic_3i-2E-LRP -/Crainic_3i-2E-LRP.py", line 57, in <module>
    anzahlStandorte, fixkosten_plattform, fixkosten_satellit, nutzungskosten_primaerfahrzeug)

  File "C:\Users\bine\OneDrive\Masterarbeit\Python\3i-2E-LRP\3_Gurobi_Crainic_3i-2E-LRP -\optLsg_Funktion.py", line 53, in berechne_Crainic_drei_Indizes
    quicksum(fahrtkosten_ersterStufe[i][j]*r_ersteStufe.sum(i,j,primaerfahrzeug) for i in standorte_ersterStufe for j in standorte_ersterStufe) +

TypeError: 'int' object is not iterable



gerade festgestellt, dass die variablen die ich über data = readtextfile() denselben Fehler bringen
Bine2706
User
Beiträge: 13
Registriert: Samstag 30. Juni 2018, 18:09

Einlesen_Prodhon_Funktion:

Code: Alles auswählen

##Definition zum Einlesen aus einer Text-Datei
def read_textfile(filename):
    with open(filename, 'r') as g:
        lines = [y.rstrip('\n') for y in g]
#_______________________________________________________________________
##erste Zeile einlesen
#Anzahl an Kunden
    anzahl_kunde = int(lines[0])
#aus der Anzahl an Kunden wird eine Liste erstellt
    kunde = []
    [kunde.append(k) for k in range(anzahl_kunde)]
##zweite Zeile einlesen
#Anzahl an Satelliten
    anzahl_satellit = int(lines[1])
#aus der Anzahl an Satelliten wird eine Liste erstellt
    satellit = []
    [satellit.append(s) for s in range(anzahl_satellit)]
##vierte Zeile auslesen
#ein Tupel mit den Koordinaten der Plattform wird erstellt
    koordinaten_plattform = []
    tupel = lines[3].split('\t')
    koordinaten_plattform.append((int(tupel[0]),int(tupel[1])))
##fünfte Zeile auslesen bis zur ersten Leerzeile
#ein Tupel mit den Koordinaten der Satelliten wird erstellt
#je nach Anzahl der Satelliten werden ab der fünften Zeile entsprechend viele Zeilen eingelesen
    koordinaten_satellit = []
    for line in range(4, anzahl_satellit+4):
        tupel = lines[line].split('\t')
        koordinaten_satellit.append((int(tupel[0]),int(tupel[1])))
##Einlesen der Koordinaten der Kundenstandorte
#ein Tupel mit den Koordinaten der Kunden wird erstellt
#je nach Anzahl der Kunden werden entsprechend viele Zeilen eingelesen
    koordinaten_kunde = []
    for line in range(anzahl_satellit+5, anzahl_kunde+anzahl_satellit+5):
        tupel = lines[line].split('\t')
        koordinaten_kunde.append((int(tupel[0]),int(tupel[1])))
##Anzahl an Sekundärfahrzeugen zum Erzeugen einer Liste mit der Kapazität der Sekundärfahrzeuge
#Anzahl an benötigter Fahrzeuge zweiter Stufe höchstens gleich der Anzahl an Kunden
    anzahl_sekundaerfahrzeug = anzahl_kunde
##Einlesen der Kapazität der Sekundärfahrzeuge
    kapazitaet_sekundaerfahrzeug = []
    [kapazitaet_sekundaerfahrzeug.append(int(lines[anzahl_kunde+anzahl_satellit+6])) for k in range(anzahl_sekundaerfahrzeug)]
##Anzahl an Primärfahrzeugen zum Erzeugen einer Liste mit der Kapazität der Primärfahrzeuge
#Anzahl an benötigter Fahrzeuge erster Stufe höchstens gleich der Anzahl an Satelliten
    anzahl_primaerfahrzeug = anzahl_satellit
##Einlesen der Kapazität der Primärfahrzeuge
    kapazitaet_primaerfahrzeug = []
    [kapazitaet_primaerfahrzeug.append(int(lines[anzahl_kunde+anzahl_satellit+7])) for k in range(anzahl_primaerfahrzeug)]
##Einlesen der Kapazitäten der Satelliten
#eine Liste mit den Kapazitäten der Satelliten wird erstellt
#je nach Anzahl der Satelliten werden entsprechend viele Zeilen eingelesen
    kapazitaet_satellit = []
    for line in range(anzahl_kunde+anzahl_satellit+9,anzahl_satellit+anzahl_kunde+anzahl_satellit+9):
        teil = lines[line].split('\n')
        kapazitaet_satellit.append(int(teil[0]))
##Einlesen der Nachfragen der Kunden
#eine Liste mit den Nachfragen der Kunden wird erstellt
#je nach Anzahl der Kunden werden entsprechend viele Zeilen eingelesen
    kundennachfrage = []
    for line in range(anzahl_satellit+anzahl_kunde+anzahl_satellit+10,anzahl_kunde+anzahl_satellit+anzahl_kunde+anzahl_satellit+10):
        teil = lines[line].split('\n')
        kundennachfrage.append(int(teil[0]))
##Einlesen der Kosten der Satelliten
#eine Liste mit den Kosten der Satelliten wird erstellt
#je nach Anzahl der Kunden werden entsprechend viele Zeilen eingelesen
    fixkosten_satellit = []
    for line in range(anzahl_kunde+anzahl_satellit+anzahl_kunde+anzahl_satellit+11,anzahl_satellit+anzahl_kunde+anzahl_satellit+anzahl_kunde+anzahl_satellit+11):
        teil = lines[line].split('\n')
        fixkosten_satellit.append(int(teil[0]))
##Einlesen der Kosten der Sekundärfahrzeuge
    nutzungskosten_sekundaerfahrzeug = []
    [nutzungskosten_sekundaerfahrzeug.append(int(lines[anzahl_satellit+anzahl_kunde+anzahl_satellit+anzahl_kunde+anzahl_satellit+12])) for n in range(anzahl_sekundaerfahrzeug)]
##Einlesen der Kosten der Primärfahrzeuge
    wert_nutzungskosten_primaerfahrzeug = int(lines[anzahl_satellit+anzahl_kunde+anzahl_satellit+anzahl_kunde+anzahl_satellit+13])
    nutzungskosten_primaerfahrzeug = []
    [nutzungskosten_primaerfahrzeug.append(int(lines[anzahl_satellit+anzahl_kunde+anzahl_satellit+anzahl_kunde+anzahl_satellit+13])) for n in range(anzahl_primaerfahrzeug)]
##Einlesen der Kosten der Plattform
    fixkosten_plattform = [int(lines[anzahl_satellit+anzahl_kunde+anzahl_satellit+anzahl_kunde+anzahl_satellit+15])]
#_______________________________________________________________________
##weitere Parameter
#alle Instanzen beinhalten nur eine Plattform
    plattform = [0]
    anzahl_plattform = 1
#Standorte erster Stufe beinhalten die Plattform und alle Satelliten
    standorte_ersterStufe = plattform + satellit
#Koordinaten der Standorte der ersten Stufe
    koordinaten_standorte_ersterStufe = koordinaten_plattform + koordinaten_satellit
#Standorte zweiter Stufe beinhalten alle Satelliten und alle Kunden
    standorte_zweiterStufe = satellit + kunde
#Koordinaten der Standorte der zweiter Stufe
    koordinaten_standorte_zweiterStufe = koordinaten_satellit + koordinaten_kunde
#alle Standorte der drei Ebenen
    alleStandorte = plattform + satellit + kunde
#Anzahl aller Standorte der drei Ebenen
    anzahlStandorte = len(alleStandorte)
#Kapazität der Plattform
#mindestens Summe über alle Kundennachfragen
    kapazitaet_plattform = [sum(kundennachfrage)]
#aus der Anzahl an Sekundärfahrzeugen wird eine Liste erstellt
    sekundaerfahrzeug = []
    [sekundaerfahrzeug.append(k) for k in range(anzahl_sekundaerfahrzeug)]
#aus der Anzahl an Primärfahrzeugen wird eine Liste erstellt
    primaerfahrzeug = []
    [primaerfahrzeug.append(k) for k in range(anzahl_primaerfahrzeug)]
#_______________________________________________________________________
##Rückgabe der Eingelesenen Parameter
    return (plattform, koordinaten_plattform, kapazitaet_plattform, fixkosten_plattform, anzahl_plattform,
    satellit, koordinaten_satellit, kapazitaet_satellit, fixkosten_satellit, anzahl_satellit, kunde,
    koordinaten_kunde, kundennachfrage, anzahl_kunde, standorte_ersterStufe, koordinaten_standorte_ersterStufe, standorte_zweiterStufe,
    koordinaten_standorte_zweiterStufe, alleStandorte, anzahlStandorte, primaerfahrzeug, kapazitaet_primaerfahrzeug, wert_nutzungskosten_primaerfahrzeug,
    anzahl_primaerfahrzeug, sekundaerfahrzeug, kapazitaet_sekundaerfahrzeug, nutzungskosten_sekundaerfahrzeug,
    anzahl_sekundaerfahrzeug)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie ist denn ›berechne_Crainic_drei_Indizes‹ definiert, bzw. wie kommt denn ›fahrtkosten_ersterStufe‹ da rein, da es nicht in der Parameterliste vorkommt?

Nicht dass ich den sonstigen Code verstehen wollte, vor allem bei einer Funktion die 28 Werte zurückliefert. List-Comprehensions sind dazu da, um Listen zu erzeugen, nicht um eine for-Schleife zu ersetzen, also ein Liste mit lauter None-Werten zu erzeugen, die dann weggeschmissen wird.

Code: Alles auswählen

    kunde = []
    [kunde.append(k) for k in range(anzahl_kunde)]
sollte eigentlich das sein:

Code: Alles auswählen

    kunde = []
    for k in range(anzahl_kunde):
        kunde.append(k)
oder das:

Code: Alles auswählen

    kunde = [k for k in range(anzahl_kunde)]
oder kurz:

Code: Alles auswählen

    kunde = list(range(anzahl_kunde))
Die Kommentare sind größtenteils überflüssig, weil nur das da steht, was sowieso in der nächsten Zeile steht.
Bine2706
User
Beiträge: 13
Registriert: Samstag 30. Juni 2018, 18:09

Ich hatte ein wenig rumprobiert, anfangs hatte ich alle drin. Aber ja, auch wenn ich es hinzufüge bleibt der Fehler der gleiche, es ist unabhängig davon.

so wie dein 1. Code hatte ich es anfangs, aber auf Anraten eines Mitarbeiter des Lehrstuhls habe ich die for-Schleife hinten angestellt.
Die Variante mit list ist aber wohl besser, das werde ich ändern, danke =)

Die Kommentare sind für meine Betreuerin der Masterarbeit. Wir müssen alles auf die Weise kommentieren.
Antworten