楼主: tylerma3223
2378 9

[程序分享] R语言的优化求解问题 [推广有奖]

  • 0关注
  • 16粉丝

教授

3%

还不是VIP/贵宾

-

威望
1
论坛币
219352 个
通用积分
5.5952
学术水平
42 点
热心指数
72 点
信用等级
44 点
经验
19878 点
帖子
514
精华
0
在线时间
925 小时
注册时间
2013-1-28
最后登录
2023-11-29

100论坛币
现在一个班级有40名学生n01--n40,考试设置10门课程 x01--x10,每科课程有不同的权重w01--w10(取值范围是(0,1)开区间),得出每个学生的加权平均成绩y1~y40, 然后给他们排名。 问题是:要想让张三、李四、王五的排名尽量靠前,权重应当怎么设置? 程序代码如下:
  1. #首先假设有10科成绩
  2. x01<-rnorm(n = 40,mean = 80,sd = 10)
  3. x02<-rnorm(n = 40,mean = 80,sd = 10)
  4. x03<-rnorm(n = 40,mean = 80,sd = 10)
  5. x04<-rnorm(n = 40,mean = 80,sd = 10)
  6. x05<-rnorm(n = 40,mean = 80,sd = 10)
  7. x06<-rnorm(n = 40,mean = 80,sd = 10)
  8. x07<-rnorm(n = 40,mean = 80,sd = 10)
  9. x08<-rnorm(n = 40,mean = 80,sd = 10)
  10. x09<-rnorm(n = 40,mean = 80,sd = 10)
  11. x10<-rnorm(n = 40,mean = 80,sd = 10)


  12. da01<-data.frame(x01,x02,x03,x04,x05,x06,x07,x08,x09,x10)


  13. #每科成绩有一个权重(权重处于(0,1),且10科权重之和等于1)
  14. w01<-0.1
  15. w02<-0.1
  16. w03<-0.1
  17. w04<-0.1
  18. w05<-0.1
  19. w06<-0.1
  20. w07<-0.1
  21. w08<-0.1
  22. w09<-0.1
  23. w10<-0.1

  24. attach(da01)
  25. #计算加权平均分
  26. da01$y<-0+
  27.   x01*w01+
  28.   x02*w02+
  29.   x03*w03+
  30.   x04*w04+
  31.   x05*w05+
  32.   x06*w06+
  33.   x07*w07+
  34.   x08*w08+
  35.   x09*w09+
  36.   x10*w10
  37. detach(da01)
  38. #求每一位同学的排名
  39. da01$rk<-rank(x = -da01$y,na.last = TRUE)

  40. View(da01)

  41. #问题来了,如果想让张三、李四、王五的排名尽量靠前,那么各科成绩的权重w01~w10 应该怎么设置?
  42. # 实际上就是求 min(y[1]+(y[2]+(y[3]) 的问题。
复制代码


最佳答案

maxili1983 查看完整内容

重新上传一次附件试试看。 程序在附件里。 答案在这里:
关键词:R语言 程序代码
已有 1 人评分论坛币 收起 理由
cheetahfly + 50 鼓励提问时给出详细代码和数据

总评分: 论坛币 + 50   查看全部评分

沙发
maxili1983 发表于 2018-3-11 19:01:32 |只看作者 |坛友微信交流群
tylerma3223 发表于 2018-3-14 00:09
没看见附件啊,大家能看见么?
Optimization-2018-03-14-10-24-56.rar (8.29 KB, 需要: 10 个论坛币) 本附件包括:
  • weitht01.csv
  • da01 - 副本.csv
  • da01.csv
  • optimization-Ex1.R


重新上传一次附件试试看。

程序在附件里。
答案在这里:
 

x

1

0.152136

2

0.163439

3

0.100261

4

0.089248

5

0.152136

6

0.152136

7

0.100551

8

0.02636

9

0.037662

10

0.02607


使用道具

藤椅
owenqi 在职认证  学生认证  发表于 2018-3-12 10:20:38 |只看作者 |坛友微信交流群
把这三个人的分数分别从高到底排列,然后对高分的科目赋予更多的权重。

使用道具

板凳
jinkelazzz 发表于 2018-3-12 16:55:39 |只看作者 |坛友微信交流群
owenqi 发表于 2018-3-12 10:20
把这三个人的分数分别从高到底排列,然后对高分的科目赋予更多的权重。
按名次排吧。万一自己分高别人分更高呢?

使用道具

报纸
owenqi 在职认证  学生认证  发表于 2018-3-13 05:52:48 |只看作者 |坛友微信交流群
jinkelazzz 发表于 2018-3-12 16:55
按名次排吧。万一自己分高别人分更高呢?
他的要求只是尽可能提高排名,而不是保证要排第一。这种方法能保证他的排名不会比原来低啊。

