首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何求解一个线性规划方程组

如何求解一个线性规划方程组
EN

Stack Overflow用户
提问于 2014-04-22 23:15:47
回答 2查看 1.3K关注 0票数 0

农民有一块农田,比方说L km2,种植小麦或大麦或两者的某种组合。农民有有限的肥料,F公斤,和杀虫剂,P公斤。每平方公里的小麦需要F1公斤的肥料和P1公斤的杀虫剂,而每平方公里的大麦需要F2公斤的肥料和P2公斤的杀虫剂。设S1为每平方公里小麦的销售价格,S2为大麦的销售价格。如果我们用x1和x2分别表示小麦和大麦的种植面积,那么可以通过选择x1和x2的最佳值来最大化利润。这个问题可以用以下标准形式的线性规划问题来表示:请参阅此页面,其中给出了约束。http://en.wikipedia.org/wiki/Linear_programming

解决这类问题的程序是什么?

EN

回答 2

Stack Overflow用户

发布于 2014-04-23 09:12:29

你的问题就是所谓的线性规划问题。有各种算法和不同的实现。我用过一个叫GLPK的程序,它工作得很好。您使用一种特定于领域的编程语言来说明您的问题,GLPK将处理该程序以找到解决方案。在web上搜索GLPK就可以找到它。

票数 1
EN

Stack Overflow用户

发布于 2016-08-10 18:52:09

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23223538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档