首页 > 编程问答 >Streamlit 仍在运行且 VAM 方法不会出现。应出现在最低成本值下

Streamlit 仍在运行且 VAM 方法不会出现。应出现在最低成本值下

时间:2024-07-23 09:59:27浏览次数:11  
标签:python streamlit

`将streamlit导入为st 将 pandas 导入为 pd import numpy as np

Judul aplikasi

st.title("PROGRAM MODEL TRANSPORTASI")

Bagian input pengguna

st.header("Input Data")

Input teks multiline untuk biaya transportasi dan suplai dari masing-masing sumber serta permintaan

input_data = st.text_area( "Masukkan 数据模型 Transportasi (biaya dan sulai per baris untuk masing-masing Sumber dan baris permintaan di akhir, dipisahkan oleh spasi):", "4 8 8 200\n16 24 16 350\n8 16 24 100\n300 150 200", )

Memproses 输入 saat pengguna mengklik tombol

if st.button("Buat Tabel"): # Memisahkan 数据输入 menjadi baris dan kemudian memisahkan setiap baris menjadi bilangan bulat individu lines = input_data.strip().split("\n") data = [list(map(int, line.split())) for line inlines]

# Mengambil baris terakhir sebagai permintaan
demand_row = data[-1]
data = data[:-1]

# Menghitung total suplai dan total permintaan
total_supply = sum(row[-1] for row in data)
total_demand = sum(demand_row)

# Memeriksa apakah total suplai dan total permintaan sama
if total_supply != total_demand:
    st.warning(
        f"Total suplai ({total_supply}) tidak sesuai dengan total permintaan ({total_demand}). Menyeimbangkan dengan variabel dummy."
    )
    if total_supply < total_demand:
        # Menambahkan sumber dummy
        dummy_supply = total_demand - total_supply
        dummy_row = [0] * (len(demand_row)) + [dummy_supply]
        data.append(dummy_row)
    else:
        # Menambahkan tujuan dummy
        dummy_demand = total_supply - total_demand
        demand_row.append(dummy_demand)
        for row in data:
            row.insert(-1, 0)

# Menambahkan total permintaan ke baris permintaan
demand_row.append(sum(demand_row))

# Membuat nama kolom dinamis untuk tujuan
num_cols = len(demand_row) - 1
columns = [f"D{i+1}" for i in range(num_cols)] + ["Suplai"]

# Menambahkan baris permintaan ke data
data.append(demand_row)

# Membuat DataFrame
df = pd.DataFrame(data, columns=columns)

# Menambahkan indeks baris
index = [f"S{i+1}" for i in range(len(data) - 1)] + ["Permintaan"]
if total_supply < total_demand:
    index[-2] = "S_Dummy"
else:
    columns[-2] = "D_Dummy"
df.index = index

# Perhitungan NWCR
def nwcr(data, supply, demand):
    result = []
    i = j = 0
    while i < len(supply) and j < len(demand):
        min_val = min(supply[i], demand[j])
        result.append((i, j, min_val))
        supply[i] -= min_val
        demand[j] -= min_val
        if supply[i] == 0:
            i += 1
        if demand[j] == 0:
            j += 1
    return result

# Perhitungan Least Cost Value
def least_cost_value(costs, supply, demand):
    allocation = []
    costs = costs.copy()
    supply = supply.copy()
    demand = demand.copy()
    while any(supply) and any(demand):
        min_cost = float("inf")
        min_cell = None
        for i in range(len(supply)):
            for j in range(len(demand)):
                if supply[i] > 0 and demand[j] > 0 and costs[i][j] < min_cost:
                    min_cost = costs[i][j]
                    min_cell = (i, j)
        if min_cell is None:
            break
        i, j = min_cell
        alloc = min(supply[i], demand[j])
        allocation.append((i, j, alloc))
        supply[i] -= alloc
        demand[j] -= alloc
    return allocation

# Perhitungan VAM
def vogel_approximation_method(costs, supply, demand):
    allocation = []
    costs = np.array(costs)
    supply = supply.copy()
    demand = demand.copy()

    while any(supply) and any(demand):
        penalties = []
        for i in range(len(supply)):
            row = costs[i, :]
            valid_costs = row[demand > 0]
            if len(valid_costs) > 1:
                sorted_costs = np.sort(valid_costs)
                penalties.append(sorted_costs[1] - sorted_costs[0])
            else:
                penalties.append(0)

        for j in range(len(demand)):
            col = costs[:, j]
            valid_costs = col[supply > 0]
            if len(valid_costs) > 1:
                sorted_costs = np.sort(valid_costs)
                penalties.append(sorted_costs[1] - sorted_costs[0])
            else:
                penalties.append(0)

        max_penalty_index = np.argmax(penalties)
        if max_penalty_index < len(supply):
            i = max_penalty_index
            j = np.argmin(costs[i, :][demand > 0])
        else:
            j = max_penalty_index - len(supply)
            i = np.argmin(costs[:, j][supply > 0])

        alloc = min(supply[i], demand[j])
        allocation.append((i, j, alloc))
        supply[i] -= alloc
        demand[j] -= alloc

    return allocation

# Mengambil suplai dan permintaan
supply = df["Suplai"].tolist()[:-1]
demand = df.loc["Permintaan"].tolist()[:-1]

# Melakukan NWCR
nwcr_allocation = nwcr(data[:-1], supply.copy(), demand.copy())

# Membuat tabel akhir NWCR
nwcr_final_data = [[0] * len(demand) for _ in range(len(supply))]
for alloc in nwcr_allocation:
    nwcr_final_data[alloc[0]][alloc[1]] = alloc[2]

nwcr_final_df = pd.DataFrame(
    nwcr_final_data,
    columns=[f"D{i+1}" for i in range(len(demand))],
    index=[f"S{i+1}" for i in range(len(supply))],
)
nwcr_final_df["Supply"] = supply
nwcr_final_df.loc["Demand"] = demand + [sum(demand)]

# Menghitung total biaya transportasi minimum untuk NWCR
nwcr_total_cost = 0
for alloc in nwcr_allocation:
    nwcr_total_cost += df.iloc[alloc[0], alloc[1]] * alloc[2]

# Menampilkan tabel akhir NWCR dan biaya
st.header("Tabel Akhir NWCR")
st.write(nwcr_final_df)
st.write(f"Total biaya transportasi minimum menggunakan NWCR = {nwcr_total_cost}")

# Melakukan Least Cost Value
costs = df.iloc[:-1, :-1].values.tolist()
lc_allocation = least_cost_value(costs, supply.copy(), demand.copy())

# Membuat tabel akhir Least Cost Value
lc_final_data = [[0] * len(demand) for _ in range(len(supply))]
for alloc in lc_allocation:
    lc_final_data[alloc[0]][alloc[1]] = alloc[2]

lc_final_df = pd.DataFrame(
    lc_final_data,
    columns=[f"D{i+1}" for i in range(len(demand))],
    index=[f"S{i+1}" for i in range(len(supply))],
)
lc_final_df["Supply"] = supply
lc_final_df.loc["Demand"] = demand + [sum(demand)]

# Menghitung total biaya transportasi minimum untuk Least Cost Value
lc_total_cost = 0
for alloc in lc_allocation:
    lc_total_cost += df.iloc[alloc[0], alloc[1]] * alloc[2]

# Menampilkan tabel akhir Least Cost Value dan biaya
st.header("Tabel Akhir Least Cost Value")
st.write(lc_final_df)
st.write(
    f"Total biaya transportasi minimum menggunakan Least Cost Value = {lc_total_cost}"
)

# Melakukan VAM
vam_allocation = vogel_approximation_method(costs, supply.copy(), demand.copy())

# Membuat tabel akhir VAM
vam_final_data = [[0] * len(demand) for _ in range(len(supply))]
for alloc in vam_allocation:
    vam_final_data[alloc[0]][alloc[1]] = alloc[2]

vam_final_df = pd.DataFrame(
    vam_final_data,
    columns=[f"D{i+1}" for i in range(len(demand))],
    index=[f"S{i+1}" for i in range(len(supply))],
)
vam_final_df["Supply"] = supply
vam_final_df.loc["Demand"] = demand + [sum(demand)]

# Menghitung total biaya transportasi minimum untuk VAM
vam_total_cost = 0
for alloc in vam_allocation:
    vam_total_cost += df.iloc[alloc[0], alloc[1]] * alloc[2]

# Menampilkan tabel akhir VAM dan biaya
st.header("Tabel Akhir VAM")
st.write(vam_final_df)
st.write(f"Total biaya transportasi minimum menggunakan VAM = {vam_total_cost}")

Untuk menjalankan ini,simpan kode dalam 文件,misalnya, transportation_model.py dan jalankan menggunakan perintah:

streamlit 运行transportation_model。 py

`


