R3.5.1でスコアアタックイベントの期待値を計算する (v1.1)

2019/4/18

【入力】

name	series	rare	slv	col	sh	be	me	skill	skill2	times	prob	score	score2	spe
yuki	riha	5	4	me	4352	3773	6696	score	com	16	0.44	3034	0	0.1
yuki	do	4	2	me	3975	3574	6280	score	per	22	0.39	1172	0	0.02
yuki	okashi	4	3	me	3975	3398	6314	shrink	per	24	0.36	1.4	4	0.02
yuki	head	5	5	me	4203	3755	7024	score	timer	11	0.44	6190	0	0.02

キャラ名、シリーズ名、レアリティ(使わない)、スキルレベル(使わない)、属性、属性値×3、スキル種(スコアアップ、縮小、それ以外)、スキル発動条件(コンボ/パーフェクト/タイマー)、スキルが発動するコンボ数/パーフェクト数/秒数、スキル発動確率、スキル発動時の値/倍率(縮小時)、スキル継続時間(縮小時)、イベント特効倍率

【変数】

per = 550 #曲のパーフェクト数
good = 50 #曲のグッド数
com = per+good #コンボ数
sec = 120 #曲の時間
mv = 200 #MV中のノーツ数
batch = 1.1 #スコアアップバッチの倍率
ass = T #スコアアップライブアシストの有無

【スキル計算】

skill_cal <- function (card, base) {
  switch (as.character(card$skill2),
        "per" = assign("count", per),
        "com" = assign("count", com),
        assign ("count",sec))
  if (card$skill=="score") {
    return (count/card$times*card$prob*card$score)
  } else if (card$skill=="shrink") {
    return (count/card$times*base*(0.025*(per/sec)+0.020*(good/sec))*
              card$score2*(card$score-1))
  } else { return (0) }
}

【スコア計算】

score_cal <- function (unit, col, friend) {
  spe <- 1+sum(unit$spe)
  cent <- ifelse(friend==T,
    ifelse(unit$col[1]==unit$col[6], 1.2, 1.1),
    1.1)
  base <- sum(unit[,5+col])+
    ifelse (is.na(match("head", unit$series)), 0, 
    500*(sum(unit$name=="yuki")))
  base <- ifelse (ass==T, base*1.2, base)
  base <- cent*base*(50*1.0+50*1.1+50*1.2+50*1.3+50*1.4+(com-250-mv)*1.5+
                       good*(mv/com)*1.5+per*(mv/com)*2*1.5)/com
  unit_skill <- NULL
  for (i in 1:nrow(unit)) {
      unit_skill <- c(unit_skill, skill_cal(unit[i,],base))
  }
  score <- base*(0.025*per+0.020*good)+sum(unit_skill)
  return(score*batch*spe)
}

【入力したデータの中から最もスコア値の高いユニットを導く】

score_max <- function (data,color){
  data_2 <- subset(data,col==c("sh","be","me")[color])
  combination <- combn (data_2$id,5)
  score_data <- numeric(ncol(combination))
  for (i in 1:ncol(combination)){
    data_temp <- data[combination[,i],]
    score_data[i] <- score_cal(data_temp,1,F)
  }
  return(list(max(score_data),which.max(score_data),
              data[combination[,which.max(score_data)],]))
}

unit1 <- data[c(1,2,3,4,5),] #フレンドなし、1番目にセンターの行ID

score_cal (unit1, 3, F) #2個目の変数は曲の色でシャウト=1、ビート=2、メロディー=3
unit2 <- data[c(1,2,3,4,5,6),] #フレンドあり、1番目にセンター、6番目にフレンドの行ID
score_cal (unit1, 3, T) #2個目の変数は曲の色でシャウト=1、ビート=2、メロディー=3

score_max(data,1) #2個目の変数は曲の色でシャウト=1、ビート=2、メロディー=3

おめでとうございます

仮定
・フルコンボ
・ノーツはすべて白
・センタースキルは110%アップ固定
・自分のセンターは曲の色と同じ、フレンドのセンターは他の色でもいい
・50コンボでランプ1つ点灯、MVは最後まで続く
・ブローチスキルはヘッドホンつけたユキしか使えない(ユキしか育ててないから)

更新履歴
19/6/13 v1.1 スコア計算関数のフレンドの有無を変数に追加、最大スコア値計算関数の追加

ありがとうございました
http://nomnaim.main.jp/wiki/idolish7/index.php?%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF