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.
Sirius3
User
Beiträge: 18265
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: 18265
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