Hilflos gestrandet in R

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
ebelus

Hilflos gestrandet in R

Beitrag von ebelus »

Hallo
könnte mir jemand bei unserem Studienprojekt helfen?
Wir haben leider keinene Ansatzpunkt wie wir das Problem lösen können.
Wir würden uns sehr über eure Hilfe freuen :)
Liebe Grüße Stephani

Schicht-Kalender

Krankenschwestern arbeiten normalerweise 3 Tage pro Woche. Es gibt 5 Schichten.

Am Montag werden 20 Schwestern benötigt, Dienstags 25, Mittwochs 26, Donnerstags 26, Freitags 30, Samstags 30 und Sonntags 35.
1. Schicht arbeitet Montag, Dienstag, Sonntag
2. Schicht: Donnerstag, Freitag, Samstag
3. Schicht: Montag, Mittwoch, Sonntag
4. Schicht: Mittwoch, Freitag, Samstag
5. Schicht: Dienstag, Donnerstag, Freitag

Das wöchentliche Gehalt ist je Schicht anders:
1. Schicht: 525
2. Schicht: 470
3. Schicht: 550
4. Schicht: 500
5. Schicht: 425

Bestimmen Sie die Anzahl der benötigten Krankenschwestern pro Schicht so, dass die Gesamtkosten minimiert werden.
a) Wie sieht die Koeffizienten-Matrix A dazu aus?
b) Benutze die Nummern (nicht die Symbole) in der Tabelle um das Problem zu modellieren.
• Teilzeit-Krankenschwestern koten 150 pro Tag
• Formuliere das Problem um die Kosten zu minimieren
• Wenn Teilzeitkräfte von 4 Vollzeitkräften begleitet werden müssen, wie würdest du das Problem formulieren?
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Hilflos gestrandet in R

Beitrag von jogo »

Hallo Stephani,

willkommen im Forum!
Ich sehe jetzt noch keinen Zusammenhang zu R. Habt Ihr überhaupt schon irgend etwas in R unternommen, um die Aufgabe zu lösen. Wenn ja, dann bitte diese Arbeiten präsentieren.
Wenn nein, dann hat die Aufgabe im jetzigen Zustand nichts mit R zu tun, weil erstmal ein Plan für die Lösung erarbeitet werden muss. R ist dann erst bei der Umsetzung dran.

Ein erster Ansatz könnte sein:
1. Benennung der fünf Variablen (Anzahl der Krankenschwestern in einer Schicht), z.B. s1, s2, s3, s4, s5
2. Skizze zum Wochenplan, 5 * 7 Matrix, an welchem Tag ist welche Schicht eingesetzt.
3. Formulierung der Bedingungen für den Schichtplan:
gehe jeden Wochentag durch und schaue, welche Schichten eingesetzt sind. Die Summe der s_i muss mindestens so groß sein wie die geforderte Zahl für diesen Wochentag; also 7 Nebenbedingungen
4. Formulierung der Zielfunktion: 525*s1 + 470*s2 + ... soll minimiert werden.
So, jetzt ist für Teilaufgabe a) alles klar; es ist ein einfaches lineares Optimierungsmodell.
Und ja, für solche Probleme ist R bestens gerüstet: https://cran.r-project.org/view=Optimization
* Package [linprog](https://cran.r-project.org/web/packages ... index.html) solves linear programming problems using the function solveLP() (the solver is based on [lpSolve](https://cran.r-project.org/web/packages ... index.html)) and can read model files in MPS format. [LP]
Gruß, Jörg
p.s.: Ich habe der Einfachheit halber die Anforderung der Ganzzahligkeit unberücksichtigt gelassen.
p.p.s: Bei Vernachlässigung der Ganzzahligkeitsbedingung ergeben sich trotzdem als Lösung ganze Zahlen: Glück gehabt!

Nachtrag:
Dass man gegebenenfalls auch nicht so viel Glück haben kann, sieht man bei der Lösung der Teilaufgabe b).
Dort ergeben sich als Lösung (wenn ich alles richtig gerechnet habe) nicht bei allen Bedarfen ganze Zahlen.
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Hilflos gestrandet in R

Beitrag von jogo »

Code: Alles auswählen

library("linprog")
schicht.plan <- read.table(text=
" s1 s2 s3 s4 s5 b
Mo 1 0 1 0 0 20
Di 1 0 0 0 1 25
Mi 0 0 1 1 0 26
Do 0 1 0 0 1 26
Fr 0 1 0 1 1 30
Sa 0 1 0 1 0 30
So 1 0 1 0 0 35")
# die Bedingungen für Mo und Fr sind redundant
A <- as.matrix(schicht.plan[, 1:5])
c.Koeff <- c(525, 470, 550, 500, 425)
solveLP(cvec=c.Koeff, bvec=schicht.plan$b, Amat=A, const.dir = rep(">=", nrow(A)), maximum = FALSE)

anz <- diag(1, 7)
tz  <- diag(1, 7)
A.plusTZ <- rbind(
  cbind(A, -anz, diag(0, 7)),  # Definition der Anzahl je Wochentag ==0
  cbind(0*A, anz, -4*tz),      # 1*tz erfordert mind. 4*Vollzeit    >=0
  cbind(0*A, anz, tz)          # Bedingungen Anwesenheit            >=b
)
c.Koeff.plusTZ <- c(c.Koeff, rep(c(0,150), each=7))
solveLP(cvec=c.Koeff.plusTZ, bvec=c(rep(0,14), schicht.plan$b), Amat=A.plusTZ, 
        const.dir = rep(c("==", ">=", ">="), each=nrow(A)), maximum = FALSE, lpSolve = TRUE, verbose = 1)
Antworten