Мой вопрос немного длинный. Я очень ценю это, если Вы могли прочитать это все, и я был бы очень благодарен за любой совет.
У меня есть данные, относящиеся к 2 потребителям как черепахам, которые оценили характеристики ноутбуков. Ноутбуки имеют 2 вида характеристик: размер экрана и время автономной работы. Каждый имеет несколько уровней. Например, срок службы батареи составляет 5 часов, 12 часов, 24 часа, 30 часов. Данные хранятся в файле csv.
12 13.5 14 15 5 12 24 30
1 1 2 1 3 2 2 4 5
2 4 3 1 2 1 1 2 3
Я хочу суммировать показатели 2-х уровней характеристик. Например, для потребителя 1 и 2, что такое:
Суммарный показатель размера экрана 13,5 + показатель времени автономной работы 24
Поскольку 13,5 и 24 могут измениться позже, и я хочу узнать, например, сумму ставок размера 14 и времени автономной работы 5, я определил две функции с помощью «to-reports». Кроме того, поскольку, например, значение «12» дважды встречается в строке заголовка и представляет как размер, так и время автономной работы, я сделал 2 подмножества CSV-файла: одно для размера экрана, другое для батареи.
12 13.5 14 15
1 1 2 1 3
2 4 3 1 2
5 12 24 30
1 2 2 4 5
2 1 1 2 3
Сначала в основной программе считывается файл csv, и каждой строке назначается черепаха, ожидая наличия двух потребителей.
to setup
ca
reset-ticks
file-close-all
file-open "turtle_details.csv"
let headerrow csv:from-row file-read-line
set Sc 13.5 ; at the beginning I want the rate of this screen size
set Bat 24
while [ not file-at-end? ] [
let data csv:from-row file-read-line
create-consumers 1 [
set shape "person"
set k k + 1
print obtain-Sc (Sc) + obtain-Bat (Bat)
]
]
file-close-all
end
Я предположил, что сначала читается первая строка и генерируется потребитель. Теперь он переходит к отчету, чтобы найти get-Screen(13.5), который равен 2, но я подумал, что в следующий раз, когда obrain_Screen будет вызван, снова откроется csv, и курсор все еще будет в начале, но я хочу, чтобы он читал второй ряд. И чтобы продлить его, мне может понадобиться, чтобы он шел все дальше и дальше. Чтобы решить эту проблему, я определил счетчик k, который, например, проверяет это условие в первый раз: idx = 0 ‹ k =1, поэтому читается первая строка. Тогда idx = idx + 1 , так что больше ничего не делается.
to-report obtain-Screen[Sc]
file-close-all ; close all open files
file-open "turtle_detailsSc.csv"
let headings csv:from-row file-read-line
ifelse is-number? position Sc headings
[
while [idx < k ]
[ set fdata csv:from-row file-read-line
set idx idx + 1
]
report item position Sc headings fdata
]
[report 0.000000009]
Что-то похожее на Бат. Но он не работает и имеет ошибки. Есть идеи, как улучшить to-отчеты? Спасибо
Изменить
Учитывая, что набор данных выглядит следующим образом:
size12 size13.5 size14 size15 Battery5 Battery12 Battery24 Battery30
1 1 *2* 1 3 2 2 *4* 5
2 4 3 3 2 1 1 2 3
Теперь я могу получить доступ к набору данных и для каждого потребителя найти их оценку ноутбука, который они приобрели. Например, у потребителя 1 есть ноутбук размером 13,5 и временем автономной работы 24.
Consumer 1 evaluation of size 13.5 = 2
Consumer 1 evaluation of battery 24 = 4
Overall evaluation of laptop = 2 + 4 = 6
Я определил процедуру «Найти Eval», которая, когда мне нужно узнать оценку различных потребителей, позволяет мне получить доступ к набору данных и найти значения.
Чтобы лучше объяснить данные в таблице, у потребителя есть ноутбук, поэтому он может довольно хорошо его оценить, но по другим характеристикам, таким как то, как он оценивает ноутбук с размером экрана 15, он может получить некоторое представление или просто услышать от других, что он заполнил таблицу.
Я хочу сохранить этих двух потребителей и следить за их отношением к функциям ноутбука в течение 20 лет. Через год 2 потребитель 1, возможно, обновил свою систему, так что теперь его время автономной работы составляет 30. На этот раз мне нужно получить доступ к набору данных и вычислить
Consumer 1 evaluation of size 13.5 = 2
плюс
Consumer 1 evaluation of battery 30 = 5
Overall evaluation of laptop = 2 + 5 = 7
На этот раз мне нужно найти значение для батареи 30. Я думаю, что когда я буду повторять свой код в течение 20 лет, create-consumer будет повторяться каждый раз, когда я хочу работать с набором данных, поэтому вместо того, чтобы держать 2 потребителей, каждый год будут создаваться новые потребители и полностью замещаться прежние.
Вопрос в том, как я могу создать потребителей один раз, но иметь доступ к любой точке данных в наборе данных много раз?
Большое спасибо,
while
может работать не так, как вы ожидаете. Что такое FE в вашемto-report
? Кроме того, когда вы говорите, что 13.5 и 24 могут измениться позже, вы имеете в виду, что вы будете изменять эти значения в Netlogo или что вы будете перезагружать файлcsv
? - person Luke C   schedule 29.06.2017