package store;
import java.text.DecimalFormat;
import java.util.PriorityQueue;
Модель склада, продающего товар при случайном прибытии покупателей.
@author
public class Model1 {
Текущее время от начала опыта.
double time = 0;
Череда событий в порядке их возникновения.
java.util.PriorityQueue<StoreEvent> events = new PriorityQueue<>();
Хранилище товара (склад).
Storage storage = new Storage();
Длительность вычислительного опыта.
double totalTime;
Мощность (интенсивность) потока покупателей.
double lambda;
Порог запаса, при котором делается заказ.
double threshold;
Время доставки заказа.
double addDelay;
Стоимость хранения единицы товара в единицу времени.
double productStorageCosts;
Прибыль от продажи единицы товара.
double productPrice;
Состояние ожидания доставки товара на склад.
boolean waitProducts = false;
Итоговая прибыль.
double profit = 0;
Конструктор.
@param totalTime
@param lambda
@param threshold
@param capacity
@param productStorageCosts
@param productPrice
@param addDelay
public Model1(double totalTime, double lambda, double threshold, int capacity,
double productStorageCosts, double productPrice, double addDelay) {
this.lambda = lambda;
this.totalTime = totalTime;
this.threshold = threshold;
storage.capacity = capacity;
this.productStorageCosts = productStorageCosts;
this.productPrice = productPrice;
this.addDelay = addDelay;
initStorage(capacity);
RemoveEvent ae = new RemoveEvent();
ae.time = -Math.log(1. - Math.random()) / lambda;
events.offer(ae);
}
Начальное заполнение склада.
public void initStorage(int n) {
if (n > storage.capacity) {
n = storage.capacity;
}
storage.products.clear();
for (int i = 0; i < n; i++) {
storage.products.add(new Product(time));
}
}
Обработка события на складе.
@param se
@return
public int processStoreEvent(StoreEvent se) {
time = se.time;
DecimalFormat df = new DecimalFormat("000.00");
DecimalFormat nf = new DecimalFormat("###.##");
int ret = 0;
if (se instanceof AddEvent) {
int n = ((AddEvent) se).number;
if (storage.capacity < storage.products.size() + n) {
throw new RuntimeException("Storage overflow");
}
for (int i = 0; i < n; i++) {
Product prod = new Product();
prod.time = time;
storage.products.add(prod);
}
waitProducts = false;
} else
if (se instanceof RemoveEvent) {
RemoveEvent nextRemove = new RemoveEvent();
nextRemove.time = this.time + -Math.log(1. - Math.random()) / lambda;
events.add(nextRemove);
if (storage.products.isEmpty()) {
ret++;
}
else {
Product prod = storage.products.remove(0);
profit -= (time - prod.time) * productStorageCosts;
profit += productPrice;
}
if (storage.products.size() < threshold && !waitProducts) {
AddEvent ev = new AddEvent();
ev.number = storage.capacity - storage.products.size();
ev.time = time + addDelay;
events.add(ev);
waitProducts = true;
}
} else {
throw new RuntimeException("Unknown event.");
}
return ret;
}
public static void main(String[] args) {
Model1 model = new Model1(
50,
1,
5,
10,
1,
10,
5
);
while (model.time < model.totalTime) {
model.processStoreEvent(model.events.poll());
}
System.out.println("Средняя прибыль за единицу времени: " + (model.profit / model.time));
}
}