SmokingMonkey
SmokingMonkey

Reputation: 21

How to get the solution of a linear programming equations

A farmer has a piece of farm land, say L km2, to be planted with either wheat or barley or some combination of the two. The farmer has a limited amount of fertilizer, F kilograms, and insecticide, P kilograms. Every square kilometer of wheat requires F1 kilograms of fertilizer, and P1 kilograms of insecticide, while every square kilometer of barley requires F2 kilograms of fertilizer, and P2 kilograms of insecticide. Let S1 be the selling price of wheat per square kilometer, and S2 be the selling price of barley. If we denote the area of land planted with wheat and barley by x1 and x2 respectively, then profit can be maximized by choosing optimal values for x1 and x2. This problem can be expressed with the following linear programming problem in the standard form: see this page where they have given the constraints. http://en.wikipedia.org/wiki/Linear_programming

What is the procedure to solve such kind of questions ?

Upvotes: 0

Views: 1350

Answers (2)

Vivek
Vivek

Reputation: 111

import java.text.DecimalFormat;

public class CandidateCode {
    public String get_total_profit(String input1) {
        String[] inputs = input1.split(",");
        // Piece of farm land in square kilometer
        float L = Float.valueOf(inputs[0]);
        // Fertilizer in kg
        float F = Float.valueOf(inputs[1]);
        // Insecticide in kg
        float P = Float.valueOf(inputs[2]);
        // Fertilizer required in kg for square kilometer of Wheat
        float F1 = Float.valueOf(inputs[3]);
        // Insecticide required in kg for square kilometer of Wheat
        float P1 = Float.valueOf(inputs[4]);
        // Fertilizer required in kg for square kilometer of Rice
        float F2 = Float.valueOf(inputs[5]);
        // Insecticide required in kg for square kilometer of Rice
        float P2 = Float.valueOf(inputs[6]);
        // Selling price of wheat per square kilometer
        float S1 = Float.valueOf(inputs[7]);
        // Selling price of rice per square kilometer
        float S2 = Float.valueOf(inputs[8]);

        // Result Variables
        float totalRiceInsecUsed = 0f;
        float totalRiceFertUsed = 0f;
        float totalWheatInsecUsed = 0f;
        float totalWheatFertUsed = 0f;
        float areaOfWheat = 0.00f;
        float areaOfRice = 0.00f;
        float amount = 0.00f;

        while (true) {
            if ((L == areaOfRice + areaOfWheat)
                    || P == totalRiceInsecUsed + totalWheatInsecUsed
                    || F == totalRiceFertUsed + totalWheatFertUsed || F2 == 0
                    || F1 == 0 || P2 == 0 || P1 == 0) {
                break;
            }

            float calRiceProfit = Math.min(F / F2, P / P2) * S2;
            float calWheatProfit = Math.min(F / F1, P / P1) * S1;

            if (calRiceProfit > calWheatProfit) {
                float areaInsecUsed = P / P2;
                float areaFertUsed = F / F2;
                if (areaInsecUsed > areaFertUsed) {
                    L = L - areaFertUsed;
                    F2 = 0;
                    totalRiceFertUsed = totalRiceFertUsed + F2;
                    areaOfRice = areaOfRice + areaFertUsed;
                    amount = amount + areaFertUsed * S2;
                } else if (areaInsecUsed < areaFertUsed) {
                    L = L - areaInsecUsed;
                    P2 = 0;
                    totalRiceInsecUsed = totalRiceInsecUsed + areaInsecUsed;
                    areaOfRice = areaOfRice + areaInsecUsed;
                    amount = amount + areaInsecUsed * S2;
                }
            } else {
                float areaInsecUsed = P / P1;
                float areaFertUsed = F / F1;
                if (areaInsecUsed > areaFertUsed) {
                    L = L - areaFertUsed;
                    F1 = 0;
                    totalWheatFertUsed = totalWheatFertUsed + F1;
                    areaOfWheat = areaOfWheat + areaFertUsed;
                    amount = amount + areaFertUsed * S1;
                } else if (areaInsecUsed < areaFertUsed) {
                    L = L - areaInsecUsed;
                    P1 = 0;
                    totalWheatInsecUsed = totalWheatInsecUsed + areaInsecUsed;
                    areaOfWheat = areaOfWheat + areaInsecUsed;
                    amount = amount + areaInsecUsed * S1;
                }
            }

        }
        DecimalFormat df = new DecimalFormat();
        df.setMaximumFractionDigits(2);
        df.setMinimumFractionDigits(2);
        return df.format(amount) + "," + df.format(areaOfWheat) + ","
                + df.format(areaOfRice);
    }
}

Upvotes: 1

Robert Dodier
Robert Dodier

Reputation: 17576

Your problem is a so-called linear programming problem. There are various algorithms and various implementations. I have used a program called GLPK and it works well. You state your problem in a domain-specific programming language and GLPK processes the program to find a solution. A web search for GLPK should find it.

Upvotes: 1

Related Questions