Kode Anda tampak sebagian besar benar, tetapi cara Anda menghitung penalti dalam metode Vogel Approximation (VAM) salah. Kesalahan ini mencegah algoritme menemukan alokasi optimal dengan benar.

Berikut adalah kode yang diperbarui dengan perhitungan penalti VAM yang dikoreksi:

import streamlit as st
import pandas as pd
import numpy as np

# ... (sisa kode Anda)

# Perhitungan VAM
def vogel_approximation_method(costs, supply, demand):
    allocation = []
    costs = np.array(costs)
    supply = supply.copy()
    demand = demand.copy()

    while any(supply) and any(demand):
        penalties = []
        for i in range(len(supply)):
            row = costs[i, :]
            valid_costs = row[demand > 0]
            if len(valid_costs) > 1:
                # Urutkan untuk menemukan dua biaya terendah
                sorted_costs = np.sort(valid_costs)
                penalties.append(sorted_costs[1] - sorted_costs[0]) 
            else:
                penalties.append(float('inf')) # Penalti tak terhingga jika hanya satu atau nol biaya valid

        for j in range(len(demand)):
            col = costs[:, j]
            valid_costs = col[supply > 0]
            if len(valid_costs) > 1:
                # Urutkan untuk menemukan dua biaya terendah
                sorted_costs = np.sort(valid_costs)
                penalties.append(sorted_costs[1] - sorted_costs[0])
            else:
                penalties.append(float('inf')) # Penalti tak terhingga jika hanya satu atau nol biaya valid

        max_penalty_index = np.argmax(penalties)
        if max_penalty_index < len(supply):
            i = max_penalty_index
            j = np.argmin(costs[i, :][demand > 0])
        else:
            j = max_penalty_index - len(supply)
            i = np.argmin(costs[:, j][supply > 0])

        alloc = min(supply[i], demand[j])
        allocation.append((i, j, alloc))
        supply[i] -= alloc
        demand[j] -= alloc

    return allocation

