Причина, по которой ваша модель вычитает 12-кратную стоимость конвейера, заключается в том, что она создает 12 расширений конвейера, как только появляется доступный капитал. Вы не вычитаете стоимость до второго foreach
, но вы указываете, будет ли расширение построено в первом foreach
.
Я думаю, что вы хотите это (оно помещает изменение стоимости в то же самое [], что произойдет до тестирования следующего возможного расширения):
to build-pipeline
foreach sort-on [who] storages
[ ifelse subsidy-port - pipeline-cost-extensible > 0
[ set pipeline 1
set subsidy-port subsidy-port - pipeline-cost-extensible
create-link-from port 25
[ set pipeline 0
set subsidy-port subsidy-port ; has no effect, can be deleted
]
]
end
Также, если единственная цель переменной конвейера чтобы быть 1 или 0, чтобы указать, должно ли быть построено расширение, это еще проще:
to build-pipeline
foreach sort-on [who] storages
[ if subsidy-port - pipeline-cost-extensible > 0
[ set subsidy-port subsidy-port - pipeline-cost-extensible
create-link-from port 25
]
end
В ваших комментариях вы указали, что существует порядок достоинств расширений конвейера. Почти всегда плохое кодирование использовать who
в NetLogo. Переменная who
- это просто порядок, в котором создаются хранилища, привязка к которому заслуживает, устраняет всю гибкость. Что произойдет, если позже вы захотите другой расчет заслуг? who
не может быть изменено. Вероятно, вам нужно назначить переменную с именем merit для каждого хранилища и вместо этого отсортировать по этой переменной.
Думайте о порядке, в котором записи будут выбранными: столбец ссылки назад на каждой записи должен соответствовать столбцу ссылки вперед на ПРЕДШЕСТВУЮЩЕЙ выбранной записи.
Блок приложения кэширования EntLib имеет опцию очистки LRU из коробки и может быть в памяти. Это может быть немного тяжелым для того, что вы хотите.
Управляющие и ведомые таблицы могут быть не столь очевидными в JOIN
, но это так же ясно, как колокол для запроса CONNECT BY
: PRIOR
приводится строка, а не PRIOR
.
Вот почему этот запрос:
SELECT *
FROM hierarchy
START WITH
id = :root
CONNECT BY
parent = PRIOR id
означает «найти все строки, у которых parent
является заданным id
]». Этот запрос строит иерархию.
Это можно рассматривать следующим образом:
connect_by(row) {
add_to_rowset(row);
/* parent = PRIOR id */
/* PRIOR id is an rvalue */
index_on_parent.searchKey = row->id;
foreach child_row in index_on_parent.search {
connect_by(child_row);
}
}
И этот запрос:
SELECT *
FROM hierarchy
START WITH
id = :leaf
CONNECT BY
id = PRIOR parent
означает «найти строки, чей id
является данным родительским
» , Этот запрос создает цепочку предков.
Всегда ставьте PRIOR
в правой части выражения.
Считайте столбец PRIOR
как константу, во всех ваших строках будет производиться поиск for.