Лабораторная работа «Ликвидация склада» Python
На предприятии 3 склада. Склад № 3 ликвидируется. Товары с 3 склада нужно перевезти на 1 и (или) 2 склады таким образом, чтобы в результате стоимость товаров (в сумме) на 1 и 2 складах была по возможности одинаковой. При этом перемещать товары между 1 и 2 складами нельзя.
Решить задачу двумя способами:
- методом Монте-Карло;
- методом линейного программирования
Пытался решить задачу, что получилось:
from random import randint
from math import *
from random import *
e = []
t = []
p = []
for r in range(1, 16):
print('Наличие товара c №', r, 'на складе №1:', end='')
e.append(int(input()))
print('Наличие товара c №', r, 'на складе №2:', end='')
t.append(int(input()))
print('Наличие товара c №', r, 'на складе №3:', end='')
p.append(int(input()))
for i in range(int(input('Введите количество испытаний:'))): #генерирование случайных чисел
a = random() #Аi – это количество товара i , перевозимого с 3 склада на склад 1
e[i] = e[i] + a
t[i] = t[i] + (p[i] - a) #столько товара i повезут на 2 склад
print('Количество товара с №', i + 1, ':', e[i] + t[i], abs(e[i] -
t[i]))
Но как-то количество прогонов влияет на вывод. Исходные данные контрольного примера заданы в таблице
Ответы (2 шт):
вроде как тут методом Монте-Карло и не пахнет
Вам надо было бы сделать так для каждого испытания
выполнять до тех пор, пока склад №3 не станет пустым
случайно определить № товара, случайно определить № склада куда данный товар перевести
увеличить кол-во товара в выбранном складе, уменьшить кол-во товара на складе №3
после того как склад №3 опустеет подсчитать кол-во товаров на обоих складах
сравнить с лучшим результатом и если данный прогон - лучший, установить его лучшим
в результате при большом кол-ве прогонов должно получиться более-менее правильное заполнение складов
А в вашем коде вы просто по номеру товара ходите, а не выполняете испытания по ликвидации склада и если указать кол-во испытаний больше кол-ва номеров товаров, то программа вообще упасть должна, потому что полезете вне диапазона списка
P.S.
вместо
print('Наличие товара c №', r, 'на складе №1:', end='')
e.append(int(input()))
можно было бы написать так:
e.append(int(input(f"Наличие товара c №{r} на складе №1: ")))
в input() можно писать строку, которая будет выведена пользователю перед вводом текста, а f-строка позволяет делать все в виде 1 строки, а не нескольких строк
как по мне так более визуально приятнее
from random import randint
from math import *
from random import *
e = []
t = []
p = []
c1 = 0
c = []
for r in range(1, 16):
e.append(int(input(f"Наличие товара c №{r} на складе №1: ")))
t.append(int(input(f"Наличие товара с №{r} на складе №2: ")))
p.append(int(input(f'Наличие товара c №{r} на складе №3: ')))
for _ in range(int(input('Введите количество прогонов: '))):
c0 = abs(e[0] - t[0]) #оптимальный результат
for i in range(len(p)): #генерирование случайных чисел
a = random() #Аi – это количество товара i , перевозимого с 3 склада на склад 1
b = randint(0, 14)
e[b] = e[b] + a
t[b] = t[b] + (p[b] - a) #столько товара i повезут на 2 склад
if abs(e[i] - t[i]) < c0: #разница между товарами 1 и 2 складов
c.append(abs(e[i] - t[i])) #лучшая если меньше разницы в первой попытке
print('Количество товара с №', i + 1, ':', e[i] + t[i], 'Разность этого товара на 1 и 2 складе:', abs(e[i] - t[i]))
print(c)
print(min(c))
