package store;
import java.text.DecimalFormat;
import java.util.PriorityQueue;
Модель склада, продающего товар при случайном прибытии покупателей.
@author
public class Model2 {
Текущее время от начала опыта.
double time = 0;
Череда событий в порядке их возникновения.
java.util.PriorityQueue<StoreEvent> events = new PriorityQueue<>();
Хранилище товара (склад).
Storage storage = new Storage();
Длительность вычислительного опыта.
double totalTime;
Мощность (интенсивность) потока покупателей.
double lambda;
Порог запаса, при котором делается заказ.
Промежуток времени, через который делается заказ.
double timeInterval;
Время доставки заказа.
double addDelay;
Стоимость хранения единицы товара в единицу времени.
double productStorageCosts;
Прибыль от продажи единицы товара.
double productPrice;
Состояние ожидания доставки товара на склад.
boolean waitProducts = false;
Итоговая прибыль.
double profit = 0;
Конструктор.
@param totalTime
@param lambda
@param timeInterval
@param capacity
@param productStorageCosts
@param productPrice
@param addDelay
public Model2(double totalTime, double lambda, double timeInterval, int capacity,
double productStorageCosts, double productPrice, double addDelay) {
this.lambda = lambda;
this.totalTime = totalTime;
this.timeInterval = timeInterval;
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);
CallEvent ce = new CallEvent();
ce.time = timeInterval;
events.offer(ce);
}
Начальное заполнение склада.
public void initStorage(int n) {
if (n > storage.capacity) {
n = (int) 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;
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(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;
}
} else if (se instanceof CallEvent) {
CallEvent ce = new CallEvent();
ce.time = time + timeInterval;
events.add(ce);
if (!waitProducts) {
waitProducts = true;
AddEvent ae = new AddEvent();
ae.number = (int) (storage.capacity - storage.products.size());
ae.time = time + addDelay;
events.add(ae);
}
} else {
throw new RuntimeException("Unknown event: " + se.getClass().getName() );
}
return ret;
}
public static void main(String[] args) {
Model2 model = new Model2(
10000000,
1,
4,
10,
1,
10,
2
);
int def = 0;
while (model.time < model.totalTime) {
def += model.processStoreEvent(model.events.poll());
}
System.out.println("Средняя прибыль за единицу времени: " + (model.profit / model.time));
System.out.println("Средняя нехватка за единицу времени: " + (def / model.time));
}
}