使用道具

地板
jinkelazzz 发表于 2018-3-13 09:13:34 |只看作者 |坛友微信交流群
owenqi 发表于 2018-3-13 05:52
他的要求只是尽可能提高排名,而不是保证要排第一。这种方法能保证他的排名不会比原来低啊。
好像不对吧

使用道具

7
tylerma3223 学生认证  发表于 2018-3-13 10:48:41 |只看作者 |坛友微信交流群
大概就是这个逻辑,看3个人哪科成绩高,赋予高权重,哪科成绩低,赋予低权重。问题是一共3个人呢? 你数学好,我语文好,这个权重不太好弄。而且权重的取值范围是开区间,不是闭区间。  有没有代码可以支持啊? 朋友们,感觉这种优化算法在R中应该有某个包干这事情。

使用道具

8
maxili1983 发表于 2018-3-13 15:19:50 |只看作者 |坛友微信交流群
Optimization.rar (4.42 KB) 本附件包括:
  • optimization-Ex1.R
  • da01.csv


为了防止每个人获得的随机数不一样,我把原始的每科得分放到CSV文件中。这个论坛的贴代码功能有个缺陷,美元符号$总被弄错。而且,编辑完帖子说超过15000字符的限制了,所以,我把程序代码也放在附件里了。

数据如下:
s01

s02

s03

s04

s05

s06

s07

s08

s09

s10

1

79.16

89.60

78.22

74.54

87.64

77.99

80.73

71.77

81.63

100.27

2

83.51

84.97

77.81

79.90

75.72

69.48

74.17

83.76

73.14

74.56

3

76.25

72.55

72.50

82.76

97.07

85.19

87.44

78.84

80.53

81.29

4

89.30

90.77

66.37

82.19

65.11

69.16

75.53

92.52

73.57

66.89

5

84.89

86.83

72.56

79.75

66.01

74.28

86.40

86.50

100.76

87.57

6

88.20

103.09

76.67

61.76

83.01

78.36

79.50

68.44

71.09

85.28

7

75.51

88.29

74.97

74.36

61.51

87.46

63.20

73.19

85.30

84.59

8

57.27

59.59

81.83

89.54

73.93

58.46

84.02

95.77

84.46

92.08

9

79.36

81.10

75.40

78.11

70.36

71.68

87.41

82.13

85.06

81.02

10

70.93

78.16

71.30

68.51

78.55

89.77

92.93

91.21

74.07

95.40

11

80.36

89.33

79.95

82.41

69.91

78.95

79.00

74.52

78.90

89.05

12

90.34

73.40

81.90

82.45

87.91

76.11

77.14

98.73

67.35

91.13

13

72.51

82.57

58.85

87.52

100.20

66.27

75.40

81.80

62.21

55.33

14

87.32

96.63

96.61

83.43

91.91

82.99

69.31

87.04

81.72

86.72

15

97.74

68.91

79.17

87.50

75.53

72.47

77.19

86.69

70.19

93.95

16

73.72

105.86

100.49

76.92

76.05

81.43

84.74

96.46

74.76

67.74

17

79.75

86.29

75.88

76.63

68.31

67.91

70.45

77.01

84.13

66.24

18

67.76

84.94

92.83

88.62

73.76

78.33

89.09

70.84

73.32

88.62

19

89.01

91.20

78.30

61.71

89.54

81.20

85.98

92.74

75.08

74.82

20

72.45

66.09

94.85

94.18

65.02

81.13

80.69

86.35

70.42

66.49














要想让序号为1、2、3的3个孩子是校长家的三胞胎,要想让他们3个加权成绩排名最靠前,权重应该是:

1

0.152136

2

0.163439

3

0.100261

4

0.089248

5

0.152136

6

0.152136

7

0.100551

8

0.02636

9

0.037662

10

0.02607



这样,他们3个的排名分别是:

12

31

14



已有 1 人评分论坛币 收起 理由
cheetahfly + 10 热心帮助其他会员

总评分: 论坛币 + 10   查看全部评分

使用道具

9
tylerma3223 学生认证  发表于 2018-3-14 00:09:14 |只看作者 |坛友微信交流群
没看见附件啊,大家能看见么?

使用道具

10
wla332399 发表于 2019-3-19 10:26:24 来自手机 |只看作者 |坛友微信交流群
您好,我也是牛街西里一区的业主,您的车位还在吗?电 联  1 3 3 1 1 3 2 5 1 7 8

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 22:32