有限制的资金分配

如何解决有限制的资金分配

我正在尝试解决一个问题,以确定受各种约束的政府拨款。最好将问题描述为:

政府已决定提供总计1,800,000欧元的财政援助。他们邀请了同样的申请。他们已经决定了如何分配资金的一些限制。约束是:

  1. 可根据申请人的财务状况分配的最大金额上限。

    丰富= 300,000

    中产阶级= 500,000

    差= 1,000,000

  2. 可以根据申请人的性别分配的最大金额。

    男性= 800,000

    女性= 1,000

他们收到了不同组合的申请。政府无法分配该申请收到的更多款项。

+--------------------+------------------+-----------------------------+------------------------+
| Applicant Category | Applicant Gender | Total Applications Received | Amount to be allocated |
+--------------------+------------------+-----------------------------+------------------------+
| Rich               | Male             | 200,000                     |                        |
| Middle class       | Female           | 400,000                     |                        |
| Middle class       | Male             | 350,000                     |                        |
| Poor               | Female           | 650,000                     |                        |
| Poor               | Male             | 750,000                     |                        |
+--------------------+------------------+-----------------------------+------------------------+

在上面的示例中,Rich Male的申请总数为200,000。因此,政府不能为该类别分配超过200,000的资金。如果这有助于增加所有这些行的总支出金额,则政府可以分配的预算少于此。

中产阶级男性总共要求40万,中产阶级女性要求35万。但是,可以在中产阶级类别中支出的总金额为500,000。这意味着它无法完全分配给这些存储桶,而需要减少支付。

中产阶级女性要求40万,贫穷女性要求65万。但是,所有女性可以支付的总金额为1,000,这意味着这两个桶也无法完全分配。

上表中的

“要分配的金额”列是必须确定的算法。诸如此类-可以分配给表中每个条目的最大金额是多少,该金额将允许我们总共支付最大金额,而没有违反任何约束,因此“要分配的金额”不应超过“收到的申请总数”?

例如,如果我们将700,000美元分配给贫困男性,则需要同时从男性和贫困类别中扣除。在将700,000分配给贫困男性后,男性的剩余金额变为100,000(800,00-700,000),而贫困人口变为300,000(1,000-700,000)。现在,对其他条目的后续分配必须考虑到修改后的约束,并确保不违反限制。

目的是确定政府可以分配给类别和性别的每种组合的数量,以使总支出最大化。

我对线性编程还是有点陌生​​,但是通过阅读在线帮助,我可以确定我可以分别限制在每个类别上的约束条件。

x (rich) <= 300,000
y (middle class) <= 500,000
z (poor) <= 1,000
p (male) <= 800,000
q (female) <= 1,000

但是,我无法对政府收到的申请制定限制。例如,有钱男性收到的200,000个申请不会转换为(x + p)

解决方法

我们可以用以下线性方程式来表达上述问题:

Let Rm = Rich Male
    Rm = Rich Female 
    Mm = Middleclass Male
    Mf = Middleclass Female
    Pm = Poor Male
    Pf = Poor Female

目标Maximize: Rm + Rf + Mm + Mf + Pm + Pf

主题:

1) Rm + Rf <= 300,000
2) Mm + Mf <= 500,000
3) Pm + Pf <= 1,000,000

4) Rm + Mm + Pm <= 800,000
5) Rf + Mf + Pf <= 1,000

6) Rm <= 200,000
7) Mm <= 350,000
8) Pm <= 750,000
9) Rf <= 0
10) Mf <= 400,000
11) Pf <= 650,000

可以根据输入数据更改约束6-11。
解决这个问题,我们得到:

Rm = 200,000
Mm = 250,000
Pm = 350,000
Rf = 0
Mf = 250,000
Pf = 650,000

因此,根据给定的数据,总共1,70,000会分配给申请者

,

代码:

from pulp import *
import pandas as pd

# Problem Data

df = pd.DataFrame({'economic': ['rich','middle','poor','poor'],'gender': ['male','female','male','male'],'received': [200000,400000,350000,650000,750000]})

max_by_economic = {'rich': 300000,'middle':500000,'poor':1000000}
max_by_gender = {'male': 800000,'female':500000,'poor':1000000}
max_total = 1800000

# Implementation
prob = LpProblem("allocation",LpMaximize)

alloc_vars = LpVariable.dicts('alloc_vars',df.index)

# Objective
prob += lpSum([alloc_vars[i] for i in df.index])

# Bounds
for i in df.index:
    prob += alloc_vars[i] <= df.received[i]


# Constraints
for status in max_by_economic:
    prob += lpSum([alloc_vars[i] for i in df.index if df['economic'][i] == status]) <= max_by_economic[status]

for gender in max_by_gender:
    prob += lpSum([alloc_vars[i] for i in df.index if df['gender'][i] == gender]) <= max_by_gender


prob += lpSum([alloc_vars[i] for i in df.index]) <= max_total


prob.solve()

# Load results into dataframe                  
df['allocation'] = [alloc_vars[i].varValue for i in df.index]
print(df)

返回:

  economic  gender  received  allocation
0     rich    male    200000    200000.0
1   middle  female    400000    150000.0
2   middle    male    350000    350000.0
3     poor  female    650000    250000.0
4     poor    male    750000    750000.0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-