昨天读到一个项目,是关于优化求解的。

约束条件如下:

公司里有很多客户,客户之所以不继续用我们的产品了,是因为他账户余额是负的,所以,为了重新赢回这些客户,公司决定发放优惠券cover掉客户账户的负余额。

具体细节:

  • 只有8元,80元,200元的优惠券
  • 发放给一个客户的优惠券总张数不能超过15张
  • 要既能cover掉客户的负余额,又要保证发放给客户的优惠券张数最少
  • 发放给客户的总金额-客户的亏损额不能大于8,且越小越好。(不能送太多便宜了)
####################### 构造一个数据框,里面包含所有可能的送券组合################################
x=data.frame(x=rep(0:15,1)) # 表示 200的券 的张数
y=data.frame(y=rep(0:15,1)) # 表示 80的券 的张数
z=data.frame(z=rep(0:15,1)) # 表示 8的券 的张数
library(sqldf)
# 做笛卡尔积
df <- sqldf('select * from x,y,z')
head(df)
df$coupon_sum <-apply(df,1,sum) # 对行求和
df$amt_sum <- df$x*200+df$y*80+df$z*8 # 加权重求和
#过滤掉 sum>15的 组合
df <- sqldf('select * from df where coupon_sum<=15 order by amt_sum asc')
## step 2
#######################################################
### 下面是给出任意一个 亏损 比如 loss=-987,则 fun2(-987) 返回出用200,80,8各几张,能获得gap最小
fun2 <- function(i){
if(i< -3000){
return(data.frame(loss=i,x=15,y=0,z=0,coupon_sum=15,amt_sum=3000,gap=3000+i))
} else {
df$gap <- i+df$amt_sum
df_positive <- sqldf('select * from df where gap>=0')
res <- sqldf('select * from df
where gap in (select gap from df_positive order by gap limit 1)
order by gap,coupon_sum
limit 1')
return(cbind(loss=i,res))
}
}
## step 3
# #### 建一个 函数 fun3,其中调用了fun2
fun3 <- function(original_df){
final_res <- data.frame()
for(m in 1:length(original_df[,1])){
row.res <- cbind(customID=original_df[m,1],fun2(original_df[m,2]))
final_res <- rbind(final_res,row.res)
}
return(final_res)
} ## step 4
# 构造一个测试数据集 test.df 进行测试
test.df <- data.frame(customID=rep(1:200,1),loss=abs(rnorm(200))*(-2000))
test.df
final_res <- fun3(test.df)
head(final_res)
write.csv(final_res,"final_res.csv",sep = ",")

规划求解

\(\min\ result= 200x+80y+8z\)

\[f(x)=
\begin{cases}
x \le 15 ,\\
y \le 15 ,\\
z& \le 15 ,\\
x+y+z \le 15 ,\\
200x+80y+8z \ge -temp ,\\
\text{x,y,z为正整数}
\end{cases}\]

library(Rglpk)

obj <-c(200,80,8,)
mat<-matrix(c(1,0,0,1,200,0,1,0,1,80,0,0,1,1,8),nrow = 5)
mat
dir<-c(rep("<=",4),">=")
types<-c("I", "I", "I")
max<-F
Rglpk_solve_LP(obj, mat, dir, rhs, types = types, max = F)
resa<-data.frame()
for (i in 1:nrow(test.df)){
temp<-test.df[i,2]
rhs<-c(15,15,15,15,-temp)
if(temp < -3000){
temp1<-cbind(temp,matrix(c(15,0,0,15,3000),ncol=5),temp+3000)
}else{
temp_result<-Rglpk_solve_LP(obj, mat, dir, rhs, types = types, max = F)
temp1<-cbind(temp,matrix(temp_result$auxiliary$primal,ncol = 5),temp+temp_result$auxiliary$primal[5])
}
resa<-rbind(resa,temp1)
}
str(resa)
write.table(resa,"resa3.csv",sep=",")

结果如下

head(resa)
temp V2 V3 V4 V5 V6 V7
1 -2367.9663 11 2 1 14 2368 3.374016e-02
2 -640.3149 0 8 1 9 648 7.685126e+00
3 -1281.4575 6 1 1 8 1288 6.542478e+00
4 -4498.5225 15 0 0 15 3000 -1.498523e+03
5 -2639.6479 12 3 0 15 2640 3.521064e-01
6 -2447.9996 11 3 1 15 2448 4.106828e-04

R语言 批量规划求解的更多相关文章

  1. R语言:规划求解优化ROI

    今天看到一篇文章介绍如何用excel建模对ROI 进行规划求解. 蓝鲸的网站分析笔记 成本 Cost 每次点击费用 CPC 点击量 \[clickRate = \frac{cost}{CPC}\] 转 ...

  2. R语言教程规划

    本文发表在博客园, http://www.cnblogs.com/stackworm/ 尽管进展中出现了意想不到的事情,期间中断1个多月,但我仍然会坚持下去. 首先,这份教程适合所有对R语言有兴趣且希 ...

  3. R语言批量生成变量(变量名中含有参数)

    我们经常会需要生成这样一类的变量,比如a1,a2,a3...... 这时候我们需要用到这两个函数:get()和assign() get()用法 get()函数只是在环境中搜索该变量名的变量,如果该变量 ...

  4. R语言 批量下载财务报表

    getsheets <- function(symbol,type,file){ pre="http://money.finance.sina.com.cn/corp/go.php/v ...

  5. R语言之RCurl实现文件批量下载

    前言: RCurl工具包的作者是由Duncan Temple Lang现任加州大学 U.C. Davis分校副教授.他曾致力于借助统计整合进行信息技术的探索.使用者通过RCurl可以轻易访问网页,进行 ...

  6. 寻找与疾病相关的SNP位点——R语言从SNPedia批量提取搜索数据

    是单核苷酸多态性,人的基因是相似的,有些位点上存在差异,这种某个位点的核苷酸差异就做单核苷酸多态性,它影响着生物的性状,影响着对某些疾病的易感性.SNPedia是一个SNP调査百科,它引用各种已经发布 ...

  7. R语言︱文件读入、读出一些方法罗列(批量xlsx文件、数据库、文本txt、文件夹)

    笔者寄语:小规模的读取数据的方法较为简单并且多样,但是,批量读取目前看到有以下几种方法:xlsx包.RODBC包.批量转化成csv后读入. R语言中还有一些其他较为普遍的读入,比如代码包,R文件,工作 ...

  8. R语言从小木虫网页批量提取考研调剂信息

    一.从URL读取并返回html树     1.1 Rcurl包         使用Rcurl包可以方便的向服务器发出请求,捕获URI,get 和 post 表单.比R socktet连接要提供更高水 ...

  9. R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(二,textreuse介绍)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 上一篇(R语言实现︱局部敏感哈希算法(LSH) ...

随机推荐

  1. [AR]高通Vuforia Getting Started

    Vuforia Getting Started 简介 ​ Vuforia创建增强现实应用程序是一个软件平台.开发人员可以轻松地将先进的计算机视觉功能添加到任何应用程序中,允许它识别图像和对象,或在现实 ...

  2. pmd静态代码分析

    在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...

  3. [原]CentOS7部署PostGis

    转载请注明原作者(think8848)和出处(http://think8848.cnblogs.com) 本文参考了<An almost idiot's guide to install Pos ...

  4. C 语言学习 第六次作业总结

    本次作业,同学们开始学习函数.通过之前和同学们的沟通,似乎同学们在这里遇到的问题比较多.下面,我先帮同学们整理下函数的相关知识点. 什么是函数 首先,需要明确的是,什么是函数.所谓函数,也就是一段有名 ...

  5. python优先队列,队列和栈

    打印列表的疑问 class Node: def __str__(self): return "haha" print([Node(),Node()]) print(Node()) ...

  6. java Fn键

    需求分析 我想开机禁用触摸板. 方案设计 安装驱动:比较麻烦,驱动也不一定支持开机禁用触摸板. 编程实现,让一段代码开机禁用触摸板 编程实现也分好几种方法: 使用windows API禁用触摸板,这需 ...

  7. STL sort 函数实现详解

    作者:fengcc 原创作品 转载请注明出处 前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不 ...

  8. 并发包的线程池第一篇--ThreadPoolExecutor执行逻辑

    学习这个很长时间了一直没有去做个总结,现在大致总结一下并发包的线程池. 首先,任何代码都是解决问题的,线程池解决什么问题? 如果我们不用线程池,每次需要跑一个线程的时候自己new一个,会导致几个问题: ...

  9. ssh key生成

    Mac电脑用终端生成SSH key 访问自己的Github 字数684 阅读427 评论4 喜欢15 前言:最近有不少刚刚使用github管理代码的开发者或者新手码农在网上 问我如何关联自己的gith ...

  10. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...