System produkcyjny o znaczeniu krytycznym ma n etapów, które muszą być wykonywane sekwencyjnie; etap i jest wykonywany przez maszynę M_i.Algorytm programowania dynamicznego podobny do Knapsack Java Code
Każda maszyna M_i ma prawdopodobieństwo r_i niezawodnie działającego i prawdopodobieństwo 1-r_i awarii (a awarie są niezależne). Dlatego jeśli zaimplementujemy każdy etap z pojedynczą maszyną, prawdopodobieństwo, że cały system działa, to r_1, r_2, ..., r_n. Aby zwiększyć to prawdopodobieństwo dodajemy nadmiarowość poprzez posiadanie m_i kopii maszyny M_i, która wykonuje etap i.
Prawdopodobieństwo, że wszystkie kopie m_i zawiodą jednocześnie, wynosi tylko (1-r_i)^(m_i), więc prawdopodobieństwo, że etap i zostanie zakończony poprawnie wynosi 1- (1-r_i)^(mi) i prawdopodobieństwo, że cały system działa jako prod (i = 1, n) {1- (1-r_i)^(m_i)}.
Każda maszyna M_i ma koszt c_i, a całkowity budżet B to zakup maszyn. (Załóżmy, że B i c_i są dodatnimi liczbami całkowitymi). Napisz algorytm w kodzie Javy, który podał prawdopodobieństwa r_1, ..., r_n, koszty c_1, ..., c_n i budżet B, znajdzie zwolnienia m_1, .. ., m_n, które mieszczą się w dostępnym budżecie i maksymalizują prawdopodobieństwo, że system działa poprawnie (określić maksymalną osiągalną niezawodność). Pokaż także, ile maszyn każdego typu osiąga tę niezawodność związaną z budżetem.
Więc czytam w pliku, który daje mi całkowity budżet, a następnie liczbę maszyn, a następnie dla każdej maszyny czytam w kosztach i niezawodności. Przechowuję koszt i niezawodność na dwóch połączonych listach (nie jestem pewien, czy to jest najlepsze).
try {
BufferedReader newFileBuffer = new BufferedReader(new FileReader(inputFile));
budget = Integer.parseInt(newFileBuffer.readLine());
numberOfMachines = Integer.parseInt(newFileBuffer.readLine());
while ((fileLine = newFileBuffer.readLine()) != null)
{
line = fileLine.split(" ");
try
{
cost.add(Integer.parseInt(line[0]));
totalCostOfOneEach += Integer.parseInt(line[0]);
reliability.add(Float.parseFloat(line[1]));
} catch (NumberFormatException nfe) {};
}
newFileBuffer.close();
} catch (Exception e)
{
e.printStackTrace();
}
Stąd wiem, że jednym z każdej maszynie musi być użyta tylko raz, więc odjąć budżetu o łączną kwotę to koszt jednej z każdej maszynie (totalCostOfOneEach), to daje mi pozostało budżetu lub budżet redundancji Jeśli będziesz.
bRedundent = (budget - totalCostOfOneEach);
Teraz jest, gdzie utknąłem, jestem zagubiony na tym, co pętli, aby znaleźć rozwiązanie. I zbadali i okazało się to solution ale nie rozumiem linię
Pr(b,j)=max{Pr(b-c_j*k, j-1)*(1-(1-r_j)^k}
Więc co wiem jest Stworzyłem podwójną tablicę i zainicjować tablice jak tak:
double[][] finalRel = new double[numberOfMachines][bRedundent];
for (int j = 0; j < numberOfMachines; j++)
{
finalRel[0][j] = 0;
}
for (int b = 1; b < budget; b++)
{
finalRel[b][1] = reliability.get(0);
}
Teraz jest gdzie utknąłem, wierzę, że powinienem włączyć pętlę na liczbie komputerów, a następnie kosztach, ale to nie działa i wiem, że muszę jakoś uwzględnić budżet. Więc to, co aktualnie mam, że nie działa w ogóle:
for (int i = 1; i < numberOfMachines; i++)
{
for (int c = cost.get(i); c < budget; c++)
{
finalRel[i][c] = Math.min(finalRel[i-1][c], finalRel[i-1][c - cost.get(numberOfMachines)]*(l));
}
}
Wiem subproblem oznaczamy finalRel [I, B], najbardziej niezawodny konfiguracja maszyn 1, 2. . . , i (co najmniej jedna z każdej maszyny) dostępne w ramach budżetu b. Pożądana odpowiedź będzie ostatecznaRel [n, B].
I powtarzanie się, jeśli jesteśmy w ramach budżetu, zwracamy niezawodność 0 (co nie jest możliwe). Jeśli brakuje nam budżetu (b = 0), ale wciąż trzeba kupić maszyny (i> 0), zwracamy 0 (załóżmy wszystkie ci> 0). Jeśli i = 0, nie mamy maszyn, które musimy kupić, więc niezawodność wynosi 1 (jeśli byłaby 0, to wszystko byłoby pomnożone przez 0, co nie jest dobre). Jeśli pozostanie budżet (b> 0) i maszyny do kupienia (i> 0), wypróbujemy wszystkie możliwości m maszyn typu i do kupienia - musimy kupić co najmniej m ≥ 1 i do m ≤ b ≤ podłoga (b/c_i) ≤ b ≤ B, z nich. W każdym przypadku pozostały budżet będzie wynosił b - m · c_i. Najlepsza niezawodność dla maszyn 1,. . ., i - 1 będzie REL [i - 1, b - m · ci], który musi być pomnożony przez wkład m kopii M_i, (1 - (1 - ri)^m) lub podsumowany here.
Zdaję sobie z tego mnóstwo informacji, ale utknąłem przez jakiś czas, więc każda pomoc jest doceniana.
Nie rozumiem tej linii: 'R (i, b) = max {R (i-1, b - k * c_i) * (1 - (1-r_i)^k) dla k = 0 , ..., floor (b/c_i)} ' Jak to działa, bierzesz maksimum między podwójną tablicą a pętlą podłogową, która definiuje co to jest k, ale próbujemy go użyć przed nim jest zdefiniowany w funkcji max? Jeśli pętla for ma być zawarta w funkcji max, nie widzę, w jaki sposób zwróciłaby podwójną tablicę? Przepraszam, walczę z tą logiką. –
@BillLogger https://en.wikipedia.org/wiki/Set-builder_notation –
jest sposobem na osiągnięcie tego w java jest użycie ImmutableSet.Builder? http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableSet.Builder.html –