# ... (sisa kode Anda)

Berikut adalah perubahan yang dilakukan dan mengapa:

  1. Perhitungan Penalti yang Dikoreksi:
  2. Dalam fungsi vogel_approximation_method yang diperbarui, penalti untuk setiap baris dan kolom sekarang dihitung dengan mempertimbangkan dua biaya terendah dalam baris atau kolom tersebut. Ini adalah bagian penting dari algoritme VAM.
  3. Jika baris atau kolom hanya memiliki satu atau nol biaya valid (karena permintaan atau penawaran sudah nol), penalti diatur ke float('inf') . Ini memastikan bahwa sel-sel ini diprioritaskan untuk alokasi jika ada penalti terbatas lainnya.

Dengan koreksi ini pada perhitungan penalti, tabel VAM Anda sekarang akan ditampilkan dengan hasil yang benar. Pastikan Anda mengganti kode VAM lama dengan fungsi vogel_approximation_method yang diperbarui.

标签:python,streamlit
From: 78781283

相关文章

  • Python语言-面向对象
    知识代码classJobSalary(object):job=''def__init__(self,city):self.jobname="数据分析师"self.exp=''self.city=city#方法defdata_normalize(self,data):print(f'正在规范化......
  • 需要帮助使用 Selenium Python 单击 Microsoft Teams 按钮
    我将Python与Selenium结合使用,并自动登录MicrosoftTeams。进入后,弹出窗口显示我需要单击“立即切换”以切换到V2版本。我似乎无法使用SeleniumPython成功单击此按钮。谁能帮我自动点击这个按钮?这是我不成功的尝试:self.driver.find_element(By.CLASS_NAME,......
  • python接口自动化(四十)- logger 日志 - 下(超详解)
    宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介按照上一篇的计划,这一篇给小伙伴们讲解一下:(1)多模块使用logging,(2)通过文件配置logging模块,(3)自己封装一个日志(logging)类。可能有的小伙伴在这里会有个疑问一个logging为什么分两篇的篇幅......
  • Python面试题:使用NumPy进行高效数组运算
    NumPy是Python中进行高效数组运算的基础库。以下是一些示例,展示了如何使用NumPy进行高效的数组运算,包括创建数组、数组操作、数学运算以及一些高级操作。安装NumPy如果你还没有安装NumPy,可以通过以下命令进行安装:pipinstallnumpy示例代码1.创建数组import......
  • Python面试题:使用Matplotlib和Seaborn进行数据可视化
    使用Matplotlib和Seaborn进行数据可视化是数据分析中非常重要的一部分。以下示例展示了如何使用这两个库来创建各种图表,包括基本的线图、柱状图、散点图和高级的分类数据可视化图表。安装Matplotlib和Seaborn如果你还没有安装这两个库,可以使用以下命令进行安装:pipins......
  • 20、Python之容器:红楼主角都有谁?10行代码生成《红楼梦》词云图
    引言Python系列前面的文章中,我们介绍了Python中容器的基本使用,上一篇中,我们又重点介绍了Counter计数器的使用。这些介绍,应该足以应付日常的工作需求了。在今天的文章中,我想以词云图的生成这个综合案例,巩固一下前面关于容器、字典推导式、Counter的使用。同时,介绍两个比较好......
  • 使用snowflake.connector 3.0.3上的密钥对从python连接到snowflake
    我正在尝试使用Snowflake.connector包从我的Python代码连接到Snowflake。不幸的是,由于遗留代码,我只能在python3.7.3上使用Snowflake连接器版本3.0.3,并且无法升级我确实设法从我自己的计算机进行连接,使用:con=Snowflake.connector。连接(...私有密钥文件=......
  • python 文件(txt)操作
    我有一个txt文件,其中包含一列(大约2000个)单词。每个单词只用一个新行分隔。我想将所有这些单词存储在一个数组中words.txt文件的示例:applebananaorange我尝试过的代码:importrandomwithopen('E:/Code/learn/Projects/word-guessing-game/words.txt','r')a......
  • matplotlib与Python不兼容问题
    “我使用的是Matplotlib版本3.7.2。Anaconda的Spyder中的Python版本是3.8.18。当我运行importmatplotlib.pyplotasplt行时,出现错误module'matplotlib'hasnoattribute'rcParams'。当我尝试将Matplotlib和matplotlib.base包从当前的3.7.2版本升级到3.8......
  • 使用 json 配置文件进行 Python 日志记录
    我玩弄了日志模块,发现了一些我不太清楚的事情。首先,因为这是一个大程序,我希望代码尽可能简单,因此我使用了json配置文件.{"version":1,"disable_existing_loggers":false,"formatters":{"simple":{"format":"%(asctime)s-%(name)s......