Я реализовал скрытые марковские модели 1-го, 2-го и 3-го порядка, используя HashMaps, в отличие от матрицы перехода. Я использую эти HMM для подсчета количества вхождений музыкальных нот (смоделированных как целые числа 0-128) после 1 примечания/2 примечания/3 примечания, в зависимости от заказа.Многоуровневая реализация HashMap Nth Order HMM
Например, реализация для 2-го порядка:
public void updateWeigths(ArrayList<Note> notes, HashMap<Integer, HashMap<Integer, HashMap<Integer, Double>>> hm) {
for (int i=0; i<notes.size()-2; i++) {
int prevPitch1 = notes.get(i).getPitch();
int prevPitch2 = notes.get(i+1).getPitch();
int nextPitch = notes.get(i+2).getPitch();
if (prevPitch1 > 0 && prevPitch2 > 0 && nextPitch > 0) {
if (hm.containsKey(prevPitch1)) {
HashMap<Integer, HashMap<Integer, Double>> nextMapping1 = hm.get(prevPitch1);
if (nextMapping1.containsKey(prevPitch2)){
HashMap<Integer, Double> nextMapping2 = nextMapping1.get(prevPitch2);
if (nextMapping2.containsKey(nextPitch)) {
double prob = nextMapping2.get(nextPitch);
nextMapping2.put(nextPitch, prob+1);
}
else {
nextMapping2.put(nextPitch, 1.0);
}
}
else {
nextMapping1.put(prevPitch2, new HashMap<Integer, Double>());
}
}
else {
hm.put(prevPitch1, new HashMap<Integer,HashMap<Integer,Double>>());
}
}
}
}
Я хочу осуществить произвольный СММ порядка, используя один и тот же шаблон. Я пытался использовать полиморфизм, но каждый раз получаю ClassCastException. Не совсем уверен, как использовать Generics для этого. Трюк, я думаю, должен знать, когда вы на последнем HashMap, чтобы вы могли обновить значение Double.
Любые предложения были бы замечательными!