Wątek przeniesiony 2014-08-11 14:47 z Newbie przez Shalom.

Obliczanie proporcji materiału w zależności od jego ilości

0

Cześć. Próbuję napisać program który, tak jak mówi tytuł, oblicza zawartość procentową pewnej rzeczy, w zależności od tego ile tej rzeczy mamy w porównaniu do normy.
Przykład:
Chcę zrobić ciasto, które waży 10kg(jestem bardzo głodny). Zazwyczaj robię moje ciasto z:

  • jabłek(20-30%)
  • gruszek(20-30%)
  • pomarańczy(40-60%)

ale najlepsze wychodzi z proporcji pomiędzy min/max, czyli 25% jabłek, 25% gruszek i 50% pomarańczy. Jakość nie ma jednak znaczenia.
Mam:

  • 5kg jabłek
  • 5kg gruszek
  • 5kg pomarańczy

i chciałbym obliczyć wyrównane proporcje tych materiałów. Czyli jako że mam o wiele więcej jabłek i gruszek niż potrzeba do zrobienia mojego ciasta, chciałbym użyć ich najwięcej, ale mam tylko wystarczająco pomarańczy żeby stanowiły 50% ciasta, chciałbym użyć trochę mniej pomarańczy, i zastąpić je jabłkami i gruszkami. Nie chcę jednak po prostu brać maksymalnej wartości jabłek i gruszek a potem dzięki temu znaleźć proporcje pomaranćzy, chcę żeby proporcje były dopasowane do ilości materiału w porównaniu do ilości potrzebnej do zrobienia dobrego ciasta (25,25,50).

Próbowałem wymyślić jak obliczyć te proporcje przez cały dzień, ale po prostu nie mogę wymyślić jak to zrobić.
Ma ktoś jakiś pomysł?

0

Zadanie niby matematyczne, ale opis tragiczny. Opisz nam łaskawie to zadanie korzystając przynajmniej z minimum formalizmu. Bo póki co to wcale nie wiadomo co to znaczy u ciebie "wyrównanie proporcje materiałów". Jakie (i dlaczego!) powinno być rozwiązanie dla podanego przez ciebie przykładu?

0

No i właśnie pewnie dlatego nie mogłem tego zrobić. Wiem że chcę obliczyć proporcje wszystkich 3 składników, które mieszczą się w dozwolonym interwale, ale jednocześnie oszczędzając materiały których mam mało kosztem używania większej ilości materiału którego mam więcej.

1

Przykro mi ale bez precyzyjnego opisu nie da się takiego zadania rozwiązać. Bo co to znaczy "oszczędzając"? Albo "większej ilości"? Że już o warunkach brzegowych to nawet nie mówię.
Generalnie wygląda to na problem "constraint programmingu" ale najpierw to ty się musisz dowiedzieć co faktycznie chcesz minimalizować / maksymalizować w tym zadaniu.

0

Okej to może spróbuję bardziej generalnie. Całość to X.
Mam klasę(konsruktory, gettery i settery usunąłem żeby nie zajmowały miejsca):

public class Material{
	private Ratio ratio;
	private int availableMaterials;
}
public class Ratio {
	private int min, max, optimal;

    public Ratio(int min, int max, int optimal){
        this.min = min;
        this.max = max;
        this.optimal = optimal;
    }
} 

Następnie robię tablicę Materiału i tablice gdzie przechowywane będą końcowe proporcje:

Material[] material = new Material[]{new Material(new Ratio(20, 30, 25), 5),
                                     new Material(new Ratio(20, 30, 25), 5),
                                     new Material(new Ratio(40, 60, 50), 5)};
int[] proportions = new int[material.length];

Tablica proportions zawiera końcowe proporcje(suma wszystkich proporcji = 100).
I tutaj mam problem. Obliczam o ile procent mniej/więcej materiału mam od optymalnego materiału:

int[] array = new int[material.length];
for (int i = 0; i < array.length; i++){
    array[i] = material[i].getAvailableMaterials() / X - (material[i].getRatio().getOptimal() / 100);
}
 

Chcę z tych liczb uzyskać liczby które pomnożywszy przez optymalną proporcję materiału zmniejszą lub zwiększą jego użycie. Czyli tak jakby down/up-scale factors. Rezultat- mniejsze użycie materiału którego jest mało, większe użycie materiału którego jest dużo.

1

Nadal nie jasne co chcesz osiągnąć.
Może jak nie rozumiesz o co cie pytamy to podaj jako przykład dla twojego zadania:
jabłek(20-25-30)
gruszek(20-25-30)
pomarańczy(40-50-60)
5kg jabłek
5kg gruszek
5kg pomarańczy
kiedy potrzebujemy ( 10 10.5 11 11.5 12 15.5 ) kg - czyli 6 rozwiązań zrobionych ręcznie czy w jakikolwiek inny sposób, aby zrozumieć czego chcesz.
Może się okazać że lepiej by ilustrowało zadanie gdyby gruszki zmieniłeś na:
gruszek(25-30-35)

0

Rozmyślam już nad tym drugi dzień i chyba nie da się tego zrobić prostym sposobem. Ledwo potrafię wytłumaczyć słowami, więc raczej nie uda mi się tego zaprogramować. Mój błąd to to że myślałem że da się znaleźć jednoznaczne liczby które zdecydują o ilości składników, ale jest za dużo decyzji które program sam musi podjąć. Tak dużo że program traci swoją wartość, chyba że wyślę mu kupę danych, które muszą pochodzić od użytkownika. Dzięki za dobre chęci.

0

No więc podaj przykład.

0

@jammasterz jak wspomniałem wcześniej: możesz spróbować użyć jakiejś biblioteki / języka do constraint programmingu. Twój problem dość dobrze pasuje do tej dziedziny, ale musisz umieć jednoznacznie, za pomocą pewnych równań, określić co ma być tu optymalizowane. Popatrz np. na http://strasheela.sourceforge.net/strasheela/doc/ConstraintProgramming.html#sec13

2
jammasterz napisał(a):

Rozmyślam już nad tym drugi dzień i chyba nie da się tego zrobić prostym sposobem. Ledwo potrafię wytłumaczyć słowami, więc raczej nie uda mi się tego zaprogramować. Mój błąd to to że myślałem że da się znaleźć jednoznaczne liczby które zdecydują o ilości składników, ale jest za dużo decyzji które program sam musi podjąć. Tak dużo że program traci swoją wartość, chyba że wyślę mu kupę danych, które muszą pochodzić od użytkownika. Dzięki za dobre chęci.

Wydaje mi się, że trzeba uporządkować pewne rzeczy. Mało tutaj programowania, nawet algorytmu a więcej matematyki. Nie wiem na jakim poziomie wiedzy jesteś z matematyki, więc uniknę analizy funkcji wielozmiennej i odwołam się do... wiedzy z podstawówki/liceum, bo problem chyba jest trywialny.

Na początku, tak jak słusznie zostało wspomniane brakuje formalizmu problemu. Z informacji, które napisałeś jest taki układ, reprezentujący jakiś wycinek płaszczyzny:
user image

gdzie:
a - proporcja jabłek;
b - proporcja gruszek;
c - proporcja pomarańczy.

Nie będę rozwiązywał tego w całości - zostawię coś dla ciebie. Skrócę zadanie do dwóch wymiarów - np. chcemy przygotować ciasto jabłkowe-gruszkowe (przyjęte propozycje to jabłko 30%-40%, gruszka 60%-70%)
Wtedy nasz równań uprasza się to jakiegoś odcinka:
user image

Reprezentacja graficzna powyższego układu to:
user image

Teraz największy problem to jest do czego dążysz. Wg mnie oczekujesz, że najlepszym (idealnym) zużyciem materiałów jest takie, że resztki materiałów jakie otrzymasz będą w proporcji a/b/c.

Przyjmijmy oznaczenie:
j - ilość jabłek;
g- ilość gruszek;
m - masa ciasta.

to powyższa zależność to:
user image
Chociaż można było się spodziewać takiego uproszenia to specjalnie tak to rozpisałem, abyś wiedział skąd się wzięło i abyś mógł ewentualnie modyfikować swój cel. (np. jeżeli uważasz, że najbardziej optymalnym podziałem jest stan równości resztek to równanie: j-am=g-bm).

Ok to czas na wytłumaczenie sposobu działania algorytmu:

j= 10 kg;
b= 10 kg;
bez specjalnego liczenia wiemy, że a=0.5 i b=0.5.

Wersja graficzna:
user image

Z tego wynika, że bliższy punkt to końcówka naszego odcinka czyli a=0.4 b =0.6.

Analogiczne dla pozostałych przypadków, czyli punkt po lewej stronie odcinka i punkt w odcinku. Oczywiście powyższe to spore uproszenie, bo bez jednego wymiaru ale powinno Cię to na kierować na rozwiązanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1