Лабораторная работа «Ликвидация склада» 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 шт):

Автор решения: Zhihar

вроде как тут методом Монте-Карло и не пахнет

Вам надо было бы сделать так для каждого испытания

  1. выполнять до тех пор, пока склад №3 не станет пустым

  2. случайно определить № товара, случайно определить № склада куда данный товар перевести

  3. увеличить кол-во товара в выбранном складе, уменьшить кол-во товара на складе №3

  4. после того как склад №3 опустеет подсчитать кол-во товаров на обоих складах

  5. сравнить с лучшим результатом и если данный прогон - лучший, установить его лучшим

в результате при большом кол-ве прогонов должно получиться более-менее правильное заполнение складов

А в вашем коде вы просто по номеру товара ходите, а не выполняете испытания по ликвидации склада и если указать кол-во испытаний больше кол-ва номеров товаров, то программа вообще упасть должна, потому что полезете вне диапазона списка

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))
→ Ссылка