节约粮食-线性规划

Description:

 

Accept:

#include<bits/stdc++.h>

using namespace std;
const int maxn = 1e3 + 10;
const double inf = 1e20;
const double eps = 1e-8;
struct Simplex
{
    vector<double> b, c;
    vector<vector<double> >a;
    double z;
    int n, m;
    void Init(int n_, int m_)
    {
        n = n_, m = m_;
        b.resize(m);
        a.resize(m);
        c.resize(n);
        for(auto &x : a) x.resize(n + 1), fill(x.begin(), x.end(), 0);
        std::fill(b.begin(), b.end(), 0);
        std::fill(c.begin(), c.end(), 0);
        z = 0;
    }
    void Pivot(int k, int l)
    {
        b[l] /= a[l][k];
        for(int j = 0; j < n; j ++)
            if(j != k) a[l][j] /= a[l][k];
        for(int i = 0; i < m; i ++)
        {
            if(i != l && fabs(a[i][k]) > eps)
            {
                b[i] -= a[i][k] * b[l];
                for(int j = 0; j < n; j ++)
                    if(j != k) a[i][j] -= a[i][k] * a[l][j];
                a[i][k] /= -a[l][k];
            }
        }
        z += c[k] * b[l];
        for(int j = 0; j < n; j ++)
            if(j != k) c[j] -= c[k] * a[l][j];
        c[k] /= -a[l][k];
        a[l][k] = 1 / a[l][k];
    }
    double Solve()
    {
        while(true)
        {
            int k = 0, l = 0;
            double minc = inf;
            for(int i = 0; i < n; i ++)
                if(c[i] < minc)
                    minc = c[k = i];
            if(minc > -eps) return z;
            double minba = inf;
            for(int i = 0; i < m; i ++)
                if(a[i][k] > eps && minba - b[i] / a[i][k] > eps)
                    minba = b[i] / a[i][k], l = i;
            if(minba == inf) return inf;
            Pivot(k, l);
        }
    }
};
int n, m;
const int nlimit = 24;
Simplex spx;
int main()
{
    scanf("%d%d", &n, &m) ;
    
        spx.Init(n + m, m);
        for(int i = 0; i < n; i ++)
            scanf("%lf", &spx.c[i]), spx.c[i] = -spx.c[i];
        for(int i = 0; i < m; i ++)
        {
            for(int j = 0; j < n; j ++)
                scanf("%lf", &spx.a[i][j]);
            scanf("%lf", &spx.b[i]);
            spx.a[i][n + i] = 1;
        }
        printf("Nasa can spend %d taka.", (int)ceil(-spx.Solve() * m));
    
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
人工智能中的优化问题通常可以通过线性规划和非线性规划来求解。线性规划是一种优化问题的数学建模方法,通过将目标函数和约束条件都表示为线性关系,求解可以使目标函数最大或最小的决策变量的取值。线性规划的一个经典求解方法是单纯形法。 单纯形法是一种逐步靠近最优解的迭代算法。它从任意可行解开始,通过交替寻找非基变量和基变量,利用单纯形表格进行计算,在每一次迭代中使目标函数达到更优解。这种方法适用于线性规划问题,并且在数学理论上能够保证最优解的存在性。 大M法是单纯形法的一种改进方法,用于处理带有人工变量和松弛变量的问题。通过引入一个大的正数M,将目标函数中的人工变量转化为一个与目标函数无关的惩罚项,从而将问题转化为标准的线性规划问题。大M法可以解决含有无穷边界解或无可行解的线性规划问题。 非线性规划是指目标函数或约束条件中存在非线性项的优化问题。对于非线性规划问题,可以使用拉格朗日乘子法进行求解。拉格朗日乘子法通过构建拉格朗日函数来将非线性约束转化为等式约束,从而将非线性规划问题转化为无约束问题。通过求解拉格朗日函数的稳定点,可以得到原始非线性规划问题的解。 总而言之,线性规划是一种用于求解目标函数和约束条件都具有线性关系的优化问题的方法,单纯形法和大M法是线性规划的两种常用解法;非线性规划则用于处理目标函数或约束条件中存在非线性项的优化问题,拉格朗日乘子法是一种求解非线性规划问题的常用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值